首页 > 数据库 >POSTGRESQL analyze table 到底做了什么与扩展统计

POSTGRESQL analyze table 到底做了什么与扩展统计

时间:2023-06-19 17:04:23浏览次数:43  
标签:POSTGRESQL bid 查询 pg statistic table analyze 统计


POSTGRESQL  analyze  table 到底做了什么与扩展统计_数据分析

PostgreSQL  中对表的状态是有单独的命令来进行状态的收集的,到底怎么对表来进行状态的收集,并且都做了什么,我们怎么来依靠这些信息来对查询进行有益的帮助。这些都将在这篇文章里面探讨。

首先我们对PG12 中,关于Analyze 的注释来仔细的阅读一遍

ANALYZE collects statistics about the contents of tables in the database, and stores the results in the pg_statistic system catalog. Subsequently, the query planner uses these statistics to help determine the most efficient execution plans for queries.

Without a table_and_columns list, ANALYZE processes every table and materialized view in the current database that the current user has permission to analyze. With a list, ANALYZE processes only those table(s). It is further possible to give a list of column names for a table, in which case only the statistics for those columns are collected.

分析收集数据库中表中关于内容的状态,并将结果存储到pg_statistic 系统目录中,随后查询执行计划的工作中会利用这些数据来帮助查询更有效率的执行,节省查询时间。Analyze命令对于当前数据库中的每一个表或者物化视图进行分析, 前提是操作的用户必须具有这些表的权限,或者是这个数据库的OWNER,或SUPERUSER. 进一步讲,对于表中的某些列进行状态信息的收集.

并且对于表的分析,中外部的表也是被支持的,但也要看你的外部的表是否支持analyzed命令,部分不支持analyze的外部数据的封装器. 在postgresql 默认的设置中, autovacuum 进程,会自动去分析表,当然您也可以根据ORACLE的经验,来对表定期的进行analyze 命令的执行,来收集表中的数据变化后的状态, 这对于加速查询是十分有帮助的.  可以在比较低的工作时间中去运行analyze来保证统计信息的更新性.

这里需要提及的analyze 需要一个读锁来,此时这个工作可以和其他的工作并行工作。这里的工作包含统计表中大部分的列的值的分布,并且可以通过直方图展示每列值的分布的情况。

对于大表,analyze 会对大表取一个随机的表的内容,而不会傻到对每一个行进行一个扫描.这样做的好处是节省数据判断的时间. 但这样的结果是很可能每次运行ANALYZE会有不同的结果,当然一般这样的变化是细微的. 这样的情况下我们可以提高analyze 的手动的次数,提高整体查询计划的平稳性.

而这些数据到底存到了哪里, pg_statistic, pg_statistic 是存储analyze 命令执行后或者autovacuum 执行后统计的内容存储到了这个表.  这里注意存储的数据的值基本都是近似值. 

starelid:  starelid 是pg_statistic中关于这条记录是表的oid信息

staattnum:  所属表的列的编号

stainherit :  这个列标明这个列是否包含继承的子列,并且是否被统计,TRUE为统计

stanumber1:是我们这列存储的值的分布情况

stavalues1:   存储列中存储的值的明细

POSTGRESQL  analyze  table 到底做了什么与扩展统计_数据库_02

select * from pg_stats;     pg_stats 是一个类似于可以提供相关数据库方便人类阅读的VIEW ,实际的数据还是通过pg_statistic 获得的。

POSTGRESQL  analyze  table 到底做了什么与扩展统计_python_03

对数据库表的状态的收集,一般通过autovacuum来就可以了,对于一些比较重要的业务大表,我们也可以学习类似ORACLE 定期对数据进行统计数据分析的方法来进行。

尤其我们还可以针对特定的字段来进行数据的分析和数据的收集,类似我们有一个比较大的表,并且列比较多拿此时我们对于这个表的某个字段查询时频繁,并且是复杂的,同时这个表的这个列的值还是经常变化的。那么此时我们可以针对这个表的这个列来进行分析。

SELECT relname, relkind, reltuples, relpages
FROM pg_class order by reltuples desc;

POSTGRESQL  analyze  table 到底做了什么与扩展统计_python_04

POSTGRESQL  analyze  table 到底做了什么与扩展统计_数据库_05

POSTGRESQL  analyze  table 到底做了什么与扩展统计_python_06

我们可以看到这个表的数据的行数比较大,并且值的分布也比较广泛,也就说明、并且这个字段是bid ,有此我们可以得到两个信息

1  我们如果对这个表的统计信息进行收集,通过普通的方式来收集统计信息,是通过评估的方式,而不会是完全的方式。 

2  我们分析可以对单独的这个bid 字段进行分析

以上是建立在我们的查询的where 条件是带有bid 这个条件的, 反过来我们很多的查询并不是单列查询,查询的条件和语句都比较复杂,例如 group by,

这样的情况下我们需要的统计信息可能就需要更有关系性,也就是GROUP BY 中的字段的之间的关系,通过一个统计信息能进行展示。

那我们可以做什么以下以 pgbench_accounts 中有两个字段  bid和 abalance 那么我们需要对这个表经常的使用group by 语句 ,那我们可以通过以下的方式来给查询提供更有效的查询的统计信息。

