Sql-Server

外部應用與左連接性能

  • November 25, 2019

我正在使用 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 JOINROW_NUMBER但這取決於選擇的精確查詢計劃形狀。影響這種方法效率的主要因素是索引的可用性,以覆蓋所需的列,並提供PARTITION BYandORDER BY子句所需的順序。第二個因素是桌子的大小。如果查詢涉及相關表的相對較小部分,則有效且索引良好的索引APPLY可以勝過具有最佳索引的查詢。ROW_NUMBER需要進行測試。

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