Doporučení k výkonu federace Lakehouse

Tento článek obsahuje pokyny ke zlepšení výkonu dotazů Lakehouse Federation.

Kombinování více predikátů pomocí operátoru AND

Databricks Runtime se pokusí odeslat predikáty do vzdáleného databázového stroje, aby se snížil počet načtených záznamů přes síť. Pokud predikát nelze optimalizovat přiřazením k nižší úrovni zpracování, dotaz spuštěný na vzdáleném databázovém systému predikát vyloučí, takže filtrování musí být provedeno pomocí Databricks Runtime. Pokud ale určitou část filtru nelze posunout dolů, lze další části filtru přesto posunout, pokud je spojí operátor AND.

Filtrování pomocí neprosaditelného predikátu

Spuštěním následujícího dotazu v poznámkovém bloku nebo editoru dotazů Sql Databricks můžete filtrovat záznamy podle názvu pomocí výrazu ILIKE :

SELECT * FROM foreign_catalog.schema.table WHERE name ILIKE 'john'

Výraz ILIKE nelze odeslat do vzdálené databáze (například MySQL), protože neexistuje vhodný překlad. Filtrování je potřeba provést pomocí modulu Databricks Runtime.

Dotaz odeslaný do vzdálené databáze vrátí všechny záznamy:

SELECT * FROM catalog.schema.table

Filtrování s použitím prosaditelných a neprosaditelných predikátů

Spuštěním následujícího dotazu v poznámkovém bloku nebo editoru dotazů SQL Databricks můžete filtrovat záznamy podle názvu i data:

SELECT * FROM foreign_catalog.schema.table WHERE name ILIKE 'john' AND date > '2025-05-01'

Výraz ILIKE nelze odeslat do vzdálené databáze (například MySQL), protože neexistuje žádný vhodný překlad, ale porovnání kalendářních dat je možné odeslat dolů. Filtrování názvů se stále musí provádět pomocí databricks Runtime, ale porovnání kalendářních dat snižuje počet načtených záznamů.

Dotaz odeslaný do vzdálené databáze vrátí podmnožinu záznamů:

SELECT * FROM catalog.schema.table WHERE date > '2025-05-01'

Zkontrolujte, který dotaz bude spuštěn ve vzdálené databázi

Pokud chcete zjistit, který dotaz se odešle do vzdálené databáze, spusťte EXPLAIN příkaz FORMATTED .

Důležité

Skutečný dotaz se může lišit od dotazu ve výstupu EXPLAIN FORMATTED z důvodu adaptivního spuštění dotazu.

Nastavení velikosti dávek načtených ze vzdálené databáze

Ke kontrole způsobu načítání dat ze vzdálených systémů můžete nakonfigurovat následující konektory, které používají přenosový protokol JDBC.

  • Databricks
  • Microsoft SQL Server
  • Microsoft Azure Synapse
  • MySQL
  • Oracle
  • PostgreSQL
  • Salesforce Data 360
  • Teradata

Velikost načtení JDBC určuje počet řádků, které se mají načíst na zpáteční cestu. Ve výchozím nastavení většina konektorů JDBC načítá data atomicky. To může způsobit, že množství dat překročí dostupnou paměť.

Pokud se chcete vyhnout chybám nedostatku paměti, nastavte parametr fetchSize. Pokud je fetchSize nastavená na nenulovou hodnotu, konektor čte data v dávkách. Maximální počet řádků na dávku se rovná hodnotě fetchSize. Databricks doporučuje zadat velkou fetchSize hodnotu (například 100,000), protože celková doba provádění dotazu může být prodloužena, pokud je počet řádků v dávkách příliš malý.

Tento parametr umožňuje pracovním uzlům číst data v dávkách, ale ne paralelně.

Požadavky na výpočetní prostředky:

  • Musíte použít výpočetní prostředí ve službě Databricks Runtime 16.1 nebo vyšší. Sql Warehouse musí být Verze Pro nebo Bezserverová a musí používat verzi 2024.50.
SELECT * FROM mySqlCatalog.schema.table WITH ('fetchSize' 100000)

Nastavte parametr velikosti oddílu (Snowflake)

