我想优化查询,但是我发现我无法正确衡量执行时间,因为SQL正在使用缓存和其他一些优化功能,因此每次执行同一查询时,我都会得到不同的统计信息。>
我想每次执行相同的查询时都能获得相同的统计信息。
我尝试在每次执行之前运行以下命令,但没有成功(每次执行,时间不同):
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tr id="thetr">
<td>
<span class="display-mode" style="display: inline;">1 </span>
<label id="lblid" class="edit-mode" style="display: none;">1</label>
</td>
<td> <span class="display-mode" style="display: inline;"> <label id="lblname">hans</label> </span> <input type="text" id="name" value="hans" class="edit-mode" style="display: none;"></td>
<td> <span class="display-mode" style="display: inline;"> <label id="lblid">1</label> </span> <input type="text" id="id" value="1" class="edit-mode" style="display: none;"></td>
<td> <span class="display-mode" style="display: inline;"> <label id="lblname">hans</label> </span> <input type="text" id="name" value="hans" class="edit-mode" style="display: none;"></td>
<td class="col3Width">
<button class="edit-user display-mode" style="display: inline-block;">Edit</button>
<button class="save-user edit-mode" style="display: none;">Save</button>
<button class="cancel-user edit-mode" style="display: none;">Cancel</button>
</td>
</tr>
</table>
答案 0 :(得分:2)
我通常在测试环境中使用它:
DBCC FreeProcCache;
DBCC DROPCLEANBUFFERS;
结合以下各项:
SET STATISTICS IO, TIME ON;
然后,在SQL Server Management Studio的消息选项卡中,您将获得以下详细信息:
在您的情况下,您将有许多统计信息,可能很难分析。因此,您只需复制邮件标签的详细信息并粘贴到here,向下滚动并在末尾分析总计,即可:
您可以看到每个对象的总数,因此这是查看执行最多读取的位置的好步骤。由于我们正在清除缓冲区,因此当有许多Physical Reads
时,您会遇到最糟糕的情况-基本上,这是一个很好的开始,可以分析是否缺少索引或查询有问题(例如,表变量或函数已加入,但未使用最佳执行计划。
请注意,由于SQL实例上的其他活动,您在SSMS
中可以获得不同的执行时间。您也可以使用sp_whoisactive实时检查谁在处理它。另外,如果这是虚拟机并且资源共享,则可以获得不同的执行时间。
因此,我建议您清除缓冲区,查看执行最多读取的位置,并检查是否可以减少读取次数。