9.6. 통계와 실행 계획
더 자세한 내용은 개발자 매뉴얼의 3.6절 쿼리 튜닝과 개발자 매뉴얼의 3.7절 실행 계획을 참조합니다.
통계 수집 빈도와 실행 계획 재계획은 아래 절에서 설명합니다.
9.6.1. 통계
Neo4j에 저장된 통계 정보는 다음과 같다:
- 특정 레이블의 노드의 수.
- 종류별 관계의 수.
- 특정 레이블의 노드의 종료 노드와 시작 노드, 종류별 관계의 수.
- 인덱스별 선택도(selectivity).
Neo4j는 두 가지 방법으로 통계를 최신 상태로 유지합니다. 레이블과 관계의 갯수(count)는 노드에 레이블을 설정하거나, 제거할 때마다 숫자가 업데이트됩니다. 그러나 인덱스의 선택도(selectivity)를 생성하려면, Neo4j가 전체 인덱스를 스캔해야 합니다. 이것은 매우 많은 시간이 걸리는 작업이므로, 인덱스의 충분한 데이터가 변경되면 백그라운드로 이 값이 수집됩니다.
다음 설정을 사용하면 통계를 자동으로 수집할지 여부와 비율을 제어 할 수 있습니다:
| 매개 변수 명 | 디폴트 값 | 설명 |
|---|---|---|
| dbms.index_sampling.background_enabled | 참(true) | 인덱스가 충분히 변경되었을 때, 인덱스를 자동으로 다시 샘플링할지 여부를 제어합니다. Cypher 쿼리 플래너는 정확한 통계를 기반으로 효율적인 계획을 수립하므로 데이터베이스가 커짐에 따라 최신 상태로 유지하는 것이 중요합니다. |
| dbms.index_sampling.update_percentage | 5 | 새 샘플링 실행이 트리거되기 전에 업데이트해야 하는 인덱스의 비율을 제어합니다. |
다음의 내장(built-in) 프로시저를 사용하여 인덱스 샘플링을 수동 트리거 할 수 있습니다:
db.resampleIndex()
인덱스 샘플링을 트리거.
db.resampleOutdatedIndexes()
모든 오래된 인덱스의 리샘플링을 트리거.
예제 9.7. 수동 인덱스 리샘플링 트리거
다음 예제는 db.resampleIndex()를 호출하여, 레이블 [Person]과 속성 [name]에 있는 인덱스의 리샘플링을 트리거하는 방법을 보여줍니다:
CALL db.resampleIndex(":Person(name)");
다음 예제는 모든 오래된 인덱스의 리샘플링을 트리거하기 위해 db.resampleOutdatedIndexes()를 호출하는 방법을 보여줍니다:
CALL db.resampleOutdatedIndexes();
9.6.2. 실행 계획
실행 계획은 캐시되며, 계획 생성에 사용된 통계 정보가 변경 될 때까지 재-계획되지 않습니다. 다음 설정을 사용하면 데이터베이스의 업데이트시, 재계획을 적용하는 방법을 제어 할 수 있습니다:
매개변수 명 | 기본값 | 설명 |
---|---|---|
cypher.statistics_divergence_threshold | 0.75 | 이 임계값(threshold)은 실행 계획을 무효화할 것인지 결정합니다. 계획 생성에 사용된 기본 통계가이 임계값(threshold)보다 많이 변경된 경우, 계획은 부실한 것으로 간주되어 다시 재계획됩니다. 변경 값은 abs(a-b)/max(a,b)로 계산됩니다. 즉, 0.75 값은 재계획이 발생하기 전에 데이터베이스 크기가 약 4배가 되어야 함을 의미합니다. 값 0은 가능한한 빠른 재계획을 의미하며, 가장 빠른 재계획은 기본값이 10s인 매개 변수 cypher.min_replan_interval에 의해 정의됩니다. 이 간격 후에, 분기되는 임계값(divergence threshold)은 서서히 감소하기 시작하여 약 7시간 후에 10%에 도달합니다. 이렇게하면 변경이 매우 큰 경우가 아니면 자주 재계획되지 않고, 장기간 실행되는 데이터베이스는 보통 수준의 변경에도 쿼리를 다시 재계획됩니다. |