《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(8)

Anthropic与五角大楼Claude军事应用控权之争的技术与政策博弈 这次我们来看一个备受关注的技术与政策交叉议题——Anthropic与五角大楼围绕Claude军事用途的控权之争。这不是简单的商业合作纠纷,而是涉及AI安全护栏定义、技术控制权归属和国家安全边界的复杂博弈。 从技术角度看,Claude作为Anthropic开发的大语言模型,在2025年7月正式进入美军机密网络,成为首个进入军事系统的商业大模型。但在实际应用过程中,双方在"安全护栏"设置上产生了根本性分歧,最终导致特朗普政府于2026年2月下令所有联邦机构停止使用Anthropic技术。 1. 核心争议焦点速览 阅读详情

《Microsoft Sql server 2008 Internals》索引目录:

《Microsoft Sql server 2008 Internals》读书笔记--目录索引

上文主要介绍了已编译计划、执行上下文和计划缓存元数据相关的几个常用的系统函数,并介绍了几个葵花宝典级的调优语句。本文将继续关注缓存大小管理、缓存项的成本(Costing of Cache entries)

■缓存大小管理

我们已经了解计划重用和SQL Server如何在缓存中查找一个计划。现在,我们看看SQL Server如何管理计划缓存的大小以及它如何决定在缓存中没有空间时某个计划被移除。前面已经介绍的部分,全局操作类如DBCC FREEPROCCACHE会从缓存中清除所有计划,而alter procrdure时会从缓存中清除所有与这个存储过程相关的计划。此外,在大多数其他情况下,仅仅当SQL Server面临内存压力时才会从缓存中移除计划。SQL Server用于决定何时和计划如何应该被从缓存中移除的算法称为“回收策略”(eviction policy)。每个缓存过程都有自己的eviction policy,我们仅仅讨论对象计划过程和SQL计划过程。

决定哪个计划被回收是基于计划的成本,后文讨论。回收在SQL Server侦探到内存压力时开始,首先是零成本的计划被移除,其他计划的成本减半。两种内存压力为:本地内存压力和全局内存压力。

讨论内存压力时,我们不得不提到一个词,可见内存(visible memory),可见内存是在SQL Server缓冲池中可以直接地址化的可用物理内存。

在一个32位SQL Server实例中,可见内存的最大值为 2-3GB,这取决于你在boot,ini文件中是否设置/3GB标志开关。大于这个数字的带有地址的内存仅仅通过AWE-mapped-memory间接实现。

而一个64位SQL Server实例中,所有内存全部可以直接地址化,全部是可见内存。 你可以通过一个名为sys.dm_os_sys_info的DMV的一个列bpool_visible来查看这个值,这是一个8KB的buffer值。

 

另外,请注意,SQL 2005的不同版本及不同的SP对应的计划缓存压力限定值均不一样,即SP!与SP2对应的值不一样。SQL Server2008也是如此。 32位与64位更是不同。

SQL Server版本Cache Pressure Limit
SQL Server 2005 RTM&SP175%的可见目标内存0-8GB
+50%的可见目标内存8GB-64GB
+25%的可见目标内存>64GB
SQL Server 2005 SP2&SP3
SQL Server 2008 RTM
75%的可见目标内存0-4GB
+10%的可见目标内存4GB-64GB
+5%的可见目标内存>64GB
SQL Server 20004GB upper cap on the plan cache

例如,一个64位SQL Server 2008 RTM实例,28GB目标内存。那么这个上限(Limit)将是75%*4GB+10%*(28-4)GB=3+2.4=5.4GB

◆局部内存变量

如果单个缓存存储增长太大,它标示局部内存压力,SQL Server开始仅仅从该存储中移除项,这种行为防止一个存储占用太多的总系统内存。

在单个页分配时,如果缓存达到计划缓存压力上限的75%,如上表所示,或多个分配页时达到计划缓存压力限定的50%,内部内存压力被触发,计划开始从缓存中移除。如上例中,如果缓存存储达到75%*5.4GB=4.05GB,此时某些计划开始按指定成本顺序移除,如果刚好有一些计划添加到缓存,这一进一出,将会引起新计划的响应时间增加。

除了内存数量达到压力上限外,SQL Server在一个存储中计划数量达到该存储中哈希表大小的四倍时,也会触发内存压力上限。如上文所示。哈希表中大约10000-40000wh Bucket,也就意味着SQL存储或对象存储超过40000-160000项。下面的查询分别返回哈希表中的buckets数量和每个存储中荐的数量:

