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

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

  1. select fn.column1 from dbo.function1(input1) as fn -- returns 2 秒内 64000 条记录。

  2. table 1 (Column1) 条记录-- returns 3000 条记录-- 1 秒

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

我会对结果感兴趣。