寻找一种衡量跟踪和错误查询替代方法的方法

时间:2018-07-31 05:16:00

标签: sql-server

我想优化查询,但是我发现我无法正确衡量执行时间,因为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>

1 个答案:

答案 0 :(得分:2)

我通常在测试环境中使用它:

DBCC FreeProcCache;
DBCC DROPCLEANBUFFERS;

结合以下各项:

SET STATISTICS IO, TIME ON;

然后,在SQL Server Management Studio的消息选项卡中,您将获得以下详细信息:

enter image description here

在您的情况下,您将有许多统计信息,可能很难分析。因此,您只需复制邮件标签的详细信息并粘贴到here,向下滚动并在末尾分析总计,即可:

enter image description here

您可以看到每个对象的总数,因此这是查看执行最多读取的位置的好步骤。由于我们正在清除缓冲区,因此当有许多Physical Reads时,您会遇到最糟糕的情况-基本上,这是一个很好的开始,可以分析是否缺少索引或查询有问题(例如,表变量或函数已加入,但未使用最佳执行计划。

请注意,由于SQL实例上的其他活动,您在SSMS中可以获得不同的执行时间。您也可以使用sp_whoisactive实时检查谁在处理它。另外,如果这是虚拟机并且资源共享,则可以获得不同的执行时间。

因此,我建议您清除缓冲区,查看执行最多读取的位置,并检查是否可以减少读取次数。