벡터 색인 측정항목

이 페이지에는 AlloyDB Omni에서 생성하는 벡터 색인과 관련된 측정항목이 나와 있습니다. alloydb_scann 확장 프로그램을 설치할 때 사용할 수 있는 pg_stat_ann_indexes 보기를 사용하여 이러한 측정항목을 볼 수 있습니다.

측정항목을 보는 방법에 관한 자세한 내용은 벡터 색인 측정항목 보기를 참고하세요.

사용성 측정항목

사용성 측정항목에는 색인 구성, 색인 스캔 수와 같은 측정항목을 사용하여 색인 사용 상태를 파악하는 데 도움이 되는 측정항목이 포함됩니다.

측정항목 이름 데이터 유형 설명
relid OID 벡터 색인이 포함된 테이블의 고유 식별자
indexrelid OID 벡터 색인의 고유 식별자
schemaname NAME 색인을 소유한 스키마의 이름
relname NAME 색인이 포함된 테이블의 이름
indexrelname NAME 색인의 이름
indextype NAME 색인의 유형입니다. 이 값은 항상 scann로 설정됩니다.
indexconfig TEXT[] 색인을 만들 때 색인에 정의된 구성(예: 리프 수 및 큐란터)
indexsize TEXT 색인 크기
indexscan BIGINT 색인에서 시작된 색인 스캔 수

조정 측정항목

조정 측정항목은 현재 색인 최적화에 대한 유용한 정보를 제공하므로 쿼리 성능을 개선하기 위한 추천을 적용할 수 있습니다.

측정항목 이름 데이터 유형 설명
insertcount BIGINT 색인의 삽입 작업 수입니다. 이 측정항목에는 색인이 생성되기 전에 존재했던 행의 수도 포함됩니다.
updatecount BIGINT 색인의 업데이트 작업 수입니다. 이 측정항목에는 HOT 업데이트가 고려되지 않습니다.
deletecount BIGINT 색인의 삭제 작업 수입니다.
distribution JSONB 색인의 모든 파티션에 걸친 벡터 분포입니다.

다음 필드에는 분포가 표시됩니다.
  • maximum (INT8): 모든 파티션의 최대 벡터 수입니다.
  • minimum (INT8): 모든 파티션의 최소 벡터 수입니다.
  • average (FLOAT) : 모든 파티션의 평균 벡터 수입니다.
  • outliers (INT8[]): 모든 파티션에서 상위 외부값입니다. 이 값은 상위 20개 이상값을 보여줍니다.

참고: K-means 클러스터링 알고리즘의 고유한 특성으로 인해 색인이 처음 생성될 때도 파티션 전반에서 벡터의 분포에는 항상 어느 정도의 변동이 있습니다.
distributionpercentile JSONB 벡터 색인 분포를 사용하면 ScaNN 색인의 파티션 간에 벡터가 분포하는 방식을 파악할 수 있습니다. 파티션은 색인 생성 중에 정의된 num_leaves 값을 기반으로 생성됩니다.

벡터 색인 분포에는 10, 25, 50, 75, 90, 95, 99, 100번째 백분위수의 버킷이 포함됩니다. 각 버킷에는 다음 값이 포함됩니다.
  • 지정된 백분위수에 해당하는 파티션에 있는 벡터 수입니다.
  • 현재 및 이전 백분위수로 정의된 범위 내에 벡터가 있는 파티션 수입니다.

참고: K-means 클러스터링 알고리즘의 고유한 특성으로 인해 색인이 처음 생성될 때도 파티션 전반에서 벡터 분포에 항상 어느 정도의 변동이 있습니다.

측정항목을 기반으로 한 조정 권장사항

