我遇到以下问题:当我执行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语句应该稍后集成到视图中。
我的问题是:
答案 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]可能有帮助