POSTGRESQL  analyze  table 到底做了什么与扩展统计_数据库_07

create  statistics bid_ab (ndistinct) on bid,abalance from pgbench_accounts;

analyze pgbench_accounts;

SELECT stxkeys AS k, stxdndistinct AS nd
test-#   FROM pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid)
test-#   WHERE stxname = 'bid_ab';

POSTGRESQL  analyze  table 到底做了什么与扩展统计_大数据_08

以上我们其实就建立了一个扩展的统计信息,来帮助某些特殊的查询得到更加准确的统计分析信息。

POSTGRESQL  analyze  table 到底做了什么与扩展统计_大数据_09

标签:POSTGRESQL,bid,查询,pg,statistic,table,analyze,统计
From: https://blog.51cto.com/u_14150796/6516004

相关文章

  • POSTGRESQL PG_REWIND 从源代码看功能
    PG_REWIND是PG9.6开始提供的功能,主要的作用在于通过PG_REWIND让PG复制中的数据库快速的与预定的“主库”进行数据同步,而复制的方式是是文件块的方式,并且可以避过重复的数据块。所以复制的速度是快的,在不少的高可用方式中都被作为主库失败后的快速的将主库加入原有集群并作为从......
  • 分布式两大流派 POSTGRESQL -XC 了解一下
    分布式数据库有两大流派,NEWSQLVS POSTGRESQL-XC,NEWSQL的分布式主流的理论来源自GOOGLE的分布式数据库spanner,以及相关理论的白皮书,而令一派的分布式数据库来自于POSTGRESQL-XC,今天我们看看到底POSTGRESQL-XC这个流派的方式是什么,有什么特点,当下那些分布式数据库采用了......
  • POSTGRESQL Postgres-XL 了解一下
    上次分析的POSTGRES-XC的结构, 实际上POSTGRES-X系列一直在发展, POSTGRES除了XC还有XL的高可用的结构.Postgres-XL是一款Postgres-XC升级的产品,如果说PGXC是在PG添加了集群的功能主打OLTP的功能为卖点,PGXL是一款基于PGXC添加了OLAP功能的支持MPP架构的,但不是简单的PO......
  • POSTGRESQL 创建一个表到底有什么说的? 可说的挺多的
    创建一张表,到底有什么说的, 下面是POSTGRESQL创建数据表的官方文档的内容截图. 那我们就往下看,到底我们可以说点什么建表的开头是关于临时表的问题,其中临时表的global和local,在目前的V12的版本中并没有具体的含义,问题1,POSTGRESQL怎么创建一个看似global的temparytab......
  • POSTGRESQL 主节点失败后, 在多变的情况下重新让他融入复制中
    POSTGRESQL 在主从流复制中,在主库失败切换后,从库变为主库后,如果主库不是因为硬件的原因,想继续拉起来,并且加入到新的复制关系中,一般都会通过pg_rewind的程序来进行拉起来.但不少问题反馈对pg_rewind在重新拉起旧主库出现问题,到底有什么情况下pg_rewind对你的数据库重新建立......
  • POSTGRESQL 设置hugepage 可以让系统使用内存更有效率,防止OOM
    https://www.percona.com/blog/why-linux-hugepages-are-super-important-for-database-servers-a-case-with-postgresql/https://bbs.huaweicloud.com/blogs/detail/156799Hugepage是什么,基于LINUX系统,大页面对虚拟内存管理是有必要的。除标准的4KB页面之外,还进行内存中的大页面......
  • POSTGRESQL 怎么通过explain 来分析SQL查询性能
    Explain命令是大多数数据库常用的一种展示SQL执行计划和cost的一种方式。在POSTGRESQL中EXPLAIN命令展示的信息比较详细,并且附带explain有不少的附加的命令来进行更多的展示。从命令来命令和功能来划分explainselecta.first_name,a.last_name,a.last_update,fa.film_idfrom......
  • POSTGRESQL 高可用 Patroni VS Repmgr 到底哪家强(1)
    在众多postgresql高可用模式中,主要的参与者有两位,PatroniVSrepmgr基于这二者的功能优点以及缺点相信大部分人都不是太明确,下面将根据两篇翻译的文字合并,来对两个高可用的程序来做一个比较,consandpros。 1 Repmgr是一款开源的基于postgres复制基础上的高可用软件,他基于2......
  • POSTGRESQL 14 功能有啥吸引人的
    好多人还在用postgresql10 ,12这些版本的时候,POSTGRESQL已经开启了POSTGRESQL14的旅程。那么到底Postgresql14有什么吸引人的,那就需要了解一下。 https://sql-info.de/postgresql/postgresql-14/articles-about-new-features-in-postgresql-14.html想详细了解了可以到这个......
  • POSTGRESQL openGaussDB 体系架构
    Today听了一下墨天轮举办的OpenGaussDB的专题的训练营,下面是此次线上的OpenGaussDB的体系结构的介绍。这里根据介绍快速总结出此次介绍中OpenGaussDB的特点:1 OpenGaussDB针对国产的硬件系统,如鲲鹏等硬件系统有特殊的支持和性能调试,真多国产的硬件系统有优势。2OpenGaussDB主......