当前位置: 首页 > news >正文

SQL Server和PostgreSQL填充因子

理解SQL Server和PostgreSQL中的填充因子

在调优数据库性能时,一些小设置往往能带来显著的差异。填充因子就是其中一个经常讨论的设置。SQL Server和PostgreSQL都支持这一概念,但它们的处理方式有所不同。 如果你在管理这两种系统中的数据库,了解填充因子的工作原理可以帮助你避免因索引页拆分、索引碎片以及不必要的磁盘I/O带来的头疼问题。

填充因子的概念

让我们先从一个比喻开始。假设你在整理书架。如果你把书架填得满满的,除非你拿出一些书或重新排列,否则就没有空间再放新书。这基本上就是数据库页面的工作方式。当数据库页面变满并且需要容纳更多数据时,它就必须拆分,这会消耗时间和资源。而填充因子就是一个设置,它允许你在每个页面上留出一些“空间”,就像在书架上留出空间以便以后放置新书一样。

SQL Server中的填充因子

在SQL Server中,填充因子是一个专门的索引设置。当你定义或重建索引时,可以设置填充因子来控制每个索引页面的填充程度。 例如,如果你将填充因子设置为90%,SQL Server会在每个索引页面上留出10%的空间,为将来的插入新数据或更新保留空间。 这可以减少页拆分发生的可能性,页拆分是一项成本较高的操作,可能会导致查询变慢。 默认情况下,SQL Server的填充因子设置为80%,意味着它会将每个索引页面填满。这对于读取密集型的工作负载效果很好,因为数据更改较少。但是,如果你的工作负载涉及频繁的更新或插入,较低的填充因子可以减少索引碎片。 假设有一个名为“Orders”的表,在“OrderDate”字段上有一个聚集索引。该表每天都会接收频繁的更新和插入新记录。 以下是如何设置自定义填充因子的示例:

-- 使用自定义填充因子重建索引
ALTER INDEX idx_OrderDate ON Orders  REBUILD WITH (FILLFACTOR = 90);

在这个示例中,SQL Server在重建索引时会将每个索引页面留出10%的空间。这个额外的空间确保未来的插入或更新不太可能触发页拆分,从而提高整体性能。我们还可以使用以下命令设置服务器范围的默认填充因子:

-- 设置服务器范围的填充因子为90
EXEC sp_configure 'fill factor', 90;
RECONFIGURE;

PostgreSQL中的填充因子

在PostgreSQL中,填充因子的作用范围更广,它既可以应用于表,也可以应用于索引。这是因为PostgreSQL的架构造成的,尤其是它使用的MVCC(多版本并发控制)架构。当PostgreSQL中的一行数据被更新时,系统会创建该行的一个新版本,而旧版本会保留在原页面,直到执行“清理”操作(vacuum)。如果同一页面上没有足够的空间存储新版本,PostgreSQL将不得不将其写到其他地方,这会导致表膨胀并增加“清理”过程中的额外开销。通过设置较低的填充因子,我们可以为更新留出更多空间,这样更新就能在同一页面上进行。 例如,填充因子为90意味着每个页面初始只使用90%的空间,留出10%的空间供未来更新使用。这减少了行数据移动的可能性,最小化了PostgreSQL在更新后进行“清理”时的开销。 假设有一个名为“customers”的表,频繁更新其中的“last_login”字段。以下是如何为这个表设置自定义填充因子的示例:

-- 创建具有自定义填充因子的表
CREATE TABLE customers (customer_id SERIAL PRIMARY KEY,name TEXT,last_login TIMESTAMP
) WITH (fillfactor = 90);

此配置为每个页面保留了10%的空间,用于将来的更新,确保“last_login”字段的更新不会导致不必要的行数据移动。我们还可以调整现有表或索引的填充因子:

-- 修改现有表的填充因子,PostgreSQL才会有的选项
ALTER TABLE customers SET (fillfactor = 90);-- 创建具有自定义填充因子的索引
CREATE INDEX idx_last_login ON customers (last_login) WITH (fillfactor = 90);

默认值和关键差异

有趣的是,PostgreSQL的默认填充因子是100%,这对于写操作密集型的工作负载来说似乎有些违反直觉。 这个默认值是一个折衷,平衡了存储效率和性能,以适应一般的使用场景。这两个数据库之间的关键差异在于它们的作用范围和目的。SQL Server的填充因子专注于索引,旨在减少特定场景中的索引碎片和索引页拆分。 另一方面,PostgreSQL将填充因子作为一个更广泛的工具,不仅用于索引,还用于处理与MVCC相关的表级别的挑战。 这使得PostgreSQL的填充因子在写操作密集型环境中尤为有价值,因为在这些环境中,更新和行版本管理非常频繁。

实际考虑

如何在数据库中使用填充因子呢?答案取决于你的工作负载。 在SQL Server中,对于那些经常进行更新或插入操作的索引,较低的填充因子是必需的。 而在PostgreSQL中,你可能会考虑调整表和索引的填充因子,特别是对于那些经常需要大量写入的表,以减少膨胀并优化“清理”操作。

 

http://www.dtcms.com/a/288415.html

相关文章:

  • HCIA综合实验
  • string【下】- 内功修炼(搓底层)
  • C++入门--lesson4
  • CCF编程能力等级认证GESP—C++6级—20250628
  • ICT测试原理之--什么是假短
  • 基于opencv的人脸识别考勤系统
  • 人工智能与心理史学:从阿西莫夫的科幻预言到可计算社会模型>
  • Chris Fraser | 中国早期思想中墨家与荀子的知识论
  • 【完整代码】融合时序轨迹与49维特征反演的双色球开奖预测模型:一项关于隐藏规律的探索
  • Maven常用知识总结
  • Docker容器原理和启动策略
  • 传统浏览器过时了?Dia如何用AI重新定义上网体验
  • 零基础学习性能测试第二章-linux服务器监控:内存监控
  • 【60】MFC入门到精通——运行后 button按键上不显示 按键名, 控件上的文字不显示
  • 阶段1--Linux存储管理
  • Codeforces Round 1037(Div3)
  • 【web安全】万能密码
  • 车载诊断架构 --- OEM对于DTC相关参数得定义
  • 计算机网络1.1:计算机网络在信息时代的作用
  • 教你如何借助AI精读文献
  • python基础笔记
  • LRU算法及优化
  • 佛经个人阅读(一)《心经》解析
  • 纸板制造糊机操作
  • 数据类型选择:存储销量与查询性能的平衡
  • yolov8-pos/yolov11-pos openvino C++部署
  • 后来者居上与先来后到:栈和队列的顺序哲学及算法实战(含源码)
  • C++数据结构————集合
  • Fortran实战:快速解析气象NC数据
  • c++-class