在查询中使用EXCEPT时的SQL Server性能问题

时间:2019-02-08 14:32:26

标签: sql sql-server union except

通常,我有一个 SELECT 查询和三个独立的SELECT查询。我在查询中使用 EXCEPT UNION 运算符。当独立执行查询时,我将在1-2秒内收到结果,但是使用 EXCEPT 运算符时,查询将花费数小时。

查询结构(经过简化)如下:

SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE

EXCEPT

(
SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE WHERE XXX

UNION

SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE WHERE YYY
)

是否有任何方法可以加快整个查询的速度,或者 EXCEPT 运算符通常这么慢,应该避免使用它?

4 个答案:

答案 0 :(得分:3)

您可以使用GROUP BY

SELECT FIELD_1, FIELD_2, FIELD_3 
FROM MYTABLE
GROUP BY FIELD_1, FIELD_2, FIELD_3 
HAVING MAX(CASE WHEN (XXX) OR (YYY) THEN 1 ELSE 0 END) = 0

答案 1 :(得分:0)

有时,通过将工作负载分为多个步骤来简化Query Optimizer的任务是有益的。尤其是如果执行过程可能需要花费几个小时:

-- Step 1
SELECT FIELD_1, FIELD_2, FIELD_3 INTO #Step1 FROM
(
SELECT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE WHERE XXX    
UNION  
SELECT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE WHERE YYY
) d

-- Step 2:
SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE    
EXCEPT    
SELECT FIELD_1, FIELD_2, FIELD_3  FROM #Step1

请注意,某些DISTINCT子句已删除


更新,版本3。基于OP的最新更新:

  

标签:它是同一张桌子。第一个查询基本上给出了   整个表和第二个+第三个查询是我需要的子集   从第一个查询结果中删除

我相信整个查询都可以重写为:

SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE ext
WHERE NOT EXISTS (

SELECT * FROM (
    SELECT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE  
    WHERE  ( (XXX) OR (YYY))  -- original filter
)   list 
WHERE
    list.FIELD_1 = ext.FIELD_1
AND list.FIELD_2 = ext.FIELD_2
AND list.FIELD_3 = ext.FIELD_3
) 

答案 2 :(得分:0)

我将NOT EXISTSCTE一起使用:

WITH CTE AS (
     <your union query>
)
SELECT mt.*
FROM MYTABLE mt
WHERE NOT EXISTS (SELECT 1 FROM CTE c WHERE c.FIELD_1 = mt.FIELD_1 AND . . . );   

答案 3 :(得分:0)

首先,我不希望将字段与配合使用,除非使用ID更好,因为它的不可分割性

下面的采石场将具有更快的性能。

这就是我要做的。

SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE
where Id not in (
SELECT Id FROM MYTABLE WHERE XXX and YYY
)