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