前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PostgreSQL 如果想知道表中某个条件查询条件在索引中效率 ?

PostgreSQL 如果想知道表中某个条件查询条件在索引中效率 ?

作者头像
AustinDatabases
发布于 2023-09-18 07:26:28
发布于 2023-09-18 07:26:28
20400
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
能力是什么,拥有985,211的学历证明,还是钻研各种技术,艺术后,获得的技术专家,或艺术家的title, 或许都不是,能力是变化的,能力是指你能满足他人需求,能提供的一种实力,而我们在这个社会,往往把这样的能力和金钱挂钩,用数字来和别人证明你的能力。

最近一直在寻找,如何不通过 select count(*) from table where 字段 = ‘值’ 类似这样的语句,大约会产生多少结果行的问题的解决方案。在一些大表存在的数据库,去不断查询某一个值在这个大表里面的行数,一直是不受欢迎的事情,最后找到了一个还算靠谱的方案。

当然今天的文字并不是要说这个问题,我们提高难度,如果有需求问你,怎么知道现在的表中,某个字段的值,如果被查询的在有索引的情况下,效率如何,通过这个问题,我们可以判断我们的索引该怎么建立。

今天我们需要从 pg_stats 这张表里面要答案, PostgreSQL 数据库本身中是自带直方图和统计信息分析的,比某些开源数据库默认关闭的初始状态来说要好,基于pg_stats 的这张表本身来自于PostgreSQL的另一张表pg_statistic 来说,pg_statistic的信息晦涩难懂,并且不适合直接拿来应用。

pg_stats 里面的数据就要相对来说更适合我们,下面是pg_stats 里面的字段列表,我们需要关注几个部分

1 n_distinct

2 most_common_vals 3 most_common_freqs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dvdrental=# \d pg_stats
                     View "pg_catalog.pg_stats"
         Column         |   Type   | Collation | Nullable | Default 
------------------------+----------+-----------+----------+---------
 schemaname             | name     |           |          | 
 tablename              | name     |           |          | 
 attname                | name     |           |          | 
 inherited              | boolean  |           |          | 
 null_frac              | real     |           |          | 
 avg_width              | integer  |           |          | 
 n_distinct             | real     |           |          | 
 most_common_vals       | anyarray |           |          | 
 most_common_freqs      | real[]   |           |          | 
 histogram_bounds       | anyarray |           |          | 
 correlation            | real     |           |          | 
 most_common_elems      | anyarray |           |          | 
 most_common_elem_freqs | real[]   |           |          | 
 elem_count_histogram   | real[]   |           |          | 

这里我们主要使用这三个字段来进行上面问题的解决方案的核心信息来源。

1 n_distinct

2 most_common_vals 3 most_common_freqs 这里根据相关的表信息的描述,n_disinct的值,在不等于1的情况下,都可以考虑来讲这个字段作为建立索引的可选项。 同时我们针对 most_common_vals 对应 most_comon_freqs 两个字段的值来判定所选的索引,在查询的时候被作为条件时,可能会产生的影响。 我们以下表的列子为例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dvdrental=# select *,t_vals.freqs::float * t_rels.reltuples as rows 
from (SELECT tablename,attname,unnest(most_common_vals::text::text[]) as vals,unnest(most_common_freqs::text::float[]) as freqs FROM pg_stats) as t_vals
left join (SELECT relname,reltuples FROM g_class CLS LEFT JOIN pg_namespace N ON ( N.oid = CLS.relnamespace ) 
            WHERE nspname NOT IN ( 'pg_catalog', 'information_schema' ) AND relkind = 'r') as t_rels on t_vals.tablename = t_rels.relname 
            where t_rels.relname in ('actor')
dvdrental-# ;
 tablename |   attname   |          vals          | freqs | relname | reltuples | rows 
-----------+-------------+------------------------+-------+---------+-----------+------
 actor     | first_name  | Austin                 |  0.02 | actor   |       200 |    4
 actor     | first_name  | Kenneth                |  0.02 | actor   |       200 |    4
 actor     | first_name  | Penelope               |  0.02 | actor   |       200 |    4
 actor     | first_name  | Burt                   | 0.015 | actor   |       200 |    3
 actor     | first_name  | Cameron                | 0.015 | actor   |       200 |    3
 actor     | first_name  | Christian              | 0.015 | actor   |       200 |    3
 actor     | first_name  | Cuba                   | 0.015 | actor   |       200 |    3
 actor     | first_name  | Dan                    | 0.015 | actor   |       200 |    3
 actor     | first_name  | Ed                     | 0.015 | actor   |       200 |    3
 actor     | first_name  | Fay                    | 0.015 | actor   |       200 |    3
 actor     | first_name  | Gene                   | 0.015 | actor   |       200 |    3

