SQL 服务器查询性能问题:需要替换 NOT EXISTS
SQL Server Query Performance Issue: Need Replacement of 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))
对于上述查询,请考虑下面给出的近似行数。
select fn.column1 from dbo.function1(input1) as fn
-- returns 2 秒内 64000 条记录。
table 1 (Column1) 条记录-- returns 3000 条记录-- 1 秒
- table 2 (Column1) 条记录 -- returns 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 秒内 returns 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)
假设两个内部函数有单个 table select 语句
我的问题是:如果我 select 函数中的列,它会在 1 秒内显示 64K 条记录。但是,如果执行整个查询,则需要一分多钟。
[请注意:此查询需要在函数中使用]
谁能帮我改进一下?
如果您需要更多详细信息或说明,请告诉我。
此致,
Viswa V.
没有数据可玩,优化有点难。 fiddle 就好了。尽管如此,这是一种可能有效的方法。
创建一个临时文件 table,为其编制索引,然后执行以下 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
)
我会对结果感兴趣。
有人可以优化以下一般 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
-- returns 2 秒内 64000 条记录。table 1 (Column1) 条记录-- returns 3000 条记录-- 1 秒
- table 2 (Column1) 条记录 -- returns 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 秒内 returns 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)
假设两个内部函数有单个 table select 语句
我的问题是:如果我 select 函数中的列,它会在 1 秒内显示 64K 条记录。但是,如果执行整个查询,则需要一分多钟。
[请注意:此查询需要在函数中使用]
谁能帮我改进一下?
如果您需要更多详细信息或说明,请告诉我。
此致, Viswa V.
没有数据可玩,优化有点难。 fiddle 就好了。尽管如此,这是一种可能有效的方法。 创建一个临时文件 table,为其编制索引,然后执行以下 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
)
我会对结果感兴趣。