首页 > 数据库 > mysql教程 > 为什么具有公共子表达式假脱机的窗口聚合函数会导致如此高的逻辑读取?

为什么具有公共子表达式假脱机的窗口聚合函数会导致如此高的逻辑读取?

Patricia Arquette
发布: 2024-12-29 21:52:10
原创
310 人浏览过

Why Do Windowed Aggregate Functions with Common Subexpression Spools Result in Such High Logical Reads?

为什么具有公共子表达式假脱机的窗口聚合函数的逻辑读取如此高?

您已经注意到,在具有公共子表达式的执行计划中spools 中,报告的大表逻辑读取明显高于预期。调查揭示了一个似乎成立的公式:工作表逻辑读取 = 1 NumberOfRows 2 NumberOfGroups 4.

理解公式

高逻辑读取源自工作表处理读取的独特方式。此上下文中的逻辑读取指的是读取的行数,而不是散列页数。这意味着对于处理的每一行,工作表都会注册一次逻辑读取。

逻辑读取细分

  • 1:初始值读取以处理第一行。
  • NumberOfRows * 2:在辅助线轴的两次通过期间,每行被读取两次。
  • NumberOfGroups * 4:主线轴每组发出四行:一行用于启动组,一个用于结束组,两个用于保存聚合值。

复制尝试使用较低的逻辑读取

您尝试使用堆表复制进程仅显示 11 次逻辑读取,因为:

  • 更少的行:您的与较大的 #Orders 相比,测试表只有 5 行表。
  • 无嵌套循环:您的查询使用 OUTER APPLY 而不是嵌套循环,这消除了对虚拟行的需要。

结论

你发现的公式成立,因为它准确地反映了工作表读取的行。更高的逻辑读取是由于基于行的计数方法,而不是效率低下。原始查询中使用的嵌套循环计划进一步放大了此计数。

以上是为什么具有公共子表达式假脱机的窗口聚合函数会导致如此高的逻辑读取?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板