深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异

数据库统计信息的作用

在数据库系统中,查询优化在决定应用程序性能方面起着至关重要的作用。 高效的查询依赖于最新的数据库统计信息,这些统计信息帮助数据库的查询优化器选择最佳的执行计划。在PostgreSQL和MySQL中,ANALYZE命令是收集这些统计信息的关键工具,尤其是在表中的大量数据被修改时。

本文将深入探讨PostgreSQL如何管理统计信息更新,包括自动和手动更新,并将其与SQL Server在统计信息维护方面的方法进行比较。

PostgreSQL中的统计信息维护方法

ANALYZE命令用于收集关于表的字段数据分布的统计信息。这些统计信息,包括表行数和数值分布等信息,对于查询优化器至关重要。 通过了解数据布局,PostgreSQL可以在执行查询时做出智能决策,选择如索引扫描、顺序扫描和连接方法等不同执行计划。 ANALYZE命令可以手动执行,但PostgreSQL也会在其执行自动清理(autovacuum)过程中自动执行ANALYZE命令。 自动清理不仅管理ANALYZE过程,还会运行VACUUM来回收被删除或过时的数据行所占用的存储空间。

ANALYZE命令自动执行时机

autovacuum自动清理监控表的变化并在大量数据被修改时触发ANALYZE命令。 ANALYZE命令的触发阈值使用以下公式计算(基于postgresql.conf中的配置值):

分析阈值 = autovacuum_analyze_threshold + autovacuum_analyze_scale_factor * 表中的数据行数
autovacuum_analyze_threshold:当表中的固定行数被修改时,会自动触发ANALYZE过程(默认值:50 行)。
autovacuum_analyze_scale_factor:表中必须更改的行数比例才会自动触发ANALYZE过程(默认值:0.1或10%)。

例如,在一个包含1万行数据的表中,默认设置意味着当约1050行数据被修改时,ANALYZE命令会自动开始运行(50 + 10000 * 0.1)。

根据这个算法,PostgreSQL目前对于超大型数据表会造成统计信息更新不及时的问题,到PostgreSQL 18版本都没有解决。

手动执行ANALYZE命令

尽管自动清理autovacuum最终会更新统计信息,但在某些情况下,手动执行ANALYZE命令可能会带来好处,例如:

1、添加新索引后:当创建新的索引时,运行ANALYZE命令会更新统计信息,确保查询优化器在执行计划中考虑到这个新建的索引。

2、大批量插入、更新或删除数据后:大量数据修改可能会导致查询优化器在统计信息过时的情况下暂时做出错误的决策。当在数据更改后立即运行ANALYZE命令可以确保PostgreSQL拥有当前表数据的最准确视图。

3、性能故障排除期间:如果查询变慢,运行ANALYZE命令来刷新统计信息通常可以帮助查询优化器使用最有效的执行计划。

SQL Server的统计信息维护方法

SQL Server使用更加友好的方式管理统计信息。与PostgreSQL类似,SQL Server为其查询优化器维护统计信息。然而,二者之间有一些关键的不同点:

1、自动创建统计信息 默认情况下,SQL Server会自动为涉及谓词、表联接和索引的字段创建统计信息。 例如,如果查询语句在没有索引的字段上进行过滤,SQL Server会自动生成该字段的统计信息,以便更好地为查询优化器提供详细信息。

2、自动更新统计信息 SQL Server还会根据表数据变化阈值自动更新统计信息。在SQL Server 2016版本之前,表数据的阈值通常为表中大约20%的行数。这个算法对于超大型数据表会造成统计信息更新不及时的问题,好在SQL Server 2016及之后采用了新的自适应阈值系统,表的数据量越多,阈值比例越低。

SQL Server 2016之后,表行数大于500之后:MIN ( 500 + (0.20 * n), SQRT(1,000 * n) ),也即取原算法和1000倍的二次方根的最小值,作为触发阈值。根据上述算法,可以发现

(1)算法修改之前,触发统计信息自动更新的值,是随着表的行数的变化为一条严格的一次函数,旧的阈值触发公式:500 + (0.20 * n)

