外部應用與左連接性能
我正在使用 SQL SERVER 2008 R2
我剛剛在 SQL 中遇到了 APPLY 並且喜歡它如何解決這麼多情況下的查詢問題,
我使用 2 個左連接來獲得結果的許多表,我能夠獲得 1 個外部應用。
我的本地數據庫表中有少量數據,部署後程式碼應該在至少 20 倍大的數據上執行。
我擔心對於大量數據,外部應用可能需要比 2 個左連接條件更長的時間,
誰能告訴 apply 究竟是如何工作的以及它將如何影響非常大數據中的性能,如果可能的話,與每個表的大小成比例關係,例如與 n1^1 或 n1^2 成比例 …其中 n1 是表中的行數1.
這是帶有 2 個左連接的查詢
select EC.*,DPD.* from Table1 eC left join ( select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2 group by member_id,parent_gid,child_gid,LOB,group_gid ) DPD2 on DPD2.parent_gid = Ec.parent_gid AND DPD2.child_gid = EC.child_gid AND DPD2.member_id = EC.member_id AND DPD2.LOB = EC.default_lob AND DPD2.group_gid = EC.group_gid left join Table2 dpd on dpd.parent_gid = dpd2.parent_gid and dpd.child_gid = dpd2.child_gid and dpd.member_id = dpd2.member_id and dpd.group_gid = dpd2.group_gid and dpd.LOB = dpd2.LOB and dpd.table2_sid = dpd2.mdsid
這是帶有外部應用的查詢
select * from Table1 ec OUTER APPLY ( select top 1 grace_begin_date,retroactive_begin_date,Isretroactive from Table2 DPD where DPD.parent_gid = Ec.parent_gid AND DPD.child_gid = EC.child_gid AND DPD.member_id = EC.member_id AND DPD.LOB = EC.default_lob AND DPD.group_gid = EC.group_gid order by DPD.table2_sid desc ) DPD
誰能告訴應用究竟是如何工作的,以及它將如何影響非常大的數據中的性能
APPLY
是關聯LATERAL JOIN
聯接(在某些產品和 SQL 標準的較新版本中稱為 a )。與任何邏輯結構一樣,它對性能沒有直接影響。原則上,我們應該能夠使用任何邏輯上等價的語法編寫查詢,並且優化器會將我們的輸入轉換為完全相同的物理執行計劃。當然,這需要優化器了解每一種可能的轉換,並有時間考慮每一種轉換。這個過程可能需要比目前宇宙年齡更長的時間,因此大多數商業產品不採用這種方法。因此,查詢語法可以並且經常確實對最終性能產生影響,儘管很難就哪個更好以及為什麼做出一般性陳述。
的特定形式
OUTER APPLY ( SELECT TOP ... )
最有可能在目前版本的 SQL Server 中導致相關的嵌套循環連接,因為優化器不包含將此模式轉換為等效的JOIN
. 如果外部輸入很大,而內部輸入沒有索引,或者需要的頁面不在記憶體中,則相關嵌套循環連接可能無法很好地執行。此外,優化器成本模型的特定元素意味著相關嵌套循環連接不太可能JOIN
產生並行執行計劃。我能夠使用單左連接和 row_number() 進行相同的查詢
在一般情況下,這可能會更好,也可能不會更好。您將需要使用代表性數據對兩種備選方案進行性能測試。和當然有可能提高效率
LEFT JOIN
,ROW_NUMBER
但這取決於選擇的精確查詢計劃形狀。影響這種方法效率的主要因素是索引的可用性,以覆蓋所需的列,並提供PARTITION BY
andORDER BY
子句所需的順序。第二個因素是桌子的大小。如果查詢涉及相關表的相對較小部分,則有效且索引良好的索引APPLY
可以勝過具有最佳索引的查詢。ROW_NUMBER
需要進行測試。