Поделиться через


Оптимизатор на основе затрат

В Spark SQL доступен оптимизатор на основе затрат, с помощью которого можно улучшить планы запросов. Это особенно полезно для запросов с несколькими объединениями. Для этого важно собрать статистику таблиц и столбцов и сохранить их в актуальном состоянии.

Сбор статистики

Чтобы получить полную выгоду от CBO, важно собрать статистику столбцов и табличную статистику . Вы можете использовать ANALYZE TABLE команду для сбора статистики вручную.

Совет

Чтобы сохранить статистику актуальной, запустите ANALYZE TABLE после записи в таблицу.

Используйте ANALYZE

Предсказательная оптимизация автоматически выполняет команду ANALYZEдля сбора статистики в таблицах под управлением каталога Unity. 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)

Внимание

Параметр статистики rowCount особенно важен для запросов с несколькими объединениями. Если rowCount отсутствует, это означает, что нет достаточной информации для вычисления (т. е. некоторые обязательные столбцы не имеют статистики).

Пользовательский интерфейс Spark SQL

На странице пользовательского интерфейса Spark SQL можно просмотреть выполненный план и точность статистики.

Недостающая оценка

Строка rows output: 2,451,005 est: N/A означает, что этот оператор производит приблизительно 2 млн строк, и статистики не было в наличии.

Хорошая оценка

Строка rows output: 2,451,005 est: 1616404 (1X) означает, что этот оператор производит около 2 млн строк, хотя оценка составляла примерно 1,6 млн, а коэффициент ошибки оценки был равен 1.

Плохая оценка

Строка rows output: 2,451,005 est: 2626656323 означает, что этот оператор возвращает примерно 2 млн строк, в то время как оценка составляла 2 млрд строк, таким образом, фактор ошибки оценки составил 1000.

Отключение оптимизатора на основе затрат

CBO включен по умолчанию. Чтобы отключить CBO, измените флаг spark.sql.cbo.enabled.

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