Union

具有相同架構的不同數據庫更高效的 SQL

  • December 30, 2016

我將數據儲存在不同的每月數據庫中,這些數據庫具有完全相同的表和列名稱架構。每個月度數據庫有大約 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(假設結果相同)並分別檢查/優化各個部分,確保使用索引等。

重寫的一種方法是將UNIONor移動到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) ;

引用自:https://dba.stackexchange.com/questions/159581