SELECT type as 'plan cache store', buckets_count FROM sys.dm_os_memory_cache_hash_tables WHERE type IN ('CACHESTORE_OBJCP', 'CACHESTORE_SQLCP'); GO SELECT type, count(*) total_entries FROM sys.dm_os_memory_cache_entries WHERE type IN ('CACHESTORE_SQLCP', 'CACHESTORE_OBJCP') GROUP BY type; GO

 邀月工作室

在SQL Server 2008之前的版本,内部内存压力上限很少触发。因为在哈希表中的项数量总是被缓存存储中的计划的大小初始化。然而,在SQL Server 2008中,如果你启用Ad Hoc workloads优化,SQL Server 缓存存储中的实际项可能非常小(每一个已编译计划存根大约是300字节),因此,项的数量可能急剧上升而达到上限,远远大于存储的Size增长速度。如果没有启用Ad Hoc workloads优化,项的Size会非常大,因为每个计划的最小限制为24KB。下列查询返回缓存存储中的所有计划的大小:

SELECT objtype, count(*) AS 'number of plans', SUM(size_in_bytes)/(1024.0 * 1024.0 * 1024.0) AS size_in_gb_single_use_plans FROM sys.dm_exec_cached_plans GROUP BY objtype;

 邀月工作室

 ◆全局内存压力(Global Memory Pressure)

全局内存压力应用于缓存存储中的所有内存,可能是内部的或外部的。外部全部压力发生在操作系统侦探到SQL Server需要减少内存消耗经满足其他应用程序的内存需要时,总的缓存存储的size减少。

内部全局内存压力在虚拟地址空间很低时发生。也可能在memory broker预测已经使用的缓存存储超过压力限定值的80%。当发生时,所有缓存存储中将有项移除。

正如前面提到的,SQL Server侦探到内存压力时,所有零成本的计划先从缓存中移除,其他所有计划的总成本减半。任何特定的周期更新最多每个缓存存储的16项。不使用的从属对象比正在使用中的编译计划优先移除。从属对象包括可执行计划和游。在遇到内存压力时,为这些对象使用的内存的一半被移除。记住,从属对象(dependent Objects)的re-create是低成本的,特别是与已编译计划相比。

 ■缓存项的成本

决定什么计划比缓存中剔除基于它们自身的成本。对于Adhoc计划,成本被看作0,但是每次计划被重用时增加1。对于其他类型的计划,成本基于计划产生时需要的资源。当这些计划被重用(reuse)时,成本被复置为原始成本。对于non-Adhoc查询,成本被按单位调用的ticks度量,最大值为31。有三个影响因素:I/O,上下文开关和内存。最大值计算如下:

1、每个I/O成本1tick(刻度),最大值19

2、上下文开关每个1tick,最大值8

3、每16页一个tick,最大值4

当没有处于内存压力时,成本在所有计划缓存的总大小达到缓冲池大小的50%不会减少。

sys.dm_os_memory_cache_entries DMV可以展示每个缓存项的当前和原始的成本,以及组成成本的组件:
SELECT text, objtype, refcounts, usecounts, size_in_bytes, disk_ios_count, context_switches_count, pages_allocated_count, original_cost, current_cost FROM sys.dm_exec_cached_plans p CROSS APPLY sys.dm_exec_sql_text(plan_handle) JOIN sys.dm_os_memory_cache_entries e ON p.memory_object_address = e.memory_object_address WHERE cacheobjtype = 'Compiled Plan' AND type in ('CACHESTORE_SQLCP', 'CACHESTORE_OBJCP') ORDER BY objtype desc, usecounts DESC;
邀月工作室
sys.dm_os_memory_cache_entries的详细说明,请查看MSDN:http://msdn.microsoft.com/zh-cn/library/ms189488.aspx
 ■计划缓存中的对象:大图片

 到目前为止,除了前面讨论的DMVs和DMFs,还有一个元数据对象叫syscacheobjects仅仅是伪表(pseudotable)。在SQL Server 2005之前的版本,没有Dynamic Management Objects,但是我们有6个这种类型的伪表,包括sysprocesses和syslockinfo,其实并不占用磁盘空间,仅仅当有人执行一个查询而访问他们时才会成形。这与DMO的工作方式类似。

