Sql 慢性能查询
我的查询性能很慢,有时会出现“无法为对象‘临时工作表’分配空间”的错误 我有两张桌子和一个视图。前两个表具有左联接,最后一个视图将执行子查询。下面是示例查询Sql 慢性能查询,sql,sybase,Sql,Sybase,我的查询性能很慢,有时会出现“无法为对象‘临时工作表’分配空间”的错误 我有两张桌子和一个视图。前两个表具有左联接,最后一个视图将执行子查询。下面是示例查询 SELECT a.* FROM Table1 a LEFT JOIN Table2 b ON a.ID = b.ID WHERE a.ID (SELECT ID FROM View1). 上面的查询非常慢。但当我使用临时表时,它会变得更快 SELECT ID INTO #Temp FR
SELECT a.*
FROM Table1 a LEFT JOIN Table2 b ON a.ID = b.ID
WHERE a.ID (SELECT ID
FROM View1).
上面的查询非常慢。但当我使用临时表时,它会变得更快
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语句非常慢吗?请给我一个建议,比如增加新的索引
注意:第一条查询语句不能更改或修改。我只使用了第二条查询语句来向我的团队表明,如果我们将第三个表放入临时表并使用它,会使查询速度更快。基本上,在第一条查询中,您访问的是每一行的视图,而视图反过来执行它的查询
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)
在第二个示例中,只执行一次视图的查询,并使用通过临时表返回的结果
尝试:
你在任何一列中都有索引吗?至少在
ID
?@Crazy2crack,是的。我对外键(表2和表3)进行了索引,表3不是表,而是视图。我已经更改了主体。您可以将View1声明为物化视图吗?然后在它的属性ID上加一个索引?@Renzo,谢谢Renzo。我会做一个研究,这是有意义的。快速提问。如果我们将视图转换为物理表,它会变得很快,对吗?当然,如果您愿意,您可以对它进行索引。但正如@Renzo所说,你也可以将其创建为物化视图。我还没有听说过物化视图。但我会做一个研究。