Udostępnij za pośrednictwem


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 ANALYZEpolecenie 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.

Brak oszacowania

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.

Dobre oszacowanie

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.

Nieprawidłowe oszacowanie

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)