这些对象在SQL Server 2008中仍然可用。在SQL Server 2000中,这些伪表只在master数据库中可用。或者当引用它们时使用完整的修饰符。在SQL Server 2008中,你可以从任何数据库访问syscacheobjects,只要使用sys schema作为一个修饰符。

关于sys.syscacheobjects视图的详细用法,请参看:http://msdn.microsoft.com/zh-cn/library/ms187815.aspx

在SQL Server 2000中,syscacheobjects伪表也包括针对可执行计划的项,即cacheobjectype列有一个值Executable Plan。在SQL Server 2008中,因为可执行计划被看作从属对象而从已编译计划中完全脱离存储,通过sys.syscacheobjects视图将无法访问。为了访问可执行计划,你必须通过sys.dm_exec_cached_plan_dependent_objects函数,传递一个参数plan_handle。

作为sys.syscacheobjects视图的一个替代方案,这个兼容性视图在后续版本中将不复存在。你可以从SQL Server Management Objects中提取同样的信息。下列脚本在master中创建了一个视图sp_cacheobjects。注意:在master中创建的以sp_开头的任何对象,都可以被任何数据库不需要对象地访问。还有一个好处是,创建的对象可以按你的需要定制它。例如,可以使用一个或多个outer apply,用连接使用sys.dm_exec_query_plan函数,得到缓存中每个计划的XML计划。

USE master GO CREATE VIEW sp_cacheobjects (bucketid, cacheobjtype, objtype, objid, dbid, dbidexec, uid, refcounts, usecounts, pagesused, setopts, langid, dateformat, status, lasttime, maxexectime, avgexectime, lastreads, lastwrites, sqlbytes, sql) AS SELECT pvt.bucketid, CONVERT(nvarchar(18), pvt.cacheobjtype) AS cacheobjtype, pvt.objtype, CONVERT(int, pvt.objectid) AS object_id, CONVERT(smallint, pvt.dbid) AS dbid, CONVERT(smallint, pvt.dbid_execute) AS execute_dbid, CONVERT(smallint, pvt.user_id) AS user_id, pvt.refcounts, pvt.usecounts, pvt.size_in_bytes / 8192 AS size_in_bytes, CONVERT(int, pvt.set_options) AS setopts, CONVERT(smallint, pvt.language_id) AS langid, CONVERT(smallint, pvt.date_format) AS date_format, CONVERT(int, pvt.status) AS status, CONVERT(bigint, 0), CONVERT(bigint, 0), CONVERT(bigint, 0), CONVERT(bigint, 0), CONVERT(bigint, 0), CONVERT(int, LEN(CONVERT(nvarchar(max), fgs.text)) * 2), CONVERT(nvarchar(3900), fgs.text) FROM (SELECT ecp.*, epa.attribute, epa.value FROM sys.dm_exec_cached_plans ecp OUTER APPLY sys.dm_exec_plan_attributes(ecp.plan_handle) epa) AS ecpa PIVOT (MAX(ecpa.value) for ecpa.attribute IN ("set_options", "objectid", "dbid", "dbid_execute", "user_id", "language_id", "date_format", "status")) AS pvt OUTER APPLY sys.dm_exec_sql_text(pvt.plan_handle) fgs

 邀月工作室

也许你注意到在几个输出列已经被硬编码为0,因为这些列在SQL Server 2005/2008中已经不再保留。特别,这些列被用于为缓存计划保存性能信息的报告列。在SQL Server 2000中,这些性能数据被为每个批处理保留。在后续版本中,它被保留在语句级,并且可以通过sys.dm_exec_query_ststs可用。为了兼容sys.syscacheobjects视图,新的视图必须在特定列位置返回某些值。如果你选择定制视图,你可以选择移除这些列。

至此,计划缓存的内部操作告一段落,我们将继续关注计划缓存的时机和计划缓存冲突。

邀月注:本文版权由邀月和优快云共同所有,转载请注明出处。
助人等于自助!   3w@live.cn

  

  

     

Ardupilot环境搭建 Ardpilot介绍:ArduPilot通过多种传感器的数据(GPS、加速度计、气压计、磁场计)等来估计飞行器的姿态,从而使飞行器能够保持稳定。 阅读详情

相关推荐

量化投资之工具篇一:Backtrader从入门到精通(1)-手把手教你零基础实现一个策略案例