(2)算法修改之后,触发统计信息自动更新的值,对于这个新的计算公式MIN ( 500 + (0.20 * n), SQRT(1,000 * n) ,可以得知:在表的行数超过200W之后,会采用SQRT(1,000 * n)这一新的算法

(3)算法修改之后,统计信息自动更新阈值的算法SQRT(1,000 * n)是一条随着表的行数的变化,波动率较低的曲线,也就是意味着更倾向于在一个较小的变化之后触发统计信息自动更新。

(4)二次方根(SQRT)是一个非常有魔力的计算规则!!!

 

3、后台异步自动更新统计信息 SQL Server提供了异步自动更新统计信息的功能。这允许查询语句在可能是过时的统计信息的情况下运行,同时后台会异步自动更新统计信息。 在SQL Server 2014引入了并行更新统计信息功能并支持设置并行度,加快了更新统计信息的速度。 这与PostgreSQL不同,PostgreSQL目前暂不支持异步更新统计信息。 另外,PostgreSQL 17目前还没有像SQL Server 2016那样的新的自适应阈值算法,对于超大型数据表会造成统计信息更新不及时的问题。

统计信息的配置

SQL Server中有三个参数AUTO_CREATE_STATISTICSAUTO_UPDATE_STATISTICS控制统计信息的自动维护。 对于需要频繁更新统计信息的表,还提供了一个名为AUTO_UPDATE_STATISTICS_ASYNC的设置,启用异步更新。

  • AUTO_CREATE_STATISTICS:默认启用 (ON)该参数控制是否自动为没有统计信息的字段创建统计信息。如果没有为某个字段创建统计信息,数据库引擎将会自动创建一个。

  • AUTO_UPDATE_STATISTICS:默认启用 (ON)该参数控制是否在数据发生变化后自动更新统计信息。当表中数据发生显著变化时,数据库引擎会自动更新相关列的统计信息。

  • AUTO_UPDATE_STATISTICS_ASYNC:默认启用 (ON)该参数控制是否启用异步统计信息更新。默认情况下,统计信息更新是同步进行的,这意味着数据库引擎在查询执行时会等待统计信息更新完成。然而,启用异步更新之后,数据库引擎将会在后台更新统计信息。

此外,SQL Server还可以通过跟踪标志和数据库范围的配置项进行更加细粒度的控制, 使数据库管理员能够在每个数据库甚至查询语句级别上优化统计信息更新。

SQL Server中手动更新统计信息

SQL Server允许像PostgreSQL那样使用类似ANALYZE的命令来手动更新统计信息。 通常通过UPDATE STATISTICS命令来完成,在某些情况下,如批量数据操作或索引创建后,用户可以立刻强制更新统计信息。 语法如下:

UPDATE STATISTICS my_table(column_name);

PostgreSQL和SQL Server统计信息维护的关键区别

1、统计信息创建

PostgreSQL不会自动为每个谓词字段创建统计信息。 SQL Server会自动为查询中使用到的字段自动生成统计信息,即使这些字段没有索引。

2、统计信息更新触发阈值

PostgreSQL的触发ANALYZE命令的阈值是可定制的,基于固定的行数和比例因子。 SQL Server的阈值触发是自适应的,取决于表的大小,即使是超大型数据表也会有更低的百分比阈值来触发自动更新。

3、统计信息异步更新

PostgreSQL不支持异步统计信息更新,这意味着查询始终使用最近收集到的统计信息。 SQL Server提供了统计信息异步自动更新功能,查询可以在统计信息过时的情况下继续执行,同时统计信息的更新会在后台自动异步运行。

4、手动执行统计信息更新命令

PostgreSQL使用 ANALYZE命令来更新统计信息, 而SQL Server使用UPDATE STATISTICS命令,并提供更多内建命令,例如sp_updatestats存储过程可以一次更新多个表或数据库的统计信息。

总结

在PostgreSQL和SQL Server中,保持最新的统计信息对优化查询性能至关重要。PostgreSQL的ANALYZE命令,无论是手动执行还是通过自动清理都确保了查询优化器拥有准确的统计数据,尽管它缺乏SQL Server的异步更新功能。SQL Server的自动创建和自适应更新机制提供了不同的方法,能够更精细地控制统计信息更新的时机和方式。

选择最佳方法取决于数据库和工作负载的具体需求。PostgreSQL的ANALYZE简单易用且高度可配置,而SQL Server的自动化系统则是自适应的并且更加自主。对于数据库管理员来说,理解两者的区别可以帮助他们利用各自系统的优势,保持数据库的最佳性能。

本文版权归作者所有,未经作者同意不得转载。

深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异的更多相关文章

  1. Sql Server优化---统计信息维护策略

    本位出处:http://www.cnblogs.com/wy123/p/5748933.html 首先解释一个概念,统计信息是什么: 简单说就是对某些字段数据分布的一种描述,让SQL Server大概 ...

  2. SQL SERVER的统计信息

    1 什么是统计信息     统计信息 描述了 表格或者索引视图中的某些列的值 的分布情况,属于数据库对象.根据统计信息,查询优化器就能评估查询过程中需要读取的行数及结果集情况,同时也能创建高质量的查询 ...

  3. SQL Server 查找统计信息的采样时间与采样比例

    有时候我们会遇到,由于统计信息不准确导致优化器生成了一个错误的执行计划(或者这样表达:一个较差的执行计划),从而引起了系统性能问题.那么如果我们怀疑这个错误的执行计划是由于统计信息不准确引起的.那么我 ...

  4. SQL Server 更新统计信息出现严重错误,应放弃任何可能产生的结果

      一台SQL Server 2008 R2版本(具体版本如下所示)的数据库,最近几天更新统计信息的作业出错,错误如下所示: Microsoft SQL Server 2008 R2 (SP2) - ...

  5. SQL Server 等待统计信息基线收集

    背景 我们随时监控每个服务器不同时间段的wait statistics ,可以根据监控信息大概判断什么时候开始出现异常,相当于一个wait statistics基线收集,还可以具体分析占比高的等待类型 ...

  6. SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016)

    本位出处:http://www.cnblogs.com/wy123/p/6770258.html 统计信息写过几篇了相关的文章了,感觉还是不过瘾,关于统计信息的问题,最近又踩坑了,该问题虽然不算很常见 ...

  7. SQL Server 各任务所维护

    SQL Server 正在运行的代码查看 SELECT [Spid] = session_id , ecid , [Database] = DB_NAME(sp.dbid) , [User] = nt ...

  8. ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接

    原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 安装ArcSDE for SQL Server,最后一步成功后的界面如下: 在ArcMap中创建ArcSDE ...

  9. 如何有效抓取SQL Server的BLOCKING信息

    原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12 ...

  10. SQL Server删除表信息的三种方法

    1.使用DELETE实现SQL Server删除表信息 (1)删除表中的全部信息 USE student GO DELETE student      --不加where条件,删除表中的所有记录 go ...