변형
insertcount, updatecount, deletecount 측정항목은 함께 색인의 벡터의 변경사항 또는 변이를 보여줍니다.
색인은 특정 수의 벡터와 파티션으로 생성됩니다. 벡터 색인에서 삽입, 업데이트, 삭제와 같은 작업을 실행하면 벡터가 있는 초기 파티션 세트에만 영향을 미칩니다. 따라서 각 파티션의 벡터 수는 시간이 지남에 따라 변동되며 검색 결과, QPS 또는 둘 다에 영향을 줄 수 있습니다.
시간 경과에 따라 ANN 검색 쿼리에서 QPS가 낮거나 검색 결과가 적은 등 느려짐이나 정확성 문제가 발생하는 경우 이러한 측정항목을 검토해 보세요. 총 벡터 수 대비 변형 수가 많으면 색인을 다시 생성해야 할 수 있습니다.
분포
distribution 측정항목은 모든 파티션의 벡터 분포를 보여줍니다.
색인을 만들면 특정 수의 벡터와 고정된 파티션으로 색인이 생성됩니다. 파티션 프로세스와 후속 배포는 이 고려사항에 따라 발생합니다. 벡터를 추가하면 기존 파티션 간에 파티션이 나뉘므로 색인이 생성될 때의 분포와는 다른 분포가 됩니다. 최종 배포는 모든 벡터를 동시에 고려하지 않으므로 검색 결과, QPS 또는 둘 다에 영향을 줄 수 있습니다.
응답 시간의 지연 또는 결과의 정확성 저하 (QPS 또는 재현율로 측정)와 같이 ANN 검색 쿼리의 성능이 점진적으로 저하되는 경우 이 측정항목을 확인하고 색인을 다시 생성해 보세요.
분포 백분위수
distributionpercentile 측정항목은 pg_stat_ann_indexes 뷰의 벡터 색인 분포로, ScaNN 색인의 파티션 간에 벡터가 분포하는 방식을 이해하는 데 도움이 됩니다. 파티션은 색인 생성 중에 정의된 num_leaves 값을 기반으로 생성됩니다.
num_leaves를 설정하여 초기 행 집합에 alloydb_scann 색인을 만들면 데이터 작업 (왜곡 변형)으로 인해 색인이 파티션 전체에서 벡터의 분포를 변경하거나 벡터 수가 크게 증가할 수 있습니다. 이러한 변경사항으로 인해 QPS 또는 리콜이 저하되거나 둘 다 저하될 수 있습니다. 벡터 색인 분포는 변형으로 인해 색인 분포가 변경되는 경우 신호를 줄 수 있습니다. 이 정보를 통해 색인 재생성이 필요한지 또는 검색 시간 구성을 변경하면 쿼리 성능을 개선할 수 있는지 판단할 수 있습니다.
벡터 색인에서 파티션 전체에 걸친 벡터의 분포가 완벽하게 균일한 경우는 거의 없습니다. 이러한 불균형을 비균일 분포라고 합니다. 어느 정도의 불균일성은 일반적으로 예상되는 것이며 색인을 다시 생성해야 한다는 의미는 아닙니다. 비균일 분포는 다음과 같은 특성을 갖습니다.
  • 벡터 수의 분산이 낮습니다. 분산은 다음과 같이 계산할 수 있습니다.
    $(P100(num\_vectors) - p10(num\_vectors))*(\frac{num\_leaves}{total\_num\_row})$
  • 벡터가 0인 파티션 수는 적으며 파티션의 30% 미만일 수 있습니다.
  • 파티션 수의 분산이 낮습니다.
    $ variance _{p} = abs(p_{num\_partitions} - num\_leaves * (p_{percentile} - p-1_{percentile})) $ 여기서 'p'는 벡터 색인 분포 버킷입니다.
  • 임의의 백분위수에서 벡터 수는
    $< 8 x (\frac{num\_rows\ during\ index\ creation\ time}{ num\_leaves})$

    이러한 조건이 충족되지 않으면 QPS 및 검색 결과가 얼마나 영향을 받는지에 따라 REINDEX가 필요할 수 있습니다.
다음 시나리오는 비균일 분포보다 흔하지는 않지만 발생할 수 있습니다.
  • 대략적인 균일 색인: 대부분의 파티션에 0이 아닌 벡터의 수가 같고 벡터 수의 분산이 낮은 경우 대략적인 균일 색인입니다. 각 파티션의 숫자 벡터가 index_creation_time에서 $8 * 평균 벡터$ 보다 큰 경우 REINDEX가 필요합니다.
  • 희소 색인: 파티션의 50% 이상이 비어 있는 경우에도 희소 색인이 발생합니다. 예를 들어 테이블에서 여러 개의 삭제가 발생하면 스파스 색인이 생성됩니다. 이 시나리오에서는 벡터가 소수의 파티션에 집중되어 각 파티션의 벡터 수가 증가합니다. 이 경우 색인을 삭제하고 다시 만듭니다.