Join

跨數據庫強制加入策略的方式

  • January 28, 2014

$$ how to enforce the query to use certain join algorithm $$ 知道有幾種加入算法

$$ Nested Loop; Sort Merge; Hash Join $$,在實現查詢時,是否有任何技術可以強制數據庫適應某些 Join 算法?也許使用一些提示?創建一些索引? 相關主題:強制散列連接——對我來說沒多大用處。

添加更多細節:我說的是 DB2 V9.7,但我最初認為這適用於其他 DB,並且它們應該具有一些共同特徵

首先,請注意並非所有數據庫都支持所有三種(循環、雜湊、合併)連接類型。例如,您不能在所有版本的 MySQL 中進行雜湊連接(感謝評論指出這現在可以在 MariaDb 中使用)。

其次,數據庫通常具有特定於供應商的語法來強制某些連接策略和順序。例如,SQL Server 使用關鍵字LOOP JOIN強制循環,Oracle 使用USE_NL,MySQL 使用語法STRAIGHT_JOIN強制連接順序。

話雖如此,通常有多種方法可以編寫查詢,以強制執行跨數據庫平台的某些行為。以下是我發現有用的策略:

強制循環連接: 將 JOIN 表示為嵌套的、相關的子查詢而不是正常連接通常會強制循環策略。

例如,而不是:

SELECT ...
FROM t1 JOIN t2 ON t1.key = t2.key

寫:

SELECT ... (SELECT ... FROM t2 WHERE t2.key = t1.key)
FROM t1 

強制雜湊聯接: 要麼刪除小表上的索引,要麼強制對錶進行表掃描。作為禁用索引的通用方法,您可以故意混淆優化器。例如,而不是:

SELECT ...
FROM t1
JOIN t2 ON t1.key = t2.key

寫入(假設密鑰為 INT):

SELECT ...
FROM t1
JOIN t2 ON t1.key / 1 = t2.key / 1

這個技巧可以使用像COALESCEAnd NVL(在 Oracle 中)這樣的函式更優雅地表達

**強制合併:**我還沒有找到一個通用的方法來做到這一點。但是在我見過的情況下,擁有正確的索引然後強制索引就可以了。

**強制加入命令:**加入命令更容易強制。訣竅是在連接條件之間創建人為的依賴關係。例如,假設您想強制按順序加入t1, t2, t3

SELECT ...
FROM t1 
JOIN t2 ON t2.k = t1.k
JOIN t3 ON t3.k = t2.key

你會寫:

SELECT ...
FROM t1
JOIN t2 ON t2.k = t1.k / 1       /* For t2 to be looked up first */
JOIN t3 ON t3.k = t2+0*t1.k     /* Force t1 to be evaluated first */

對於跨數據庫平台的查詢優化的一般處理,我建議您閱讀以下內容:http: //www.amazon.co.uk/SQL-Tuning-Dan-Tow-ebook/dp/B0026OR32Q/

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