Optymalizator oparty na kosztach
Usługa Spark SQL może używać optymalizatora opartego na kosztach (CBO), aby ulepszyć plany zapytań. Jest to szczególnie przydatne w przypadku zapytań z wieloma sprzężeniami. Aby to zadziałało, ważne jest zbieranie statystyk tabel i kolumn i aktualizowanie ich.
Zbieranie statystyk
Aby uzyskać pełną korzyść z CBO, ważne jest zebranie statystyk kolumn i statystyk tabeli. Możesz użyć ANALYZE TABLE
polecenia , aby ręcznie zebrać statystyki.
Napiwek
Aby zachować aktualność statystyk, uruchom polecenie ANALYZE TABLE
po zapisaniu w tabeli.
Korzystanie z polecenia ANALYZE
Ważne
Optymalizacja predykcyjna za pomocą ANALYZE
programu jest dostępna w publicznej wersji zapoznawczej. Obejmuje ona inteligentne zbieranie statystyk podczas zapisu. Użyj tego formularza , aby zarejestrować się w publicznej wersji zapoznawczej.
Optymalizacja predykcyjna automatycznie uruchamia ANALYZE
polecenie służące do zbierania statystyk w tabelach zarządzanych przez wykaz aparatu Unity. Usługa Databricks zaleca włączenie optymalizacji predykcyjnej dla wszystkich tabel zarządzanych przez wykaz aparatu Unity, aby uprościć konserwację danych i zmniejszyć koszty magazynowania. Zobacz ANALIZOWANIE TABELI.
Weryfikowanie planów zapytań
Istnieje kilka sposobów weryfikacji planu zapytania.
EXPLAIN
polecenie
Aby sprawdzić, czy plan używa statystyk, użyj poleceń SQL
- Databricks Runtime 7.x i nowsze: EXPLAIN
Jeśli brakuje statystyk, plan zapytania może nie być optymalny.
== 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)
Ważne
Statystyka rowCount
jest szczególnie ważna w przypadku zapytań z wieloma sprzężeniami. Jeśli rowCount
brakuje, oznacza to, że nie ma wystarczającej ilości informacji, aby je obliczyć (oznacza to, że niektóre wymagane kolumny nie mają statystyk).
Interfejs użytkownika platformy Spark SQL
Użyj strony interfejsu użytkownika usługi Spark SQL, aby wyświetlić wykonany plan i dokładność statystyk.
Linia, taka jak rows output: 2,451,005 est: N/A
oznacza, że ten operator generuje około 2 mln wierszy i nie było dostępnych statystyk.
Linia taka jak rows output: 2,451,005 est: 1616404 (1X)
oznacza, że ten operator generuje około 2 mln wierszy, podczas gdy szacowanie wynosiło około 1,6 mln, a współczynnik błędu szacowania wynosił 1.
Wiersz taki jak rows output: 2,451,005 est: 2626656323
oznacza, że ten operator generuje około 2 mln wierszy, podczas gdy szacowanie wynosiło 2B wierszy, więc współczynnik błędu szacowania wynosił 1000.
Wyłączanie optymalizatora opartego na kosztach
Funkcja CBO jest domyślnie włączona. Należy wyłączyć CBO, zmieniając flagę spark.sql.cbo.enabled
.
spark.conf.set("spark.sql.cbo.enabled", false)