检查IS NOT NULL是否很慢

时间:2016-04-19 12:09:16

标签: sql sql-server tsql

我遇到以下问题:当我执行SQL语句时

-- CTE
WITH My_CTE AS
(
    SELECT [table_a].[ID]
          ,[view_b].[val]
    FROM [table_a]
    LEFT JOIN [view_b] ON [a].[ID] = [b].[fk]
)
-- query with "is not null"
SELECT * FROM My_CTE WHERE val IS NOT NULL

执行需要8秒。在这种情况下,这非常慢(没有NULL检查,查询返回461行,并且使用NULL检查,查询返回414行,这不是那么多)。

我试图通过使用表变量提高速度:

-- declare table variable
DECLARE @test1 TABLE (ID int not null, val int null);

-- CTE
WITH My_CTE AS
(
    SELECT [table_a].[ID]
          ,[view_b].[val]
    FROM [table_a]
    LEFT JOIN [view_b] ON [a].[ID] = [b].[fk]
)
-- Fill table variable
INSERT INTO @test1 SELECT * FROM My_CTE

-- query with "is not null"
SELECT * FROM @test1 WHERE val IS NOT NULL

此处执行在不到1秒的时间内完成 - 这是预期的行为。

但问题是我不能在视图中使用表变量 - 以后的SQL语句应该稍后集成到视图中。

我的问题是:

  • 原始代码如此慢的原因是什么?
  • 是否有任何方法可以在不使用表变量的情况下提高速度?

1 个答案:

答案 0 :(得分:2)

您是否仍然坚持使用该CTE?

SELECT [table_a].[ID], [view_b].[val]
  FROM [table_a]
  JOIN [view_b] 
         ON [view_b].[fk] = [table_a].[ID] 
        AND [view_b].[val] IS NOT NULL

[view_b]上的索引。[val]可能有帮助