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

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.xdnf.cn/news/15726.html

相关文章:

  • debian的pulseaudio删掉也没事
  • SIMATIC WinCC Unified 使用 KPI 优化流程
  • Nacos配置管理
  • 【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)
  • Kafka、RabbitMQ 与 RocketMQ 高可靠消息保障方案对比分析
  • TinyMCE 富文本编辑器在 vue2 中的使用 @tinymce/tinymce-vue
  • MySQL——约束类型
  • Vue 3 中封装并使用 IndexedDB 的完整教程(含泛型、模块化、通用 CRUD)
  • 网络爬虫概念初解
  • 【Unity】YooAsset问题记录
  • 如何在HTML5页面中嵌入视频
  • Git基础
  • 【每日算法】专题十五_BFS 解决 FloodFill 算法
  • 电脑windows系统深度维护指南
  • 微软原版系统下载的几个好用网站
  • [牛客2020提高赛前集训营day3] 牛半仙的魔塔
  • 在服务器(ECS)部署 MySQL 操作流程
  • Window延迟更新10000天配置方案
  • QML 动画效果详解
  • 巧用Callbre RVE生成DRC HTML report及CTO的使用方法
  • 从五次方程到计算机:数学抽象如何塑造现代计算
  • 板凳-------Mysql cookbook学习 (十二--------2)
  • Codeforces Round 1037(Div.3)
  • docker容器部署应用
  • Office-PowerPoint-MCP-Server:智能自动化PPT制作工具
  • 语义熵怎么增强LLM自信心的
  • Django母婴商城项目实践(八)- 数据渲染与显示之首页
  • 计算机网络:(十一)多协议标记交换 MPLS
  • 安全隔离新选择:SiLM5768L系列 - 集成互锁功能的高速六通道数字隔离器
  • 用户中心——比如:腾讯的QQ账号可以登录到很多应用当中 01