SQL SERVER 2022 针对缓存扫描和Query Store 的进步,可以考虑进行版本升级

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2380人左右 1 + 2 + 3 + 4 +5 + 6) 新人奖直接分配到6群。现需要达梦的技术老师,群里最近经常有达梦的问题。

另 starrokcs 的技术老师已经入群,有starrocks 的需求可以解决。

33bb12cdb68e1237b0324ad7ac63c181.png

6c6b1097c63f5c52f413ceaad9d55207.png

最近不知道做对了什么,上篇SQL SERVER 的文章竟然疯狂了,5000多的阅读量并且还在增长,比MYSQL ,POSTGRESQL ,POLARDB ,MONGODB ,或者其他的数据库都要多,WHY .看来关注SQL SERVER 的人真是不少,之前我一直错觉,SQL SERVER 关注得人不多了。

(同时群里,我看到有人提出如果给数据库一个高低贵贱等级,SQL SERVER的DBA 是最低贱的,这完全是偏见,偏见,偏见!那吃大蒜 喝咖啡的那个高贵?)

言归正传,笔者已经安装好windows 版本的SQL SERVER 2022 准备在有时间的时间,稍微的研究一下新的一些功能。

这次我们说说SQL SERVER中一直被人诟病的问题,缓冲池扫描的问题,我们都知道SQL SERVER 是8KB的页面,这里除了蹩脚的MySQL 是16KB ,其他的数据库都是8KB页面,PG默认也是8KB,但是在数据库重启,或者关闭后,在开机后,SQL SERVER 有一个问题,就是缓冲池扫描的问题。

其他的数据库都有自己的一些解决方案,包含部分开源的数据库产品,但SQL SERVER 作为一个商业数据库产品,在2022之前有民间方案,但称之为成熟的方案没有。随着一些业务的变大,一些SQL SERVER 本身具有128G 或者更大的内存,我见过的是最大的是768GB内存的SQL SERVER 。这些大内存的主机在重启后,将磁盘的数据重新灌入到内存中,是有一个缓慢的过程的,我们称之为 缓冲池扫描。

这也就是一直在SQL SERVER 重启后,被诟病的第一次查询会比价慢,以及我们之前有一些同学撰写的 ,开机后的预热脚本(真的有人这样做,比较有意思,将常用的查询,写长脚本在系统重启后,运行这个脚本加速数据的读入到内存) 但是在SQL SERVER 2022 版本解决了这个问题,他提供 了并行缓冲扫描来解决这个问题,这个增强的缓冲池是利用了多个CPU技术,并行进行数据的扫描,新的技术中为每800万个缓冲区,相当与64G的内存分配一个任务,如果缓冲池少于800万,则还是使用串行扫描。同时2016SP3 2017CU23 ,2019CU9版本的中对于缓冲池扫描事件的添加,让SQL SERVER 用户可以通过Extended events ,可以出发分析buffer pool scan 的问题,设置相关的出发值,来分析问题,这就是因为这个问题在2022版本中添加这个事件的发现来找到系统的性能问题。

571f15eacb5122713ba81517c77af200.png

66efd10ac3327d56a410c063d51457f8.png

当然国外的媒体也有对这个功能进行一些评测,和说明

18d8f59c06504365b0e302280b342d6a.png

同时SQL SERVER DMV 也提供 select * from  sys.dm_os_buffer_descriptors; select * from  sys.dm_os_waiting_tasks; select * from sys.dm_exec_requests 视图

107decad552f8fd430bca2b5064906fe.png

比如 sys.dm_exec_requests 可以监控并行度的一些数据, sys.dm_exec_sessions分析 session 级别的信息并行 sessions, sys.dm_os_waiting_tasks 检查任务中等待 parallelism相关的资源.

另外自SQL SERVER 2016版本中的新功能query store,在2022版本中有了更大的进步,这项功能可以通过SSMS 来对所有查询的消耗进行详细的信息统计,这些设计也都是从SQL SERVER 的社区来的信息,与用户群进行的交互开始得出的结论。之前QS 的主要目的是为了记录查询的记录的信息跟踪而来的,而到了2022版本的数据库上,QS主要的目的是为了提供更多的扩展只能查询处理的新功能而工作的,并且这项功能已经可以通过历史的数据分析得到SQL可以的最好的运行计划以及运行的方式。

这里SQL SERVER 有一个功能 degree of parallelism feedback (DOP),但在历史中,我们的SQL SERVER 在运行这个功能的时候,很多时候都倾向于对于查询使用全量的CPU 来进行并行的工作,虽然初衷是好的,但太多的CPU 在查询中被使用导致了IOPS 称为查询中的瓶颈,而导致更严重的系统性能问题。

举例:在SQL SERVER 2022 QS 中添加了,has_compile_replay_script 的信息记录,这个部分主要会帮助一些复杂的SQL语句在查询中,不在走相关的SQL语句执行计划的编译,而是复用之前记录的执行计划,减少重新计算执行计划的性能损耗。同时SQL SERVER 2022 已经提供了在always on 高可用系统中的standby 节点或者说只读节点的QUERY STORE的功能,之前QS 只能在主节点展开,现在从节点可以有独立的QS 数据存储来响应不同的查询的需求。

