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所说,你也可以将其创建为物化视图。我还没有听说过物化视图。但我会做一个研究。