AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 151140
Accepted
James Rhoat
James Rhoat
Asked: 2016-10-01 06:35:12 +0800 CST2016-10-01 06:35:12 +0800 CST 2016-10-01 06:35:12 +0800 CST

计划“年龄”能否达到零?

  • 772

我正在阅读 Grant Fritchey 的 SQL Server 执行计划,他提到:

SQL Server 不会永远将执行计划保存在内存中。使用“年龄”公式将计划的估计成本乘以计划的使用次数,它们就会慢慢从系统中老化出来。lazywriter 进程是一个内部进程,负责释放所有类型的缓存(包括计划缓存),它会定期扫描缓存中的对象,每次将此值减一。

如果满足以下条件,该计划将从内存中删除:

  • 系统需要更多内存
  • 计划的“年龄”已为零
  • 该计划当前未被现有连接引用。

他还在本书的前面提到了以下内容:

一旦优化器得出一个执行计划,估计的计划就会被创建并存储在一个称为计划缓存的内存空间中——尽管如果计划已经存在于缓存中,这一切都是不同的。

如果实际计划和估计计划不同,我会假设该计划理论上可以达到零。这将使估计的计划执行计数为零,即使它存储在缓存中也是如此。

我的问题是计划年龄可能达到零的不同情况有哪些?我的假设是否正确?

Fritchey, G. (2012)。SQL Server 执行计划。美国斯普林菲尔德:Simple Talk Publishing。

sql-server database-internals
  • 2 2 个回答
  • 802 Views

2 个回答

  • Voted
  1. Best Answer
    Kin Shah
    2016-10-01T07:23:37+08:002016-10-01T07:23:37+08:00

    我的问题是什么时候计划的年龄可以达到零?

    SQL Server 用来确定何时以及如何从缓存中删除计划的算法称为逐出策略。

    分析计划的成本以确定哪些计划被驱逐。在检测到内存压力时,零成本计划将从缓存中删除,所有其他计划的成本减少一半。

    • 对于adhoc 计划,成本被认为是零,但每次重新使用计划时成本都会增加一。
    • 对于其他类型的计划,成本是衡量制定计划所需资源的指标。当这些计划之一被重新使用时,成本将重置为原始成本。
    • 对于非即席查询,成本以称为节拍的单位衡量,最大为 31。成本基于三个因素:I/O、上下文切换和内存。在 31 点总数中,每个点都有自己的最大值。

    当没有内存压力时,成本不会降低,直到缓存的所有计划的总大小达到缓冲池大小的 50%。届时,下一个计划访问将使所有计划的成本(以滴答为单位)减少 1。

    一旦遇到内存压力,SQL Server 将启动一个专用的资源监视器线程来减少某个特定缓存中的计划对象(针对局部压力)或所有计划缓存对象(针对全局压力)的成本。

    所以要点是...

    时钟算法定期扫描缓存。每次找到未使用的条目时,成本都会降低一定数量。如果成本为 0 且未使用,则将其从缓存中删除。

    最佳参考:

    • 计划缓存内部
    • 深入了解 SQL Server 内存——第 1部分和第 2 部分
    • 9
  2. Shanky
    2016-10-01T06:48:24+08:002016-10-01T06:48:24+08:00

    我的问题是什么时候计划的年龄可以达到零?

    根据Grant Fritchey 的 Simple Talk 文章

    执行计划不会永远保存在内存中。使用“年龄”公式将计划的估计成本乘以使用次数(例如,成本为 10 且已被引用 5 次的计划具有“年龄” ” 值 f 为 50)。

    所以你可以看到计划被重用的次数越多,它的年龄越大,它被删除的机会就越小。

    因此,当创建计划并且在创建后被引用 0 次时,考虑到其他因素,该计划最终将被删除。我确信我所写的内容还有很多,可以从SQL Server 2008 执行计划和重用中找到。

    我的问题是计划年龄可能达到零的不同情况有哪些?我的假设是否正确?

    我引用的是 BOL 文档

    为了做出基于成本的决策,数据库引擎根据以下因素增加和减少每个执行计划的当前成本变量。

    当用户进程将执行计划插入缓存时,用户进程将当前成本设置为等于原始查询编译成本;对于临时执行计划,用户进程将当前成本设置为零。此后,每次用户进程引用执行计划时,都会将当前成本重置为原始编译成本;对于临时执行计划,用户进程会增加当前成本。对于所有计划,当前成本的最大值是原始编译成本。

    检查执行计划时,如果查询当前未使用该计划,数据库引擎会通过降低当前成本将当前成本推向零。

    经常引用执行计划,因此其成本永远不会为零。该计划保留在过程缓存中,除非存在内存压力且当前成本为零,否则不会被删除。

    插入临时执行计划,并且在存在内存压力之前不会再次引用。由于临时计划是用零当前成本初始化的,因此当数据库引擎检查执行计划时,它将看到零当前成本并从过程缓存中删除该计划。当不存在内存压力时,临时执行计划以零当前成本保留在过程缓存中。

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve