Sql-Server

SQL Server——重複(幾乎)相同的子查詢的更有效的替代方法

  • April 29, 2016

我需要提高 WHERE 子句中多個子查詢的效率。上下文是現有產品的報告生成器。 我可以提供的唯一輸入是 WHERE 子句。我有 3 個幾乎相同的子查詢,它們之間只有 1 個區別。我需要驗證至少有 1 條記錄與每個條件匹配。

這是查詢的要點

Where
 Exists (Select 1 From t1  ...etc... where ...etc... and fld1='X')
 AND
 Exists (Select 1 From t1  ...etc... where ...etc... and fld1='Y')
 AND
 Exists (Select 1 From t1  ...etc... where ...etc... and fld1='Z')

3 個子查詢中的每個子查詢中的“選擇”都是相同的。它加入並在其 Where 子句中有其他欄位,包括從外部查詢中對 PK 的引用:我只顯示不同之處。

t1 中有大約 50 萬條記錄。上面的查詢現在已經執行了 30 多分鐘。我需要把它縮短到 30 秒。

我的選擇非常有限——沒有 DECLARE,沒有臨時表,沒有“OVER”。

如果您從包含任何結果唯一的單值鍵(索引)的表中進行選擇(例如table1.id),則以下內容可能對您的數據表現更好:

Where
 table1.id IN (
   Select table1.id
   From table1
   Join t1  ...etc...
   Where ...etc... AND fld1 IN ('X', 'Y', 'Z')
   Group by table1.id
   Having COUNT(DISTINCT fld1) = 3
   )

如果沒有看到完整的模式和查詢,很難確定執行計劃。但你可以嘗試:

Where (Select Count(Distinct fld1) From t1 …etc… where …etc… and fld1 In (‘X’, ‘Y’, ‘Z’)) = 3

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