Fabric Spark에서 자동화된 테이블 통계 구성 및 관리

적용 대상:✅ 패브릭 데이터 엔지니어링 및 데이터 과학

Microsoft Fabric 자동화된 테이블 통계는 Spark가 델타 테이블에 대한 테이블 및 열 메트릭을 자동으로 수집하여 쿼리 실행을 최적화하는 데 도움이 됩니다.

  • 행 개수입니다.
  • 열당 Null 개수입니다.
  • 각 열의 최소값 및 최대값입니다.
  • 각 열의 고유 값 개수입니다.
  • 평균 및 최대 열 길이.

기본적으로 이러한 확장된 통계는 Fabric에서 델타 테이블의 처음 32개 열(중첩 열 포함)에 대해 수집됩니다. 이 데이터는 Spark의 CBO(비용 기반 최적화 프로그램)가 조인, 필터, 집계 및 파티션 정리에 대한 계획을 개선하는 데 도움이 됩니다.

따라서 많은 워크로드가 수동 통계 유지 관리가 적어 쿼리 대기 시간 및 컴퓨팅 사용량을 줄일 수 있습니다.

테이블 최적화 전략에 대한 워크로드 간 지침은 워크로드 간 테이블 유지 관리 및 최적화를 참조하세요.

주요 이점

자동화된 통계는 다음과 같은 이점을 제공합니다.

  • Fabric의 델타 테이블에 대해 자동으로 사용하도록 설정됩니다.
  • 일반적인 분석 패턴에 대한 쿼리 계획 품질을 향상시킵니다.
  • 반복되는 수동 통계 수집의 필요성을 줄입니다.
  • 데이터 파일 bloat을 방지하기 위해 테이블 데이터 파일 외부에 통계를 저장합니다.

작동 방식

Fabric Spark는 쓰기 시간에 확장된 통계를 수집하고 계획 중에 사용합니다.

컬렉션 범위 및 동작:

  • 통계는 쓰기 시간에 수집됩니다.
  • 컬렉션은 처음 32개 열(중첩 열 포함)을 대상으로 합니다.
  • 테이블 속성은 세션 수준 동작을 재정의할 수 있습니다.
  • 구성은 Spark가 최적화 도구에 통계를 삽입하는지 여부를 제어합니다.

이러한 메트릭은 Spark가 더 나은 조인 전략을 선택하고 파티션 정리를 개선하며 집계 계획을 최적화하는 데 도움이 됩니다.

통계 수집 사용 또는 사용 안 함

세션 구성(작업 영역 또는 Notebook 범위) 또는 테이블 속성(테이블별 범위)을 사용합니다.

세션 구성

세션 수준에서 확장 통계 수집 및 최적화 프로그램 주입을 사용하거나 사용하지 않도록 설정할 수 있습니다.

이러한 설정은 Spark SQL, PySpark 또는 Scala Spark를 통해 적용할 수 있습니다.

다음 Spark SQL 문들을 실행하여 컬렉션 및 옵티마이저 주입을 활성화하세요:

SET spark.microsoft.delta.stats.collect.extended=true;
SET spark.microsoft.delta.stats.injection.enabled=true;

두 가지 설정을 비활성화하려면, 같은 명령어를 값을 로 설정 false하여 사용합니다.

비고

델타 로그 통계 수집(spark.databricks.delta.stats.collect)도 사용하도록 설정해야 합니다(기본값: true).

Important

테이블에서 삭제 벡터를 사용하도록 설정하는 경우 해당 테이블에 대한 통계 주입을 사용하지 않도록 설정합니다. 자주 업데이트하거나 삭제하는 삭제 벡터를 사용하는 테이블에서 확장된 통계가 부정확해지고 Spark가 테이블 크기를 과소평가할 수 있습니다. 이 경우 최적화 프로그램에서 적절하지 않은 브로드캐스트 조인을 선택하면 쿼리가 실패할 수 있습니다. 이 동작을 방지하려면 최적화 프로그램에서 삽입된 통계를 사용하지 않도록 통계 주입을 사용하지 않도록 설정합니다.

  • 세션 범위: spark.microsoft.delta.stats.injection.enabled을(를) false(으)로 설정합니다.
  • 테이블 범위: delta.stats.extended.inject테이블 속성을 false(으)로 설정합니다.

통계 수집을 사용하도록 설정할 수 있습니다. 삭제 벡터를 사용하는 테이블의 경우 최적화 프로그램에서만 삽입을 사용하지 않도록 설정합니다.

정기적인 테이블 관리 전략이 이 위험을 줄입니다. OPTIMIZE 삭제 벡터로 참조된 행이 5% 이상 있는 파일을 자동으로 삭제하며, REORG TABLE ... APPLY (PURGE) 그 임계값 이하로 다시 쓰도록 강제할 수 있습니다. 확장 통계는 쓰기 시점에 수집되기 때문에, 재작성은 영향을 받는 파일에 대한 통계를 새로고침합니다. 자주 업데이트되거나 삭제되는 테이블의 경우, 유지보수 주기 사이에 인젝션을 비활성화하세요.

