我正在处理SSRS中的报告,并在后端运行一个半大型SQL Server查询。
我的查询大约有10-15个子查询,发现其中一些子查询将我的运行时间减慢到无法为用户使用(10-15分钟的运行时间)。
有人对故障排除有任何建议,以查找查询中正在减慢其执行速度的问题吗?我想保持简单(最好没有附加组件),我只是想确定问题出在哪里,以便我可以根据需要进行重组。
我是SQL Server的新手,是中等强度的查询编写器。任何有关使用功能的指针都是很棒的。预先感谢!
一个好的起点是使用“显示估算的执行计划”(Ctrl + L)在SSMS中执行相同的查询。这将解析查询,并为您提供一个查询计划,您可以检查该计划以查看在哪里使用了大量CPU和/或IO。
您还可以在启用了“实际执行计划”的SSMS中执行相同的查询。这将执行查询并为您提供实际运行的内容。通常,估计值和实际值相同,但并不总是相同。因为您不必等待查询完成,所以从“估计”开始。
寻找大表扫描和缺少索引。这些通常是最大的罪魁祸首。
正如其他人所说,没有看到查询,很难给出具体建议,但是正如您提到的那样,它有10-15个子查询,这可能是问题的一部分,尤其是如果这些子查询具有where子句。
例如,如果您有类似的东西
SELECT *
FROM myTable a
JOIN (SELECT * FROM AnotherTable WHERE aColumn = @aValue) b
ON a.SomeColumn = b.SomeColumn
如果子查询中的表很大或索引编制不正确,这可能会很慢。
快速测试和潜在的快速胜利是将子查询结果写入临时表并加入该表,以便同一查询看起来像这样...
SELECT * INTO #temp FROM AnotherTable WHERE aColumn = @aValue
SELECT *
FROM myTable a
JOIN #temp b
ON a.SomeColumn = b.SomeColumn