通常,我有一个 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 运算符通常这么慢,应该避免使用它?
答案 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 EXISTS
与CTE
一起使用:
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
)