Snowflake umožňuje načítat data v několika oddílech, což umožňuje zapojení více exekutorů a paralelního zpracování. Zvolte odpovídající velikost oddílu nastavením parametru partition_size_in_mb . Tento parametr určuje doporučenou nekomprimovanou velikost pro každý oddíl. Pokud chcete snížit počet oddílů, zadejte větší hodnotu. Výchozí hodnota je 100 (MB).

Parametr partition_size_in_mb nastaví doporučenou velikost. Skutečná velikost oddílů se může lišit.

Požadavky na výpočetní prostředky:

  • Musíte použít výpočetní prostředí ve službě Databricks Runtime 16.1 nebo vyšší. Sql Warehouse musí být Verze Pro nebo Bezserverová a musí používat verzi 2024.50.

SQL

SELECT * FROM snowflakeCatalog.schema.table WITH ('partition_size_in_mb' 1000)

Python

df = spark.read.option("partition_size_in_mb", "1000").table("snowflakeCatalog.schema.table")

Povolení paralelních čtení pro konektory JDBC

Konektory, které podporují přenosový protokol JDBC, můžou paralelně číst data rozdělením dotazu. Paralelní čtení můžete nakonfigurovat pro následující konektory:

  • Databricks
  • Microsoft SQL Server
  • Microsoft Azure Synapse
  • MySQL
  • Oracle
  • PostgreSQL
  • Redshift
  • Salesforce Data 360
  • Teradata

To umožňuje více exekutorům načítat data souběžně, což výrazně zlepšuje výkon pro velké tabulky.

Pokud chcete povolit paralelní čtení, zadejte tyto parametry:

  • numPartitions: Počet particí, které se mají použít pro paralelní zpracování
  • partitionColumn: Název číselného sloupce použitého k rozdělení dotazu
  • lowerBound: Minimální hodnota partitionColumn použitá k určení velikosti kroku oddílů
  • upperBound: Maximální hodnota partitionColumn použitá pro určení kroku rozdělení

Důležité

Hodnoty lowerBound a upperBound se používají pouze k rozhodování o kroku oddílu, nikoli k filtrování řádků v tabulce. Všechny řádky v tabulce jsou particionované a vráceny.

Sloupec oddílu by měl být:

  • Číselný sloupec
  • Rovnoměrně rozdělené napříč rozsahem
  • Indexovaný sloupec pro lepší výkon

Požadavky na výpočetní prostředky:

  • Výpočetní prostředky musíte použít ve službě Databricks Runtime 17.1 nebo vyšší. SQL sklady musí být verze Pro nebo serverless a musí používat verzi 2025.25.

V následujícím příkladu je dotaz rozdělen do 4 paralelních oddílů podle sloupce id, přičemž každý oddíl zpracovává rozsah přibližně po 250 ID (za předpokladu, že pro každý id mezi 1 a 1000 existuje jeden záznam).

SELECT * FROM mySqlCatalog.schema.table WITH (
  'numPartitions' 4,
  'partitionColumn' 'id',
  'lowerBound' 1,
  'upperBound' 1000
)

Použití zobrazení zdrojové databáze s paralelními čteními

Poznámka:

Paralelní čtení není podporováno při dotazování zobrazení vytvořeného službou Databricks, které odkazuje na federovanou tabulku. Místo toho vytvořte zobrazení ve zdrojové databázi.

Pokud chcete použít paralelní čtení se zobrazením, vytvořte zobrazení ve zdrojové databázi místo v Databricks.

Ve zdrojové databázi:

CREATE VIEW my_source_database_view AS SELECT * FROM source_database_schema.table;

Pak z Databricks dotazujte zobrazení pomocí paralelních parametrů čtení:

SELECT * FROM myfederated_catalog.schema.my_source_database_view WITH (
  'numPartitions' 4,
  'partitionColumn' 'id',
  'lowerBound' 1,
  'upperBound' 1000
)

Připojte se k odsdílení ve službě Lakehouse Federation

Důležité

Tato funkce je ve verzi Public Preview.

Zjistěte, jak funguje join pushdown ve federaci Databricks Lakehouse.

Přehled snížení spojení

Technika pushdown pro připojení je technika optimalizace dotazů, kdy Databricks deleguje operace spojení vzdálenému databázovému stroji, namísto načítání dat a jejich místního zpracování. To výrazně snižuje síťový provoz a zlepšuje výkon dotazů díky využití integrovaných funkcí připojení vzdálené databáze.

Podporované zdroje dat

