我的查询性能很慢,有时会出现“无法为对象临时工作表分配空间”的错误。
我有2个表和1个视图。前两个表具有左连接,最后一个视图将执行子查询。以下是示例查询。
SELECT a.*
FROM Table1 a LEFT JOIN Table2 b ON a.ID = b.ID
WHERE a.ID (SELECT ID
FROM View1).
以上查询非常慢。但是,当我使用#temp表时,它变得更快。
SELECT ID
INTO #Temp
FROM View1
SELECT a.*
FROM Table1 a LEFT JOIN Table2 b ON a.ID = b.ID
WHERE a.ID IN (SELECT ID
FROM #Temp)
有人可以解释为什么第一个sql语句很慢吗?并且请给我一个建议,比如添加新索引?
注意:不能更改或修改第一个查询语句。我只使用第二个查询语句向我的团队显示,如果我们将第3个表放入临时表并使用它,则会更快。
答案 0 :(得分:2)
基本上在第一个查询中,您正在访问每一行的视图,反过来视图正在执行它的查询。
在第二个中,您只执行一次视图查询,并通过临时表使用返回的结果。
尝试:
SELECT a.*
FROM Table1 a LEFT JOIN Table2 b ON a.ID = b.ID,
(SELECT ID
FROM View1) c
WHERE a.ID = c.ID;