跨數據庫強制加入策略的方式
$$ 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
這個技巧可以使用像
COALESCE
AndNVL
(在 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/