Union
具有相同架構的不同數據庫更高效的 SQL
我將數據儲存在不同的每月數據庫中,這些數據庫具有完全相同的表和列名稱架構。每個月度數據庫有大約 1000 萬行。我正在尋找一種更有效的方法來根據相同的變數從每個數據庫中選擇我想要的行。該變數每個月只有 5 到 10 行。
我還需要將這些不同的月度數據加入到同一個單獨的數據庫中。我目前正在使用 UNION 來組合數據。所以:
SELECT a.col1, a.col2, a.col3, b.colX, b.colY, b.colZ FROM db_JAN.tab1 a INNER JOIN db_OTHER.tabX b ON (a.DATE = b.DATE AND a.someID = b.someID) WHERE a.col1='variable1' UNION SELECT a.col1, a.col2, a.col3, b.colX, b.colY, b.colZ FROM db_FEB.tab1 a INNER JOIN db_OTHER.tabX b ON (a.DATE = b.DATE AND a.someID = b.someID) WHERE a.col1='variable1' UNION SELECT a.col1, a.col2, a.col3, b.colX, b.colY, b.colZ FROM db_MARCH.tab1 a INNER JOIN db_OTHER.tabX b ON (a.DATE = b.DATE AND a.someID = b.someID) WHERE a.col1='variable1' . . .
如果 SELECT、JOIN 和 WHERE 子句在具有相同命名模式的不同數據庫中是相同的,是否有更有效的方法來編寫此查詢?就像是:
SELECT a.col1, a.col2, a.col3, b.colX, b.colY, b.colZ FROM (db_JAN,db_FEB,db_MARCH...).tab1 a INNER JOIN db_OTHER.tabX b ON (a.DATE = b.DATE AND a.someID = b.someID) WHERE a.col1='variable1'
這個問題可能適用,但我不確定,因為我對 SQL 比較陌生,並且不確定順序表掃描或索引:
注意:我正在使用SAS執行連接到Teradata SQL 數據庫的查詢,並在我的 PROC SQL 語句中為“variable1”使用了 MACRO VARIABLE。我不確定我是否可以對數據庫使用 MACRO VARIABLE,但如果我不能在 SQL 本身中這樣做,這可能是一個選項。
Teradata 支持謂詞下推
select a.col1, a.col2, a.col3, b.colx, b.coly, b.colz from ( select col1, col2, col3, date, someid from db_jan.tab1 union all select col1, col2, col3, date, someid from db_feb.tab1 union all ... ) a join db_other.tabx b on a.date = b.date and a.someid = b.someid where a.col1 = 'variable1'
有多種方法可以以較短的形式編寫查詢。我不確定他們是否可以提高性能(或者讓它變得更糟!)
如果查詢效率不高,最好的攻擊方式是將其更改為
UNION ALL
(假設結果相同)並分別檢查/優化各個部分,確保使用索引等。重寫的一種方法是將
UNION
or移動到UNION ALL
派生表中,然後加入:SELECT a.col1, a.col2, a.col3, b.colX, b.colY, b.colZ FROM ( SELECT col1, col2, col3, DATE, someID FROM db_JAN.tab1 WHERE col1 = 'variable1' UNION ALL SELECT col1, col2, col3, DATE, someID FROM db_FEB.tab1 WHERE col1 = 'variable1' UNION ALL --- ) a INNER JOIN db_OTHER.tabX b ON (a.DATE = b.DATE AND a.someID = b.someID) ;