has_compile_replay_scriptbitApplies to: SQL Server 2022 (16.x) and later versions

Indicates whether the plan has an optimization replay script associated with it:
0 = No optimization replay script (none or even invalid).
1 = optimization replay script recorded.

Not applicable to Azure Synapse Analytics.

12cb52190b1bed3889b0926d9b5b14eb.png

这里可以设置QS 中存储信息的数据存储空间,如果设置的比较小,抛弃历史信息就会比较快同时如果一些设置比较大,则会影响系统的运行。

30a2c804fd2eb8d0614e49c4ee5803da.png

ALTER DATABASE CURRENT SET QUERY_STORE = ON
(
    OPERATION_MODE = READ_WRITE,
    CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 90),
    DATA_FLUSH_INTERVAL_SECONDS = 900,
    QUERY_CAPTURE_MODE = AUTO,
    MAX_STORAGE_SIZE_MB = 1024,
    INTERVAL_LENGTH_MINUTES = 60
);
GO

ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = ON;
GO

如要对数据库运行的执行计划,启动forceing plan 可以按照上方的语句设置QS 并在启动QS 后,设置FP,针对你需要进行设置的数据库进行设置。

如有在QS 运行中,发现自动优化的语句有问题,不细问QS 对于运行的语句进行智能的优化,可以使用如下的语句来对语句禁止使用相关的优化方式的推荐。

SELECT ProductID,
    OrderQty,
    SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID,
    OrderQty
ORDER BY ProductID,
    OrderQty
OPTION (USE HINT('DISABLE_OPTIMIZED_PLAN_FORCING'));
GO

参考文章:

https://www.microsoft.com/en-us/sql-server/blog/2022/08/18/query-store-is-enabled-by-default-in-sql-server-2022/

https://learn.microsoft.com/en-us/sql/relational-databases/performance/optimized-plan-forcing-query-store?view=sql-server-ver16

https://learn.microsoft.com/en-us/sql/relational-databases/performance/optimized-plan-forcing-query-store?view=sql-server-ver16

置顶文章:

MYSQL 版本迁移带来 严重生产事故“的”分析

MongoDB 的一张“大字报”  服务客户,欢迎DISS

MySQL 8.0 版本更新 要点 列表 (8.0-8.0.23)

临时工说:炮轰阿里云MongoDB司令部 低质高价技术差 你是要疯!!!!

生成式 AI 能否取代 DBA  结尾有炸弹

临时工说:数据库厂商官方媒体干不过 “破落户” 这究竟是为哪般?

往期热门文章:

临时工说:DBA转售前,练习怎么写数据库客户案例

PolarDB VS PostgreSQL  "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?

PostgreSQL 版本升级到PG14后,pgbouncer 无法使用怎么回事?

临时工访谈:NoSQL 大有前景,MongoDB DBA 被裁员后谋求新职位

临时工访谈:问金融软件开发总监  哪些业务不用传统数据库

PolarDB for PostgreSQL  有意思吗?有意思呀

PolarDB  Serverless POC测试中有没有坑与发现的疑问

PolarDB 数据库架构 测试 serverless 后的 三字真言  稳定,灵活,省钱(的用对地方)

临时工说:如果DBA大龄被裁员了怎么办?

临时工访谈:DBA 考PMP 有用没有用,访谈专业的项目管理人士的意见

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:从国产数据库 到 普罗大众的产品 !与在美国创业软件公司老板对话

PostgreSQL 如何通过工具来分析PG 内存泄露

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:我很普通,但我也有生存的权利,大龄程序员 求职贴

PolarDB  Serverless POC测试中有没有坑与发现的疑问

临时工访谈:PolarDB  Serverless  发现“大”问题了  之 灭妖记 续集

临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一

临时工说: 快速识别 “海洋贝壳类” 数据库方法速递

临时工说:国产 数据库 销售人员  图鉴

MongoDB 不是软柿子,想替换就替换

PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理

MySQL 八怪(高老师)现场解决问题实录

PostgreSQL 为什么也不建议 RR隔离级别,MySQL别笑

临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者

MONGODB  ---- Austindatabases  历年文章合集

MYSQL  --Austindatabases 历年文章合集

POSTGRESQL --Austindatabaes 历年文章整理

POLARDB  -- Ausitndatabases 历年的文章集合

PostgreSQL  查询语句开发写不好是必然,不是PG的锅

SQL SERVER 如何实现UNDO REDO  和PostgreSQL 有近亲关系吗

MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)

Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlServer,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。

截止今天共发布 1164篇文章

217bba569668f10f019589d446ce08d4.png

aae43db533ec96036f001821e9fd0118.png

