sql - 执行时间:为什么相同代码和相同参数的持续时间会有很大差异?
问题描述
这是代码 - 非常简单。
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 处没有更新、插入或选择。只有这里。
希望有人能给我任何方向。
解决方案
我建议这看起来像是一个典型的以 50 毫秒运行的查询,除非有其他东西妨碍它。
由于您打开了 nolock,因此表大小必须具有一定意义 - 这是 io 吗?持续时间是等待加载页面的开销(请注意,这也可能是从 RAM 到 CPU 的缓存争用加载,而不仅仅是磁盘io)
如果在后台清除缓冲区并释放 proccache,它可能会计算编译开销。
我不知道这是否会并行化-如果情况不同,您可能会遇到一些开销(因为必须合并结果)
它是在单个线程上,但在那个 cpu 核心运行时会短暂停止吗?别的东西。
您可能必须找到某种方法来获取每次调用的实际执行统计信息......
推荐阅读
- isabelle - Simp 不使用 Isabelle 中提供的引理
- mysql - SQL在连接中选择最近的行
- c# - C#:当用户拒绝授予提升的权限时如何捕获异常?
- assembly - 如何将 NaN 插入 xmm 寄存器?
- java - 无法创建其他布局版本
- spring - OSIV 和 JPA 实体监听器 @PreUpdate 之间的关系
- java - 如何在java中创建一个可以像这样转换为json的对象类?
- sql - 创建一个班次摘要,班次跨越 2 天
- python - 在特定条件下合并两个 Pandas DataFrame
- c# - 使用 C# .NET Core 2.1 查询 DynamoDB GSI 时出错