从上面的信息中,我们可以看到一个比啊中的列大致有那些列的值,并且这些值在整个表中占比是多少,通过这个预估的占比,我们马上可以获知,这个值在整个表行中的大约会有多少行,但基于这个值是预估的,所以不是精确的值,同时根据analyze 中对于数据的分析,他们是有采样率的表越大行数越多,这个采样率会变得越小,所以会导致上面的结果和实际的结果是有出入的。

但如果表小,则计算出的评估值和实际值之间的准确性还是蛮高的,参见上图Julia,值的评估。

但如果将这个思路打开,则我们还可以做更多有意思的事情,甚至写出一个评估索引好坏的程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with first_name as (
select *,t_vals.freqs::float as freqs_1 
from (SELECT tablename,attname,
unnest(most_common_vals::text::text[]) as vals,
unnest(most_common_freqs::text::float[]) as freqs FROM pg_stats) as t_vals
left join (SELECT relname,reltuples FROM pg_class CLS 
           LEFT JOIN pg_namespace N ON ( N.oid = CLS.relnamespace ) 
           WHERE nspname NOT IN ( 'pg_catalog', 'information_schema' ) AND relkind = 'r') as t_rels on t_vals.tablename = t_rels.relname 
           where t_rels.relname in ('actor') and attname = 'first_name'),
last_name as (
select *,t_vals.freqs::float as freqs_2
from (SELECT tablename,attname,
      unnest(most_common_vals::text::text[]) as vals,
   unnest(most_common_freqs::text::float[]) as freqs FROM pg_stats) as t_vals
left join (SELECT relname,reltuples FROM pg_class CLS 
           LEFT JOIN pg_namespace N ON ( N.oid = CLS.relnamespace ) 
           WHERE nspname NOT IN ( 'pg_catalog', 'information_schema' ) AND relkind = 'r') as t_rels on t_vals.tablename = t_rels.relname 
           where t_rels.relname in ('actor') and attname = 'first_name')   