<think>好的,用户之前问过关于SQL Server数据库中存在数据但无法查询的问题,现在他们想了解如何设置SQL Server缓存机制。我需要先回顾一下之前的对话,确保这次的回答在上下文中有连贯性。 首先,用户可能对SQL Server的内部机制不太熟悉,尤其是缓存部分。他们可能遇到了性能问题,或者想优化数据库的响应速度。之前的问题是关于数据查询异常,现在转向缓存设置,可能是在优化过程中发现缓存配置不足,或者想预防潜在的性能问题。 接下来,我需要明确SQL Server缓存机制主要涉及缓冲池(Buffer Pool)执行计划缓存。用户可能需要了解如何配置管理这两部分。需要解释清楚每个部分的作用,以及具体的配置方法,比如使用SQL语句或SSMS界面操作。 用户可能对如何调整内存分配、清除缓存、监控缓存状态等操作感兴趣。需要提供具体的步骤示例代码,比如设置最大服务器内存,或者使用DBCC命令来清理缓存。同时,要提醒他们谨慎操作,尤其是在生产环境中,避免因配置不当导致性能下降。 另外,用户可能对最佳实践感兴趣,比如定期监控、避免过度配置、使用优化查询等。需要结合这些实践,帮助他们合理利用缓存机制提升性能。 还要注意用户的身份,可能是数据库管理员或开发人员,需要根据他们的技术水平调整解释的深度。避免使用过于专业的术语,但也要确保信息准确。需要检查是否有权限问题,比如某些配置可能需要管理员权限。 最后,确保回答结构清晰,分点说明,方便用户逐步理解操作。可能还需要提到版本差异,比如不同版本的SQL Server在内存管理上的改进,但暂时可以保持通用,除非用户特别提到版本问题。</think>### SQL Server 缓存机制详解及配置方法 --- #### **1. SQL Server 缓存的核心机制** SQL Server 通过**缓冲池(Buffer Pool)****执行计划缓存**管理数据缓存,目标是减少磁盘 I/O、提升查询性能。 - **缓冲池(Buffer Pool)**: - **作用**:缓存数据页(Data Page)索引页(Index Page),所有读写操作优先通过内存完成。 - **生命周期**:数据页按 LRU(最近最少使用)算法淘汰,重启服务后缓存清空。 - **执行计划缓存**: - **作用**:缓存查询执行计划,避免重复编译 SQL 语句。 - **生命周期**:计划缓存受内存压力、架构变更或统计信息更新影响,可能被清除。 --- #### **2. 缓冲池(Buffer Pool)配置** ##### **(1) 设置最大内存限制** - **目的**:防止 SQL Server 占用过多内存,影响其他服务。 - **通过 SQL 配置**: ```sql EXEC sys.sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sys.sp_configure 'max server memory (MB)', 8192; -- 设置为 8GB RECONFIGURE; ``` - **通过 SSMS 配置**: 右键服务器 → 属性 → 内存 → 设置“最大服务器内存”。 ##### **(2) 监控缓冲池使用** ```sql SELECT (COUNT(*) * 8 / 1024) AS [Buffer Pool Size (MB)], SUM(CASE WHEN is_modified = 1 THEN 1 ELSE 0 END) AS [Dirty Pages] FROM sys.dm_os_buffer_descriptors; ``` ##### **(3) 手动清除缓冲池(慎用)** ```sql DBCC DROPCLEANBUFFERS; -- 仅清理干净页(测试环境使用) ``` --- #### **3. 执行计划缓存管理** ##### **(1) 查看执行计划缓存** ```sql SELECT plan_handle, usecounts, size_in_bytes, query_plan FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_query_plan(plan_handle); ``` ##### **(2) 清除执行计划缓存** ```sql DBCC FREEPROCCACHE; -- 清除所有计划缓存 DBCC FREEPROCCACHE(plan_handle); -- 清除特定计划 ``` ##### **(3) 优化执行计划缓存** - **参数化查询**:避免因字面值不同导致重复编译。 ```sql ALTER DATABASE YourDB SET PARAMETERIZATION FORCED; ``` - **避免临时表滥用**:频繁创建临时表会增加编译开销。 --- #### **4. 其他缓存相关组件** - **数据页预热(Warmup)**: 使用`DBCC PINTABLE`(已弃用)或第三方工具预先加载常用表到内存。 - **列存储索引缓存**: 列存储索引独立于缓冲池,使用单独的内存结构优化分析查询。 --- #### **5. 最佳实践** 1. **内存分配原则**: - 预留 10%~25% 内存给操作系统其他服务。 - OLTP 系统可分配 60%~80% 内存给 SQL Server。 2. **定期监控**: 使用性能计数器(`Buffer Cache Hit Ratio`)判断缓存效率,目标值 > 95%。 3. **避免过度配置**: 过大的内存可能导致锁竞争资源浪费。 4. **查询优化**: 减少全表扫描,合理设计索引,降低缓存压力。 --- ### **示例:综合监控脚本** ```sql -- 查看缓冲池与计划缓存占比 SELECT type AS [Memory Clerk Type], pages_kb / 1024 AS [Size (MB)] FROM sys.dm_os_memory_clerks WHERE type IN ('MEMORYCLERK_SQLBUFFERPOOL', 'CACHESTORE_SQLCP'); ``` 通过合理配置监控缓存机制,可显著提升 SQL Server 的查询性能与稳定性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值