비용 기반 최적화 프로그램

Spark SQL은 효율적인 쿼리 계획을 선택하기 위해 비용 기반 최적화기(CBO)를 사용합니다. CBO는 테이블 크기와 데이터 분포 같은 테이블 및 열 통계를 사용하여 대체 플랜의 비용을 추정하고 가장 낮은 예상 비용의 플랜을 선택합니다. 이 점은 여러 조인이 있는 쿼리에서 가장 중요한데, 나쁜 계획이 좋은 계획보다 수백 배, 수천 배 더 느릴 수 있기 때문입니다.

CBO는 기본적으로 활성화되어 있지만, 통계에 의존합니다. 통계가 누락되거나 오래되었으면, CBO는 비효율적인 조인 순서나 조인 전략을 선택할 수 있습니다. 표와 열의 통계를 수집하고 최신 상태로 유지하세요. 통계 수집을 참조하세요.

모범 사례

CBO가 효율적인 쿼리 계획을 선택하는 데 도움이 되려면 다음 관행을 따르세요:

  • 다중 조인 쿼리에 사용되는 테이블의 통계를 수집합니다. Unity Catalog 관리 테이블에서 예측 최적화를 사용하면 통계가 자동으로 수집됩니다. 통계 수집을 참조하세요.
  • 멀티 조인 쿼리가 예상보다 느릴 때는 쿼리 계획을 확인하세요. 누락되거나 부정확한 통계가 흔한 원인입니다. 쿼리 계획 검증을 참조하세요.
  • 통계가 초래하는 특정 쿼리 계획 문제를 완화하기 위해서만 통계를 삭제하거나 CBO를 비활성화하세요. 비용 기반 옵티마이저 비활성화를 참조하세요.

통계 수집

CBO의 모든 이점을 얻으려면 열 통계 및 테이블 통계모두 수집하는 것이 중요합니다. 이 ANALYZE TABLE 명령을 사용하여 통계를 수동으로 수집할 수 있습니다.

팁

통계 값을 최신 상태 up-to로 유지하려면 테이블에 기록한 후 ANALYZE TABLE을 실행하세요.

ANALYZE 사용

예측 최적화는 Unity 카탈로그 관리 테이블에서 통계를 수집하는 ANALYZE명령어를 자동으로 실행합니다. Databricks는 데이터 유지 관리를 간소화하고 스토리지 비용을 절감하기 위해 모든 Unity 카탈로그 관리 테이블에 대해 예측 최적화를 사용하도록 설정하는 것이 좋습니다. 다음을 참조하세요 ANALYZE TABLE . 컴퓨팅 통계.

최적화 프로그램 통계를 제거하여 최적화 프로그램에서 더 이상 사용하지 않도록 할 수 있습니다(예: 통계로 인한 계획 문제 완화). ANALYZE TABLE … DROP STATISTICS를 참조하세요.

쿼리 계획 확인

쿼리 계획을 확인하는 방법에는 여러 가지가 있습니다.

EXPLAIN 명령

계획에서 통계를 사용하는지 확인하려면 SQL 명령을 EXPLAIN사용합니다.

통계가 누락된 경우 쿼리 계획이 최적이 아닐 수 있습니다.

== Optimized Logical Plan ==
Aggregate [s_store_sk], [s_store_sk, count(1) AS count(1)L], Statistics(sizeInBytes=20.0 B, rowCount=1, hints=none)
+- Project [s_store_sk], Statistics(sizeInBytes=18.5 MB, rowCount=1.62E+6, hints=none)
   +- Join Inner, (d_date_sk = ss_sold_date_sk), Statistics(sizeInBytes=30.8 MB, rowCount=1.62E+6, hints=none)
      :- Project [ss_sold_date_sk, s_store_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
      :  +- Join Inner, (s_store_sk = ss_store_sk), Statistics(sizeInBytes=48.9 GB, rowCount=2.63E+9, hints=none)
      :     :- Project [ss_store_sk, ss_sold_date_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
      :     :  +- Filter (isnotnull(ss_store_sk) && isnotnull(ss_sold_date_sk)), Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
      :     :     +- Relation[ss_store_sk,ss_sold_date_sk] parquet, Statistics(sizeInBytes=134.6 GB, rowCount=2.88E+9, hints=none)
      :     +- Project [s_store_sk], Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
      :        +- Filter isnotnull(s_store_sk), Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
      :           +- Relation[s_store_sk] parquet, Statistics(sizeInBytes=88.0 KB, rowCount=1.00E+3, hints=none)
      +- Project [d_date_sk], Statistics(sizeInBytes=12.0 B, rowCount=1, hints=none)
         +- Filter ((((isnotnull(d_year) && isnotnull(d_date)) && (d_year = 2000)) && (d_date = 2000-12-31)) && isnotnull(d_date_sk)), Statistics(sizeInBytes=38.0 B, rowCount=1, hints=none)
            +- Relation[d_date_sk,d_date,d_year] parquet, Statistics(sizeInBytes=1786.7 KB, rowCount=7.30E+4, hints=none)

중요한

rowCount 통계는 여러 개의 조인이 있는 쿼리에 특히 중요합니다. rowCount 누락된 경우 계산할 정보가 충분하지 않음을 의미합니다(즉, 일부 필수 열에는 통계가 없음).

Databricks Runtime 16.0 이상에서는 EXPLAIN 명령의 출력에 통계가 누락되었거나 부분적이거나 전체인 참조 테이블이 나열됩니다. 예를 들어:

== Optimizer Statistics (table names per statistics state) ==
  missing = date_dim, store
  partial =
  full    = store_sales
Corrective actions: consider running the following command on all tables with missing or partial statistics
  ANALYZE TABLE <table-name> COMPUTE STATISTICS FOR ALL COLUMNS

Spark SQL UI

Spark SQL UI 페이지를 사용하여 실행된 계획 및 통계의 정확도를 확인합니다.

누락된 예상

rows output: 2,451,005 est: N/A와 같은 행은 이 연산자가 약 2백만 개의 행을 생성하고 사용 가능한 통계가 없음을 의미합니다.

양호한 예상

이러한 rows output: 2,451,005 est: 1616404 (1X) 줄은 이 연산자가 약 2백만 개의 행을 생성한다는 것을 의미하며, 추정치는 약 160만 개이고 추정 오차 인자는 1입니다.

잘못된 예상

rows output: 2,451,005 est: 2626656323과 같은 행은 이 연산자가 약 2백만 개의 행을 생성하는 반면 추정치는 20억 개이므로 추정 오류 계수는 1000임을 의미합니다.

비용 기반 옵티마이저를 비활성화하세요

CBO는 기본적으로 사용하도록 설정됩니다. spark.sql.cbo.enabled 플래그를 변경하여 CBO를 사용하지 않도록 설정합니다.

spark.conf.set("spark.sql.cbo.enabled", false)