select first_name.attname as first_name,last_name.attname as last_name,
first_name.vals,last_name.vals,first_name.freqs_1,last_name.freqs_2,first_name.freqs_1 * last_name.freqs_2 as index_qua
from first_name 
left join  last_name on first_name.tablename = last_name.tablename
order by index_qua desc;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-11 06:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PostgreSQL PG15 新功能 PG_WALINSPECT
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1250人左右 1 + 2 + 3 +4)新人会进入3群(即将关闭自由申请) 默认会进入4群
AustinDatabases
2023/09/06
3350
PostgreSQL  PG15 新功能 PG_WALINSPECT
PG中的查询:2.统计--(1)
本节讨论成本优化器的基础:统计。通过示例进行讲解。这里会由很多执行计划,后续会更加详细讨论这些计划如何运行。现在只需要注意每个计划的第一行看到的数字以及行数。这些是行数估计值。
yzsDBA
2022/03/29
1.1K0
PG中的查询:2.统计--(1)
PostgreSql Postgresql 监控你说了不算,谁说了算 ? (5 整理的一些脚本)
一写就写到了第五期,有点写连续剧的味道,可能会有第六期,我想是,今天的内容并不是某些工具,其实工具也是根据数据库的原理,通过各种方式获得数据。那怎么通过PG中的系统表来获得数据就是这期的重点。
AustinDatabases
2020/07/16
7080
PostgreSql  Postgresql 监控你说了不算,谁说了算 ? (5  整理的一些脚本)
PostgreSQL 扫盲贴 常用的监控分析脚本
我一直有一个错觉,大家的POSTGRESQL的技术都非常了得,在年前实际上对我有几次的感触。
AustinDatabases
2025/03/03
590
PostgreSQL 扫盲贴 常用的监控分析脚本
PostgreSQL学术之美-从数据相关性看索引扫描IO放大问题
PostgreSQL是学术派的数据库,这体现在它架构设计的方方面面,例如多表连接动态规划、改进的内存置换时钟扫描算法、空间索引等,PG甚至将优化器的各类代价因子放开成参数供我们调整,这真是很开放的举动。
数据库架构之美
2020/11/19
7360
PostgreSQL学术之美-从数据相关性看索引扫描IO放大问题
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2023/09/14
8050
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
PG中的查询:2.统计--(2)
当不同值的数量变得太大而无法将他们全部存储在数组时,系统开始使用直方图表示。直方图使用多个存储桶来存储值。存储桶的数量受相同的default_statistics_target参数限制。每个桶的宽度以这样一种方式选择,即在他们之间均匀分布值(如图上具有大致相同面积的矩形表示)。这种表示使系统能够只存储直方图边界,而不是浪费空间来存储每个桶的频率。直方图不包括MCV列表中的值。边界存储在pg_stats的histogram_bounds字段。任何桶的汇总频率等于1/桶数。
yzsDBA
2022/03/29
7430
PG中的查询:2.统计--(2)
PostgreSQL autovacuum 5 怎么监控(autovacuum 扫描表工作的百分比)
PostgreSQL 最大的问题就是vacuum,只要PG的实现多版本和UNDO的方式不改变,那么这个话题就会一直继续,到永远。
AustinDatabases
2021/10/27
8050
PostgreSQL autovacuum 5   怎么监控(autovacuum 扫描表工作的百分比)
PostgreSQL获取用户下所有对象的权限情况
注意,这个不能获取到schema和database的归属情况,只能获取到表和序列的objectowner的情况
保持热爱奔赴山海
2022/01/11
1.1K0
全程干货!腾云忆想CSIG 产品架构师分享CDWPG云数仓库管理小窍门
腾讯云 云数据仓库 PostgreSQL(Cloud Data Warehouse PostgreSQL)(以下我们简称CDWPG)为企业提供简单、快速、经济高效的 PB 级云端数据仓库解决方案。云数据仓库兼容 Greenplum 开源数据仓库,是一种基于 MPP(大规模并行处理)架构的数仓服务。借助于该产品,可以使用丰富的 PostgreSQL 开源生态工具,实现对云数据仓库中海量数据的即席查询分析、ETL 处理及可视化探索;还可以借助云端数据无缝集成特性,轻松分析位于 COS、TencentDB、ES 等数据引擎上的 PB 级数据。
腾云忆想V
2021/08/31
1.7K1
PostgreSql 怎么获取数据库中关键系统信息(一)
如何通过SQL 的方式获得数据库中的一些关键信息,是一个DB最正常的工作,如何通过一些SQL来获得PG的一些关键的参数和信息或者是数据库中的一些信息是需要知道的一件事情。以下是部分 1
AustinDatabases
2020/09/27
1.2K0
PostgreSQL 通过python 监控逻辑复制
本期是通过PYTHON 来对逻辑复制中的配置参数,publication 定义, 打印不适合进行逻辑复制的表,打印没有在使用的复制槽,另外包含当前发布端和接收端两边的LSN对比。
AustinDatabases
2021/11/17
7900
PostgreSQL 通过python 监控逻辑复制
Greenplum 元数据常用查询语句
1、获取集群中数据库信息 1.1 集群中的创建的数据库信息 select datname from pg_database where datname not in ('template1','template0','postgres'); 1.2 查看每个数据库的储存大小 select pg_size_pretty(pg_database_size('databases')) as databasesize, 'databases' as databasename databases : 数据库信息 2
小徐
2020/01/14
3K0
Greenplum 元数据常用查询语句
Greenplum高级使用
stagging=#  select gp_segment_id,count(1) from  tablename  group by 1;
小徐
2019/01/28
1.5K1
Greenplum高级使用
PostgreSQL查看表结构语句
在PG里面查看表结构,不如mysql那样show create table xx 这样方便。 
保持热爱奔赴山海
2022/11/14
4.3K0
Postgresql常用运维指令记录
最近偶尔需要处理一些客户问题,这里记录更新下常用命令 OS tcpdump -i eth0 -s 0 -w s2_s.cap port 3006 strace -T -tt -e trace=all -p 21231 strace -T -tt -e trace=all -o file -p 21231 perf top --call-graph=fp --dsos=/data01/bin/pg1017/bin/postgres # Sample on-CPU functions for
mingjie
2022/05/12
6960
PostgreSQL - 查询表结构和索引信息
PostgreSQL的表一般都是建立在public这个schema下的,假如现在有个数据表t_student,可以用以下几种方式来查询表结构和索引信息。
雨临Lewis
2022/01/11
3.8K0
Greenplum数据库巡检报告
4.2.4 查看所有segment是否可达,确保QD(query dispatching)正常 16
小徐
2020/04/20
2.6K0
Greenplum数据库巡检报告
Greenplum 集群性能测试
114.112.77.199 master、segment 210.73.209.103 standby master、segment 140.210.73.67 segment
用户1148526
2021/12/07
7470
Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
当用户发出查询时,Citus coordinator 将其划分为更小的查询片段,其中每个查询片段可以在工作分片上独立运行。这允许 Citus 将每个查询分布在集群中。
为少
2022/05/16
8530
Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
相关推荐
PostgreSQL PG15 新功能 PG_WALINSPECT
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文