Tyto zdroje dat podporují optimalizaci přenosu spojení:

  • Oracle
  • PostgreSQL
  • MySQL
  • SQL Server
  • Teradata
  • Redshift
  • Snowflake
  • BigQuery

Tato funkce je obecně dostupná a ve výchozím nastavení je povolená pro Redshift, Snowflake a BigQuery. Následující omezení a požadavky platí jenom pro konektory Oracle, PostgreSQL, MySQL, SQL Server a Teradata.

Požadavky

  • Výpočty musíte provádět na Databricks Runtime 17.2 nebo vyšší.
  • Sql Warehouse musí být Verze Pro nebo Bezserverová a musí používat verzi 2025.30.
  • Na stránce Náhledy v uživatelském rozhraní Databricks musíte zapnout Ztlumení spojení pro federované dotazy (Public Preview).

Omezení

  • Podporována jsou pouze vnitřní, levá vnější a pravá vnější spojení.
  • Aliasy v potomcích spojení jsou podporovány pouze v Databricks Runtime 17.3 a vyšší.

Požadavky na hierarchii uzlů

Aby bylo možné spojení přenést dolů, musí být všechny uzly v levé a pravé podřízené větvi také přenositelné. Platí následující pravidla:

  • Podporované podřízené uzly: Pod joinem v plánu dotazu, pro úspěšnou optimalizaci, se mohou objevit pouze uzly spojení, filtrování, vzorkování a skenování.
  • Nepodporované podřízené uzly: Pokud jsou operace limitu, posunu nebo agregace zobrazeny v levé nebo pravé větvi pod spojením, spojení nelze odeslat dolů.
  • Operace nad spojeními: Agregační, limitní a posunové operace lze při použití spojení posunout dolů.

Identifikace podporovaných a nepodporovaných vzorů spojení

-- Supported: Join two table scans
SELECT *
FROM table1
INNER JOIN table2
ON col_from_table1 = col_from_table2 + 1

-- Supported: Join two table scans with a nested select query
SELECT *
FROM (SELECT a FROM table1) q1
INNER JOIN (SELECT a FROM table2) q2
ON q1.a = q2.a + 1

-- Supported: Child subqueries with aliases in projection (:re[DBR] 17.3+)
SELECT *
FROM (SELECT a AS a1 FROM table1) t1
INNER JOIN (SELECT a AS a2 FROM table2) t2
ON t1.a1 = t2.a2 + 1

-- Supported: Join with filters below
SELECT *
FROM (SELECT * FROM table1 WHERE a > 10) t1
INNER JOIN (SELECT * FROM table2 WHERE b < 20) t2
ON t1.id = t2.id

-- Supported: Aggregate on top of join
SELECT COUNT(*)
FROM table1 t1
INNER JOIN table2 t2
ON t1.id = t2.id

-- Not supported: Join on top of aggregate
SELECT *
FROM (SELECT id, COUNT(*) as cnt FROM table1 GROUP BY id) t1
INNER JOIN table2 t2
ON t1.id = t2.id

-- Not supported: Join on top of limit
SELECT *
FROM (SELECT * FROM table1 LIMIT 100) t1
INNER JOIN table2 t2
ON t1.id = t2.id

Observability

Pomocí EXPLAIN FORMATTED ověřte, že se spojení je přesouváno na nižší úroveň:

EXPLAIN FORMATTED
SELECT *
FROM foreign_catalog.schema.table1 t1
INNER JOIN foreign_catalog.schema.table2 t2
ON t1.id = t2.id

Příklad výstupu ukazující úspěšné prosazení spojení:

== Physical Plan ==
*(1) Scan JDBCRelation
PushedFilters: [id = id_1],
PushedJoins:
   [L]: Relation: foreign_catalog.schema.table1
        PushedFilters: [ID IS NOT NULL]
   [R]: Relation: foreign_catalog.schema.table2
        PushedFilters: [ID IS NOT NULL]

V tomto výstupu:

  • id_1 je alias, který Databricks automaticky generuje, aby vyřešil nejednoznačnost, když sloupce mají duplicitní názvy.
  • Výše PushedFilters uvedené PushedJoins představují skutečné podmínky spojení, které jsou odesílány do vzdálené databáze.
  • V PushedFilters každé relaci ([L] a [R]) se zobrazují další predikáty filtru použité u každé tabulky.