선택 쿼리에 대한 최적의 가져오기 크기를 확인하는 방법
JDBC에서 기본 페치 크기는 10이지만, 백만 개의 행이 있을 때는 최적의 페치 크기가 아닙니다.페치 크기가 너무 낮으면 성능이 저하되지만 페치 크기가 너무 높을 경우에도 성능이 저하된다는 것을 이해합니다.
어떻게 하면 최적의 사이즈를 찾을 수 있습니까?그리고 이것이 DB 측면에 영향을 미칩니까? 많은 메모리를 흡수합니까?
행이 크면 한 번에 가져오는 모든 행이 드라이버의 내부 버퍼에 있는 Java 힙에 저장되어야 합니다.12c에서 Oracle에는 VARCHAR(32k) 열이 있는데, 이 열 중 50개가 꽉 차면 행당 160만자가 됩니다.각 문자는 Java에서 2바이트입니다.따라서 각 행은 최대 3.2까지 소요될 수 있습니다.MB. 행을 100씩 가져오는 경우 데이터를 저장하기 위해 320MB의 힙이 필요합니다. 이는 하나의 문에 대한 것입니다.따라서 상당히 작은 행(데이터 크기가 작은)을 가져오는 쿼리의 행 프리페치 크기만 늘려야 합니다.
대부분의 경우와 마찬가지로 특정 매개 변수에 대한 최적의 크기를 찾는 방법은 매개 변수의 다른 값으로 최적화하려는 워크로드를 벤치마킹하는 것입니다.이 경우 다른 가져오기 크기 설정으로 코드를 실행하고 결과를 평가한 후 최적의 설정을 선택해야 합니다.
대부분의 경우 사람들은 100 또는 1000의 가져오기 크기를 선택하며, 이는 상당히 최적의 설정으로 판명됩니다.이 시점의 값 사이의 성능 차이는 일반적으로 매우 미미합니다. 런 간의 성능 차이는 대부분 가져오기 크기의 변경으로 인한 것이 아니라 정규 랜덤 변동의 결과라고 예상할 수 있습니다.특정 구성에서 특정 워크로드에 대한 최종 성능을 확보하려는 경우 해당 분석을 수행할 수 있습니다.하지만 대부분의 사람들은 100이나 1000이면 충분합니다.
JDBC fetch size 속성의 기본값은 드라이버별이며 Oracle 드라이버의 경우 10입니다.
일부 쿼리의 경우 일부 쿼리의 경우에는 페치 크기가 더 커야 합니다.
전체 프로젝트에 대한 글로벌 가져오기 크기를 설정하고 크기가 커야 하는 일부 개별 쿼리에 대해 덮어쓰는 것이 좋습니다.
이 기사를 보십시오.
http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html
다른 접근 방식을 사용하여 신중하게 선택한 쿼리에 대해 전체적으로 가져오기 크기를 설정하고 덮어쓰는 방법에 대한 설명이 있습니다.최대 절전 모드, JPA, Spring jdbc 템플릿 또는 코어 jdbc API.오라클 데이터베이스에 대한 간단한 벤치마크도 제공합니다.
경험에 비추어 볼 때 다음을 수행할 수 있습니다.
- fetch size를 글로벌 설정으로 50 - 100으로 설정
- 개별 쿼리에 대해 fetch size를 100 - 500(또는 그 이상)으로 설정
JDBC의 기본 프리페치 크기는 10입니다.JDBC Javadoc에서 OracleConnection.getDefaultRowPrefetch를 확인하십시오.
tl;dr
선택 쿼리에 대한 최적의 가져오기 크기를 확인하는 방법
최대 합니다.
bytesInMemory
)4Mb, 8Mb 또는 16Mb가 좋은 시작입니다.
의 각 하고 그합니다.
bytesPerRow
)...
다음 공식을 사용합니다.
fetch_size = bytesInMemory / bytesPerRow
예측 가능한 값을 갖도록 공식 결과를 조정할 수 있습니다.
단어는 지막단어, 다단로테트로 .bytesInMemory
값 및/또는 다른 쿼리를 사용하여 응용 프로그램의 결과를 확인할 수 있습니다.
위의 응답은 (이 글을 쓰는 다락방의) Apache MetaModel 프로젝트에서 영감을 받았습니다.그들은 이 정확한 질문에 대한 답을 찾았습니다.이를 위해 최대 메모리 양이 주어진 페치 크기를 계산하는 클래스를 만들었습니다.이 클래스는 Oracle JDBC 드라이버가 메모리를 관리하는 방법을 설명하는 Oracle 백서를 기반으로 합니다.
는 최대 양(량)으로됩니다.bytesInMemory
. fetch 는 fetch 사이즈입니다.Query
(아파치 메타모델 클래 그Query
는 바이트 데 .bytesPerRow
행이 가질 수 일반적인 쿼리 결과 행이 가질 수 있습니다.그런 다음 다음 다음 공식을 사용하여 가져오기 크기가 계산됩니다.
fetch_size = bytesInMemory / bytesPerRow
도 이됩니다.[1,25000]
은 른다 조은 계중수 에니다됩행산의 중에 .bytesPerRow
하지만 여기에는 너무 많은 세부사항이 있습니다.
이 클래스의 이름은 FetchSizeCalculator입니다.링크는 전체 소스 코드로 연결됩니다.
언급URL : https://stackoverflow.com/questions/30730383/how-to-figure-out-the-optimal-fetch-size-for-the-select-query
'programing' 카테고리의 다른 글
도커 합성 및 도커 기계를 사용하여 mongoDB용 외부 볼륨을 탑재하는 방법 (0) | 2023.07.05 |
---|---|
ID 열이 있는 SqlBulkCopy 삽입 (0) | 2023.07.05 |
R 데이터 프레임에서 'Inf' 값 정리 (0) | 2023.06.30 |
데이터베이스에서 문자열 일부 검색 및 바꾸기 (0) | 2023.06.30 |
일부 사용자 지정 예약 제품 유형에 대해 "세금 제로" 요금 설정 (0) | 2023.06.30 |