개요
인덱스는 데이타를 읽어 정렬하고 저정하는 과정을 가집니다.
그래서 인덱스를 병렬로 동작시키는건 과도한 디스크 IO나 버퍼미스 를 발생시켜 오히려 성능이 떨어집니다.
아래와 같이 프로퍼티를 설정해서 IO 와 버퍼 미스를 줄이고 정렬과정을 최적화 해서 대용량 디스크 인덱스 빌드 시간을 단축시킬수 있습니다.
해결책
버전 6.5.1~7.1.0
1.BUFFER_AREA_SIZE(단위 bytes) = (클수록 좋습니다.)
2.SORT_AREA_SIZE(단위 bytes) = (장비 물리코어 수 * 20MB)
3.DISK_INDEX_BUILD_MERGE_PAGE_COUNT(단위 page수) = (BUFFER_AREA_SIZE의 1% 추천하지만 DISK_INDEX_BUILD_MERGE_PAGE_COUNT(아래 고려사항3번)을 고려해야 합니다.)
4.INDEX_BUILD_THREAD_COUNT(core수) = (장비 물리코어 수)
고려사항
1.BUFFER_AREA_SIZE
- 값이 클수록 STARTUP 시간이 더 걸립니다.
2.SORT_AREA_SIZE
- 인덱스 1개 빌드시 최소 SORT_AREA_SIZE 크기이상의 메모리를 사용합니다. 만약, 병렬로 2개를 빌드하면 SORT_AREA_SIZE * 2배의 메모리량이 사용됩니다.
SORT_AREA_SIZE는 디스크 템프테이블에서도 공유하는 프로퍼티로, 변경 시 디스크 템프테이블의 동작에 영향이 있습니다.
3.DISK_INDEX_BUILD_MERGE_PAGE_COUNT
- 프로퍼티의 단위는 페이지 수이고, BUFFER_AREA_SIZE 프로퍼티 단위는 bytes 입니다.
- 프로퍼티의 값이 크고 인덱스 크기가 작을경우, 오히려 성능이 떨어지는 현상이 있을수 있습니다.
- 아래의 조건을 만족하는 경우 인덱스 빌드 성능이 떨어질수 있습니다.
DISK_INDEX_BUILD_MERGE_PAGE_COUNT > ( 인덱스키길이 * RECORD수 ) / SORT_AREA_SIZE
버전 7.3.0 ~
1.BUFFER_AREA_SIZE(단위 bytes) = (클수록 좋습니다.)
2.DISK_INDEX_BUILD_SORT_AREA_SIZE(단위 bytes) = (장비물리코어수 * 20MB)
3.DISK_INDEX_BUILD_MERGE_PAGE_COUNT(단위 page수) = (BUFFER_AREA_SIZE의 1%)
4.INDEX_BUILD_THREAD_COUNT(core수) = (장비 물리코어수)
고려사항
1.BUFFER_AREA_SIZE
- 값이 클수록 STARTUP 시간이 더 걸립니다.
2.DISK_INDEX_BUILD_SORT_AREA_SIZE
- 인덱스 1개 빌드시 최소 DISK_INDEX_BUILD_SORT_AREA_SIZE 크기이상의 메모리를 사용합니다. 만약, 병렬로 2개를 빌드하면 DISK_INDEX_BUILD_SORT_AREA_SIZE * 2배의 메모리량이 사용됩니다.
(SORT_AREA_SIZE를 사용하지 않습니다)
3.DISK_INDEX_BUILD_MERGE_PAGE_COUNT
- 프로퍼티의 단위는 페이지 수이고, BUFFER_AREA_SIZE 프로퍼티 단위는 bytes 입니다.
- 아래 문제는 7.3.0 이상 에서는 발생하지 않습니다.
프로퍼티의 값이 크고 인덱스 크기가 작을경우, 오히려 성능이 떨어지는 현상이 있을수 있습니다.- 아래의 조건을 만족하는 경우 인덱스 빌드 성능이 떨어질수 있습니다.DISK_INDEX_BUILD_MERGE_PAGE_COUNT > ( 인덱스키길이 * RECORD수 ) / SORT_AREA_SIZE