Sql-Server
SQL Server——重複(幾乎)相同的子查詢的更有效的替代方法
我需要提高 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