Backtrader是重要的量化框架,本文记录学习该框架的笔记,内容主要基于Backtrader的网站指导文档。虽然该框架目前用于量化投资领域,但是可以作为数据处理的基本架构,进行改造后用于各种数据的处理,尤其适用于对原始数据处理完成后应用一定的策略进行预测以及可视化处理。 1、简介 Backtrader的特点,就是两点: 1、易于使用; 2、参见第1条。 那么如何使用Backtrader呢?比把大象装进冰箱复杂点,一共4步: 创建一个Cerebro引擎: 加入一个Strategy...

仓鼠王的博客 5万+

sql server实例内存使用统计

SQL SERVER内存按存放数据的类型,大概可以分为三类: 1、buffer pool,存放数据页面的缓冲区,sql server数据都是存放在一个个8K的页面里,当用户需要使用这个页面上的数据时,都是把整个页面加载到内存的buffer pool区缓存起         来。 2、各类consumer:       connect:SQL SERVER为每一个客户端连接分配一块内存,用来存

shutao917的专栏 3731

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1171

SQLServer 常用监控性能DMV & DMF

-- 查看性能记数器SELECT * FROM sys.dm_os_performance_counters -- 执行过的线程所遇到的所有等待(不是当前正在运行的线程, 为自上次重置统计信息或启动服务器以来累积的数据),可分析靠前的几个等待较高的事件。select * from sys.dm_os_wait_stats order by wait_time_ms desc-...

weixin_34087503的博客 411

MuJoCo与Isaac Sim的无缝对接:利用USD导出功能实现强化学习场景的跨平台迁移

本文详细介绍了如何通过USD导出功能实现MuJoCo与Isaac Sim的无缝对接,助力强化学习场景的跨平台迁移。文章解析了USD格式的核心优势,包括分层合成、物理属性继承和时间轴动画,并提供了从MJCF到USD的完整转换流程及在Isaac Sim中的高级应用技巧,帮助开发者高效迁移和优化强化学习环境。

weixin_29073241的博客 514

SAP中成本估算没有找到工艺路线消息处理实例

在针对成品的标准成本核算处理过程中,系统中会经由设定好的策略来收集成品相关成本组成,最终计算出产成品的标准成本。关于成本组成,可以归纳为三个基本要素,料,工,费。即标准成本就是要知道,生产一件成品,需要消耗多少钱的原材料?消耗多少钱的人工?以及其它的间接消耗? 某日,接到CO同事的反馈,在用CK11N做产成品标准价格核算时,提示没有工艺路线确定,但该消息为绿灯,可以通过。基于业务上的谨慎,提出分析。 从提示可以看出问题与工艺路线有关。因为,成品工艺路线中设定有成品生产所耗工时,所以,在计算产成品标准

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6277

SQLServer Stolen内存优化案例

最近开始观察到 SQLServer.exe 进程占用内存过大,已达到了60GB,如图: 然而,SQLServer 限制的最大内存为 55GB:EXEC sp_configure'max server memory (MB)'可以看到,竟然高出近5GB。 我们知道,’max server memory (MB)’ 限制的是SQLServer buffer pool 的大小,buffer pool

5696

YOLOv10精度上不去?QAT量化感知训练全流程,INT8推理mAP只掉0.8%

普通PTQ量化虽简单,但无法应对YOLOv10的小目标特征和激活分布波动,导致精度暴跌。QAT通过“模拟量化误差+联合优化权重与量化参数”,让INT8模型精度接近FP16,同时速度提升1.8倍,完美适配实时检测场景(如安防监控、自动驾驶)。该流程已在工业级项目中验证,针对YOLOv10的优化策略(敏感层保护、小目标加权、分阶段训练)可直接迁移至其他YOLO系列(v8/v9),量化后精度损失均可控制在1%以内。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 915

性能调优之:缓存

在执行任何查询时,SQL Server都会将数据读取到内存,数据使用之后,不会立即释放,而是会缓存在内存Buffer中,当再次执行相同的查询时,如果所需数据全部缓存在内存中,那么SQL Server不会产生Disk IO操作,立即返回查询结果,这是SQL Server的性能优化机制。 一,主要的内存消费者(Memory Consumer) 1,数据缓存(Data Cache) Data Ca...

weixin_30852419的博客 655

