使用除了在查询时,SQL Server的性能问题

问题描述 投票:3回答:4

在一般情况下,我有一个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操作如此缓慢,应该避免?

sql sql-server union except
4个回答
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

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 . . . );   

0
投票

首先我不会用领域与不同的,它能够更好地使用标识becouse其indixable

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

这就是我会做。

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

0
投票

有时它是有益通过拆分工作量成多个步骤,使任务查询优化器更容易。特别是,如果执行可能需要多个小时:

-- 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
) 
© www.soinside.com 2019 - 2024. All rights reserved.