비용 기반 최적화 프로그램
Spark SQL은 CBO(비용 기반 최적화 프로그램)를 사용하여 쿼리 계획을 개선할 수 있습니다. 이는 여러 조인이 있는 쿼리에 특히 유용합니다. 이 작업을 수행하려면 테이블 및 열 통계를 수집하고 최신 상태로 유지하는 것이 중요합니다.
통계 수집
CBO를 최대한 활용하려면 열 통계 및 테이블 통계를 모두 수집하는 것이 중요합니다. 이 ANALYZE TABLE
명령을 사용하여 통계를 수동으로 수집할 수 있습니다.
팁
통계를 최신 상태로 유지하려면 테이블에 쓴 후 실행 ANALYZE TABLE
합니다.
ANALYZE
사용
Important
예측 최적화 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)