两组相机(或三维点)对齐方法介绍及实现代码(求解相似变换,包含旋转R、平移t、尺度s)

  这个变换用于将生成的稀疏重建场景对齐到真值上。由于SfM(Structure from Motion,运动恢复结构)求解的结果是尺度未定的,所以重建场景与真值之间不仅会相差一个旋转与平移,还会存在尺度缩放。待求解的问题可以描述为:已知一组相机(个数为m)的位姿真值Rgt、tgt和预测位姿Rpred、tpred,现要将预测值对齐到真值上。它们之间会相差一个相似变换Msimilarity,包括尺度s、旋转量R、平移量t,可以根据如下步骤进行求解:    1 求解旋转R   首先计算所有m个相机的位姿差异总和

zeeq的博客 3926

最小二乘(MLS)求点云法向量

MLS算法的基本思想是通过在点云的局部邻域内拟合一个光滑曲面,如平面或多项式曲面,以此来重建和处理点云数据。对于法向量估计,MLS通常在每个点的邻域内拟合局部平面,然后从该平面的法向量作为点的法向量。

twnkie的博客 744

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(2)

《Microsoft Sql server 2008 Internals》索引目录:《Microsoft Sql server 2008 Internals》读书笔记--目录索引在这一节,我们将继续关注Adhoc和参数化■Adhoc混合负载的优化如果你的查询大多数是临时(adhoc)的,从来不会被重用,似乎浪费内存去缓存这些计划了。SQL Server 2008增加了一个配置选项在这种情况下也能

邀月周记 2690

瑞芯微RK3588部署YOLOv8模型

写下这篇博客进行记录,以防后面忘了怎么部署。

weixin_45303602的博客 3648

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(5)

《Microsoft Sql server 2008 Internals》索引目录:《Microsoft Sql server 2008 Internals》读书笔记--目录索引上 文我们了解编译对象和重编译的起因之一:Correctness-Based Recompiles(基于更正的重编译),现在我们继续了解重编译的另一个起因:Optimality-based Recompiles(基于优化

邀月周记 2504

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(3)

《Microsoft Sql server 2008 Internals》读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397.html/rss 《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internal》读书笔记--...

dfdfadsf3443的博客 136

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(9)

《Microsoft Sql server 2008 Internals》读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397.html/rss 《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internal》读书笔...

dfdfadsf3443的博客 201

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(10)

《Microsoft Sql server 2008 Internals》索引目录:《Microsoft Sql server 2008 Internals》读书笔记--目录索引上文主要介绍计划缓存的时机和计划缓存冲突。本文将继续关注计划指南(Plan Guide)和优化指示(Optimization Hints),由于篇幅所限,计划指南分两部分,第一部分包括:优化提示、计划指南的意图、计划指南

邀月周记 2312

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(1)

《Microsoft Sql server 2008 Internals》索引目录:《Microsoft Sql server 2008 Internals》读书笔记--目录索引通过第八章的查询优化,我们大致了解SQL Server中的查询优化进程及查询执行的一些细节。因为查询优化通常是复杂和耗时的进程,SQL Server频频受益于重用已经生成并保存在计划缓存中的查询计划,而不是每次都产生一个

邀月周记 2155

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(6)

《Microsoft Sql server 2008 Internals》索引目录:《Microsoft Sql server 2008 Internals》读书笔记--目录索引上文我们了解编译对象和重编译的起因:Correctness-Based Recompiles,Optimality-based Recompiles。今天我们继续关注如何从缓存中移除计划和计划缓存内部操作。■从缓存

邀月周记 2070

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(11)

《Microsoft Sql server 2008 Internals》索引目录:《Microsoft Sql server 2008 Internals》读书笔记--目录索引本文将继续关注计划向导的后半部分,包括:计划指南的管理、计划指南的考虑因素、计划指南的有效性、从计划缓存中冻结计划。这也是计划缓存和重编译的最后一节。 ■管理计划指南  除了sp_Create_plan_guide和sp

邀月周记 1978

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(7)

《Microsoft Sql server 2008 Internals》索引目录:《Microsoft Sql server 2008 Internals》读书笔记--目录索引上文我们了解计划缓存内部操作的第一部分-缓存存储。今天我们继续关注已编译计划、执行上下文和计划缓存元数据相关的几个非常有用的系统函数和视图。■已编译计划(Compiled Plans)在Object和SQL计划缓存存储中

邀月周记 2541
上一篇: 《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(7)
下一篇: 《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(9)
downmoon
博客等级 码龄24年 1676粉丝 494原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值