随机推荐

  1. 记一次 .NET某差旅系统 CPU爆高分析

    一:背景 1. 讲故事 前些天训练营里的一位学员找到我,说他们的差旅后台系统出现了CPU爆高的情况,爆高之后就下不去了,自己分析了下也没找到原因,事情比较紧急,让我帮忙看下是什么回事,手里也有dump ...

  2. uni-app开发的app版本更新

    标签: uni-app 版本更新 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-ap ...

  3. 【Android】屏幕超时休眠

    前言 屏幕超时休眠指的是在设备一段时间没有操作后,自动关闭屏幕显示以节省电量并防止误触.当屏幕进入休眠状态时,通常会关闭屏幕背光,但设备可能仍在运行后台进程. 正文 Settings应用相关 Sett ...

  4. codeforces1849 D. Array Painting

    题目链接 https://codeforces.com/problemset/problem/1849/D 题意 输入 \(n(1 \leq n \leq 2e5)\) 和长为 \(n\) 的数组 \ ...

  5. 如何将java私有库(jar)提交至公服/公共仓库(central repository)-手动版

    如何将java私有库(jar)提交至公服/公共仓库(central repository)-手动版 准备 GunPG(用于asc签名) 项目代码(建议是maven结构的) sonatype账号(htt ...

  6. 数据万象推出智能检索MetaInsight,现已开启限时公测

    海量文件的分析统计一直是对象存储COS的热点需求,伴随AIGC飞速迭代发展,在众多不同模态素材的海洋中,用户也急需更高效地管理和利用多媒体内容,打破传统搜索的桎梏. 数据万象推出的智能检索 MetaI ...

  7. 利用 Databend + COS助力 CDH 分析 | 某医药集团

    作者: 黄志武 某医药集团信息中心数据库组组长,13 年数据库行业从业经历,Oracle OCM,关注 Oracle.MySQL.Redis.MongoDB.Oceanbase.Tidb.Polard ...

  8. 使用 Azure AI Studio 构建和部署使用提示流的问答助驾系统

    使用 Azure AI Studio 构建和部署使用提示流的问答助驾系统 See: Build and deploy a question and answer copilot with prompt ...

  9. Spring源码阅读(一):使用IDEA搭建Spring5.0.x源码阅读环境

    说明 Spring源码阅读环境配置如下: Spring 5.x版本 Gradle 4.8.1 JDK8 IDEA2020.1 win10 搭建步骤 1. 下载Spring源码 下载地址:Github链 ...

  10. Qt编写地图综合应用56-实时动态轨迹

    一.前言 实时动态轨迹经历过很多个版本的迭代,此功能最初是一个客户定制的,主要是需要在地图上动态显示GPS的运动轨迹,有个应用场景就是一个带有监控的车子,实时在运动中,后台可以接收到经纬度信息,需要绘 ...