SQL|Worktable大量逻辑读

今天早论坛看到一篇帖子说程序运行的比较慢,看到IO统计信息中有一条是扫描了'Worktable'。从网上又看到了相同的帖子:

【SQL|Worktable大量逻辑读】Table 'Worktable'.Scan count 0, logical reads 7523,physical reads 0
Table 'Employee'. Scan count 1, logical reads106, physical reads 0

其中'Worktable'表逻辑读非常高,也是同样的问题。本来查询的只有一张表,哪来的'Worktable'?

查询MSDN对于'Worktable'的解释:

关系引擎可能需要生成一个工作表以执行 SQL 语句中指定的逻辑操作。工作表是用于保存中间结果的内部表。某些 GROUP BY、ORDER BY 或 UNION查询中会生成工作表。例如,如果 ORDER BY 子句引用了不为任何索引涵盖的列,则关系引擎可能需要生成一个工作表以按所请求的顺序对结果集进行排序。工作表有时也用作临时保存执行部分查询计划所得结果的假脱机。工作表在tempdb中生成,并在不再需要时自动删除。

之后查到原因是因为开发人员使用了大量的Cursor存储临时数据导致SQL Server在tempdb创建了工作表,从而导致了大量的开销。替换之后问题解决。所以以后遇到类似的'Worktable'可以重点检查那些GROUP BY、ORDER BY 或 UNION 等需要存贮中间数据的操作,寻找优化解决办法。



    推荐阅读