我们拥有一个拥有超过100个表和数百万行的庞大数据库。 我为一个作业创建了一个存储过程,在本地进行了测试,并在不到10秒的时间内得到了500'000个结果。我在第二台PC上测试了相同的查询,并等了大约1个小时才得到相同的结果。
查询的简单版本是:
select * from Table1
inner join Table2 on Table1.Table2Id = Table2.Id
where Table1.Segment = @segment
表1 38'553'864行 表2 10'647'167行
我使用了执行计划并获得了以下结果:
在本地PC上我得到了结果:
(如果需要,我可以发送整个执行计划)
第二台PC是虚拟服务器(测试系统)。它有更多的内存,更多的空间...我也停止了服务器上的每个Job,只尝试了sql查询,但得到了相同的结果。所以没有任何sql查询阻止表。
后来我在table1的外键上创建了一个索引并尝试使用它,但无法改进查询。
有没有人知道问题出在哪里以及如何解决?
答案 0 :(得分:0)
为两个查询创建执行计划需要一段时间。但这里有几个步骤,他们已经帮了很多忙。谢谢你的帮助。
这些表的统计数据是去年9月在第二台PC上的。我们不在服务器上使用那么多查询。统计数据的更新是一个好点。 https://msdn.microsoft.com/en-us/library/ms190397(v=sql.120).aspx
另一件事是改进我的SQL查询。我删除了where并将其作为条件添加到第一个内连接上。因此,它会过滤第一个表中的行,并在连接第二个表中的大量行之后。 (过滤器约占第一个表和表3的90%非常小)
select * from Table1
inner join Table3 on Table1.Segment = @segment
and Table1.Table3Id = Table3.Id
inner join Table2 on Table1.Table2Id = Table2.Id
下一步是。我创建了一个重建所有索引的SQL作业。所以它们是最新的。
它已经好多了,但我仍然愿意接受其他投入。