SQL Server查询性能问题:需要替换NOT EXISTS



是否有人可以优化以下SQL查询的性能:

select fn.column1 
from dbo.function1(input1) as fn
where (not exists (select 1 from table1 t1 
                   where fn.column1 = t1.column1) 
       and not exists (select 1 from table2 t2 
                       where fn.column1 = t2.column1))

对于上面的查询,考虑下面给出的近似行数。

  1. select fn.column1 from dbo.function1(input1) as fn—在2秒内返回64000条记录

  2. 表1 (Column1)记录——返回3000条记录——1秒

  3. 表2(列1)记录——返回2000条记录——1秒

因此,如果我运行每个select语句,它会在1或2秒内提取并显示记录。但是,如果我运行完整的查询,显示64000 -(3000 + 2000)= 59000条记录需要一分钟多的时间。

我试着这样使用EXCEPT:

 select fn.column1 
 from dbo.function1(input1) 
 except 
 (select column1 from dbo.table1 union select column1 from dbo.table2)

没有什么能提高我的表现。同样,显示59000条记录需要一分钟。这与"NOT IN"场景相同。

我还注意到,如果我们在上面的查询中使用UNION而不是EXCEPT,它会在2秒内返回59K条记录。

更新:

函数(有点复杂)包含以下伪代码

select column1, column2,...column6 
from dbo.table1 
inner join dbo.table2 
inner join ....
inner join dbo.table6 
inner join dbo.innerfunction1 
where <Condition 1>
UNION ALL
select column1, column2,...column6 
from dbo.table1 
inner join dbo.table2 
inner join ...
inner join dbo.table4 
inner join dbo.innerfunction2 
where (condition 2)

假设两个内部函数有一个表select语句

我的问题是:如果我从函数中选择列,它会在1秒内显示64K条记录。但是,如果执行整个查询,则需要一分钟以上。

[请注意:此查询需要在函数中使用]

有谁能帮我改进一下吗?

如果您需要更多的细节或说明,请告诉我。

问候,Viswa v .

在没有数据的情况下很难进行优化。小提琴就好了。尽管如此,这里有一个可能有效的方法。创建一个临时表,索引它,然后执行如下的EXCEPT操作:

SELECT
  fn.column1
INTO
  #temp  
FROM
  dbo.function1(input1) AS fn
CREATE NONCLUSTERED INDEX [temp_index] ON #temp 
(
    column1 ASC
)
SELECT
  column1
FROM
  #temp AS t
EXCEPT
(
  SELECT
    column1
  FROM
    dbo.table1
  UNION
  SELECT
    column1
  FROM
    dbo.table2
)

我对结果很感兴趣

最新更新