테이블 속성(세션 구성 재정의)

테이블 속성을 사용하면 세션 설정을 재정의하여 개별 테이블의 통계 컬렉션을 제어할 수 있습니다.

테이블에서 활성화:

ALTER TABLE tableName
SET TBLPROPERTIES(
    'delta.stats.extended.collect' = 'true',
    'delta.stats.extended.inject' = 'true'
)

테이블 속성 중 하나를 비활성화하려면 값을 로 false설정하세요.

테이블 만들기 기본 동작

새 테이블을 만들 때 확장 통계 테이블 속성의 자동 스탬핑을 사용하지 않도록 설정하려면 이 세션 수준 설정을 사용합니다.

다음 Spark SQL 문을 사용하여 테이블을 만들 때 자동 설정을 사용하지 않도록 설정합니다.

SET spark.microsoft.delta.stats.collect.extended.property.setAtTableCreation=false;

통계 확인

Spark API를 사용하여 최적화된 쿼리 계획에 제공되는 통계를 확인할 수 있습니다. 이 API들은 Spark 카탈로그 통계를 포함한 모든 출처에서 일반 플랜 통계를 반환합니다. 결과는 Fabric의 확장 통계가 테이블에 수집되었다는 것을 확인하지 않습니다.

행 수 및 테이블 크기 확인(Scala 예제):

println(spark.read.table("tableName").queryExecution.optimizedPlan.stats)

자세한 열 통계를 확인합니다.

val stats = spark.read.table("tableName").queryExecution.optimizedPlan.stats

stats.attributeStats.foreach { case (attrName, colStat) =>
    println(s"colName: $attrName distinctCount: ${colStat.distinctCount} min: ${colStat.min} max: ${colStat.max} nullCount: ${colStat.nullCount} avgLen: ${colStat.avgLen} maxLen: ${colStat.maxLen}")
}

통계 다시 계산

스키마 변경 또는 부분 업데이트 후에 통계가 오래될 수 있습니다. 다음 방법 중 하나를 사용하여 다시 계산합니다.

테이블을 다시 작성합니다(참고: 기록을 다시 설정합니다.)

spark.read.table("targetTable").write.partitionBy("partCol").mode("overwrite").saveAsTable("targetTable")

권장 방법(패브릭 Spark >= 3.2.0.19):

from pyspark.sql.delta import StatisticsStore

StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

스키마가 변경될 경우(예: 열을 추가하거나 삭제), 재계산 전에 이전 통계를 제거하세요:

from pyspark.sql.delta import StatisticsStore

StatisticsStore.removeStatisticsData(spark, "testTable1")
StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

ANALYZE TABLE 사용

모든 열에 걸친 Spark 카탈로그 통계를 계산하는 데 사용 ANALYZE TABLE 하세요. 이 명령어는 자동 테이블 통계가 저장한 확장 통계를 다시 계산하지 않습니다. 이 통계를 다시 계산하려면 를 사용 StatisticsStore.recomputeStatisticsWithCompaction하세요.

명령 실행:

다음 Spark SQL 문을 실행합니다.

ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS

카탈로그 통계 주입 가능 설정:

이 Spark SQL 문장을 사용하여 카탈로그 통계 주입을 활성화하세요:

SET spark.microsoft.delta.stats.injection.catalog.enabled=true;

카탈로그 통계 주입을 비활성화하려면 같은 설정을 값을 로 설정 false하여 사용하세요.

제한점

적절하게 계획할 수 있도록 패브릭의 자동화된 통계의 현재 제한 사항을 이해하는 것이 중요합니다.

  • 통계는 쓰기 시간에만 수집됩니다.
  • 다른 엔진의 업데이트는 자동으로 집계되지 않습니다.
  • 처음 32개 열만 포함됩니다(중첩 열 포함).
  • 삭제 및 업데이트는 통계를 부실하게 만들 수 있습니다. 삭제 벡터를 사용하는 테이블의 경우, OPTIMIZE 또는 REORG TABLE ... APPLY (PURGE) 정기 유지 관리는 영향을 받는 파일을 다시 기록하고 해당 통계를 갱신합니다. 자주 업데이트되거나 삭제되는 테이블의 유지보수 주기 사이에 통계 주입을 비활성화하세요.
  • 다시 계산하려면 다시 쓰기 또는 통계 API 작업이 필요합니다.
  • 통계 주입은 중첩 열에 적용되지 않습니다.
  • 일부 워크로드에서는 부실 또는 불완전한 통계로 인해 회귀가 발생할 수 있습니다.
  • ANALYZE TABLE 지원은 .로 제한됩니다 FOR ALL COLUMNS.
  • 열 순서 지정 또는 구성을 변경하려면 전체 새로 고침이 필요할 수 있습니다.