【问题标题】:How to get Statistics I/O info (logical reads) for a stored procedure that uses scalar functions?如何获取使用标量函数的存储过程的统计 I/O 信息(逻辑读取)?
【发布时间】:2020-07-10 22:12:03
【问题描述】:

我正在解决存储过程(不是我编写的)的性能问题。存储过程在 Select、Join、Where 和 Order By 子句中包含多个标量函数调用。

据我所知,打开 Statistics I/O 并查看通常非常有用的逻辑读取,在这里并不能提供很好的信息。这是因为返回的逻辑读取不能包含函数。我推断这是因为函数中引用的表在统计 i/o 输出中不存在。

是否有一些策略可以克服这个问题,并获得存储过程的 TOTAL 逻辑读取,包括函数调用?

编辑 - 使用 SQL Server 2017

【问题讨论】:

  • 标量函数是否从表中读取?你看起来像 sys.dm_exec_sessions 吗?
  • 是的,许多标量函数都是从表中读取的。我只是查看了 sys.dm_exec_sessions 上的逻辑读取。它给了我我不喜欢的信息(简化的 SQL 仍然使用比原始存储过程更多的逻辑读取,以及所有功能)。不确定我是否信任它,因为当我运行(打开统计 I/O)直接 SQL 时,没有函数,我在统计 I/O 输出中获得了完整的表名集。但是当我运行存储过程时,Statistics I/O 会显示一组有限的表,跳过函数命中的表。
  • 顺便说一句,谢谢你的建议。

标签: sql-server database-performance sqlperformance


【解决方案1】:

Statitics IO 已经包含了内部函数的存储过程的总逻辑读取。 将函数放在 JOIN 中,在 WHERE 子句中,在 ORDER BY 中会导致性能问题,因为在 SQL Server 的早期版本中,函数的基数估计为 1(SQL 2012 之前)和 100(SQL 2012 之后和 SQL 2017 之前)和引擎可能会生成错误的执行计划。在 SQL 2017 中,Microsoft 引入了称为交错执行的功能,以便产生更准确的估计 但仍有一些地方需要改进。

我建议您删除函数并尝试将语句放入存储过程中,使用 CTE、临时表、中间计算步骤、ecc.. 如果需要。

【讨论】:

  • 谢谢。当我打开统计 io 并运行 sp 时,它不显示仅通过函数引用的表的逻辑读取 (SQL Server 2017)。我可以说出来,因为函数引用的表(不是调用 sp)没有出现在输出中。我很想删除所有功能。我正在测试“新的和改进的”sql 确实是一种改进。需要准确的逻辑读取来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2013-12-05
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
相关资源
最近更新 更多