在一般情况下,我有一个SELECT查询具有三个独立的SELECT查询相结合。我使用EXCEPT和UNION运营商在查询中。当独立执行查询,我将获得的结果在1-2秒内,但除了运营商已经时,查询将需要几个小时。
查询结构(如简化的)如下:
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操作如此缓慢,应该避免?
你可以用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
我会改用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 . . . );
首先我不会用领域与不同的,它能够更好地使用标识becouse其indixable
下面的采石场将有更快的性能。
这就是我会做。
SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE
where Id not in (
SELECT Id FROM MYTABLE WHERE XXX and YYY
)
有时它是有益通过拆分工作量成多个步骤,使任务查询优化器更容易。特别是,如果执行可能需要多个小时:
-- 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
请注意,一些独特的条款被删除
更新,基于OP的最后更新版本3:
标签:它是同桌。第一个查询基本上给出了几乎整个表以及第二+第三个查询是,我需要从第一个查询结果远子集
我相信整个查询可被改写为:
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
)