不同與相同的數據表用於相同查詢時產生不同的計劃

確保表與相同的數據生成相同的物理計劃引發的SQL。

寫的deepak.bhutada

去年發表在:2022年10月14日

問題

假設你有兩個三角洲表test_table_1test_table_2。兩個表有相同的模式,同樣的數據量,相同的分區,並包含相同數量的文件。你在做一個連接轉換與另一個δ表,test_table_join一百萬條記錄。

當您運行下麵的連接查詢使用test_table_1test_table_2,不同的物理計劃生成,即使兩個表是相同的。

查詢1:

A % sql SELECT COUNT(*)從TEST_TABLE_1內連接TEST_TABLE_JOIN B A.ID = B.ID

查詢2:

A % sql SELECT COUNT(*)從TEST_TABLE_2內連接TEST_TABLE_JOIN B A.ID = B.ID

不同的物理計劃生成相同的表時就會導致延遲相比其他查詢。

導致

Apache火花產生的實際規劃轉換基於表統計信息。如果不遵循最佳實踐為三角洲表的話,表統計信息可能是不同的,否則即使表相同。如果表統計信息是不同的,火花可能比生成一個不同的計劃做了如果兩個表有相同的統計數據。

解決方案

如果你注意到不同的物理計劃正在生成相同的三角洲表有兩種不同的解決方案可以緩解這個問題。您選擇的解決方案取決於特定的磚你運行在集群運行時版本。

磚運行時7.3 LTS

使用增量表路徑而不是查詢的表名。該直接讀取的數據路徑沒有檢查表統計信息。

從δa % sql SELECT COUNT (*)。“路徑”內連接TEST_TABLE_JOIN B A.ID = B.ID

磚運行時9.1 LTS及以上

運行分析表(AWS|Azure|GCP)和計算統計命令放在桌子上。這個計算表統計信息並將它們存儲在元數據。

% sql表test_table_1計算統計分析;


實現解決方案後,重新運行查詢和使用diff檢查器比較產生的物理兩個三角洲表的計劃。

現在的計劃是相同的。


這篇文章有用嗎?