首页 > 解决方案 > 执行时间:为什么相同代码和相同参数的持续时间会有很大差异?

问题描述

这是代码 - 非常简单。

CREATE PROCEDURE [dbo].[PGetAccountRecentlyAmountAndCount_DEBUG]
AS
DECLARE @a DECIMAL (19,4) = 0
SELECT @a = ISNULL(SUM(FValidBet * 150 / 100), 0) FROM [dbo].[TOrder_Bak10](NOLOCK) A

我已经监视了所有执行,它们具有相同的计划句柄。

然后我在执行 sp 之前清理了计划缓存和缓冲区缓存:

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

仍然没有任何变化。

我很确定它们都以相同的计划执行,并且同时不存在缓存。所以我只是无法理解其他原因可能是什么。

而这个表在另一个 sp 处没有更新、插入或选择。只有这里。

希望有人能给我任何方向。

在此处输入图像描述

标签: sqlsql-server

解决方案


我建议这看起来像是一个典型的以 50 毫秒运行的查询,除非有其他东西妨碍它。

由于您打开了 nolock,因此表大小必须具有一定意义 - 这是 io 吗?持续时间是等待加载页面的开销(请注意,这也可能是从 RAM 到 CPU 的缓存争用加载,而不仅仅是磁盘io)

如果在后台清除缓冲区并释放 proccache,它可能会计算编译开销。

我不知道这是否会并行化-如果情况不同,您可能会遇到一些开销(因为必须合并结果)

它是在单个线程上,但在那个 cpu 核心运行时会短暂停止吗?别的东西。

您可能必须找到某种方法来获取每次调用的实际执行统计信息......


推荐阅读