비용 기반 최적화 프로그램
Spark SQL은 CBO(비용 기반 최적화 프로그램)를 사용하여 쿼리 계획을 개선할 수 있습니다. 이는 여러 조인이 있는 쿼리에 특히 유용합니다. 이렇게 하려면 테이블 및 열 통계를 수집하고 최신 상태로 유지하는 것이 중요합니다.
통계 수집
CBO의 모든 이점을 얻으려면 열 통계 및 테이블 통계모두 수집하는 것이 중요합니다. 이 ANALYZE TABLE
명령을 사용하여 통계를 수동으로 수집할 수 있습니다.
팁
통계 값을 최신 상태 up-to로 유지하려면 테이블에 기록한 후 ANALYZE TABLE
을 실행하세요.
ANALYZE
사용
예측 최적화는 Unity 카탈로그 관리 테이블에서 통계를 수집하는 ANALYZE
명령어를 자동으로 실행합니다. Databricks는 데이터 유지 관리를 간소화하고 스토리지 비용을 절감하기 위해 모든 Unity 카탈로그 관리 테이블에 대해 예측 최적화를 사용하도록 설정하는 것이 좋습니다.
ANALYZE TABLE을 참조하세요.
쿼리 계획 확인
쿼리 계획을 확인하는 방법에는 여러 가지가 있습니다.
EXPLAIN
명령
계획에서 통계를 사용하는지 확인하려면 SQL 명령을 사용합니다.
- Databricks Runtime 7.x 이상: 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)
Important
rowCount
통계는 조인이 여러 개인 쿼리에 특히 중요합니다.
rowCount
누락된 경우 계산할 정보가 충분하지 않음을 의미합니다(즉, 일부 필수 열에는 통계가 없음).
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)