是否有人可以优化以下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))
对于上面的查询,考虑下面给出的近似行数。
select fn.column1 from dbo.function1(input1) as fn
—在2秒内返回64000条记录表1 (Column1)记录——返回3000条记录——1秒
- 表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
)
我对结果很感兴趣