PostgreSQL 妙用explain Plan Rows快速估算结果集数量

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:
http://people.planetpostgresql.org/dfetter/index.php?/archives/80-Approximate-Counts.html
通过这种方法,我们可以快速的估算一个表,视图的记录数,当然也包括带条件的查询中,最终结果的返回集。
例如:
postgres=# EXPLAIN (FORMAT JSON) SELECT 1 FROM  t limit 1;
                QUERY PLAN                 
-------------------------------------------
 [                                        +
   {                                      +
     "Plan": {                            +
       "Node Type": "Limit",              +
       "Startup Cost": 0.00,              +
       "Total Cost": 0.01,                +
       "Plan Rows": 1,                    +
       "Plan Width": 0,                   +
       "Plans": [                         +
         {                                +
           "Node Type": "Seq Scan",       +
           "Parent Relationship": "Outer",+
           "Relation Name": "t",          +
           "Alias": "t",                  +
           "Startup Cost": 0.00,          +
           "Total Cost": 14425.00,        +
           "Plan Rows": 1000000,          +
           "Plan Width": 0                +
         }                                +
       ]                                  +
     }                                    +
   }                                      +
 ]
(1 row)

postgres=# EXPLAIN (FORMAT JSON) SELECT 1 FROM  t;
           QUERY PLAN           
--------------------------------
 [                             +
   {                           +
     "Plan": {                 +
       "Node Type": "Seq Scan",+
       "Relation Name": "t",   +
       "Alias": "t",           +
       "Startup Cost": 0.00,   +
       "Total Cost": 14425.00, +
       "Plan Rows": 1000000,   +
       "Plan Width": 0         +
     }                         +
   }                           +
 ]
(1 row)

通过函数,将Plan Rows转换成输出:
postgres=# CREATE OR REPLACE FUNCTION countit(name,name)             
RETURNS float4         
LANGUAGE plpgsql AS        

$$
DECLARE             
                                             
    v_plan json;              
    
BEGIN                    
    
    EXECUTE format('EXPLAIN (FORMAT JSON) SELECT 1 FROM %I.%I', $1,$2)
                                  
        INTO v_plan;                                                                     
                           
    RETURN v_plan #>> '{0,Plan,"Plan Rows"}';

END;


$$
;
CREATE FUNCTION
使用这种方法就可以快速评估所有表和视图的行数了。
postgres=# SELECT
    relname AS "table",
    CASE WHEN relkind = 'r'
        THEN reltuples
        ELSE countit(n.nspname,relname)
    END AS "approximate_count"
FROM
    pg_catalog.pg_class c
JOIN
    pg_catalog.pg_namespace n ON (
        c.relkind IN ('r','v') AND
        c.relnamespace = n.oid                                                         
    );

另外,还有一种更加简便的方法是输出pg_class.reltuples,但是这个字段的值analyze(包括auto analyze)后才有的,
而使用explain 的方法,还可以适用没有统计信息的情况。

[参考]
http://people.planetpostgresql.org/dfetter/index.php?/archives/80-Approximate-Counts.html
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 SQL 关系型数据库
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
从零开始学PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
196 1
|
关系型数据库 PostgreSQL
PostgreSQL执行计划explain
PostgreSQL执行计划explain
139 0
|
关系型数据库 PostgreSQL
PostgreSQL 性能优化: EXPLAIN 使用教程
PostgreSQL为每个收到的查询产生一个查询计划。选择正确的计划来匹配查询结构和数据的属性对于好的性能来说绝对是最关键的,因此系统包含了一个复杂的规划器来尝试选择好的计划。你可以使用EXPLAIN命令察看规划器为任何查询生成的查询计划。
236 0
|
SQL 存储 缓存
因接触partition by而对PostgreSQL explain有了一个小小的认识
因接触partition by而对PostgreSQL explain有了一个小小的认识
365 0
因接触partition by而对PostgreSQL explain有了一个小小的认识
|
SQL 算法 关系型数据库
【学习资料】第8期PostgreSQL 规格评估 - 微观、宏观、精准 多视角估算数据库性能(选型、做预算不求人)
大家好 ,这里是PostgreSQL 规格评估 - 微观、宏观、精准 多视角估算数据库性能(选型、做预算不求人)
【学习资料】第8期PostgreSQL 规格评估 - 微观、宏观、精准 多视角估算数据库性能(选型、做预算不求人)
|
SQL 缓存 Java
修改PostgreSQL字段长度导致cached plan must not change result type错误
修改PostgreSQL字段长度可能导致cached plan must not change result type错误
7374 0
|
SQL Oracle 算法
PostgreSQL 12 preview - plan_cache_mode参数控制强制使用plan cache或强制custom plan (force_custom_plan and force_generic_plan)
标签 PostgreSQL , plan_cache_mode 背景 plan cache在OLTP中,可以大幅降低生成sql parser, 执行计划的开销。 但是在某些场景中,plan cache可能成为问题,比如AP类型的场景中,由于SQL 输入条件的变化(通常AP业务涉及的条件可能比较容易出现这样的问题),可能导致plan cache并不是最佳的执行计划。
1394 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 14 章 性能提示_14.1. 使用EXPLAIN
14.1. 使用EXPLAIN 14.1.1. EXPLAIN基础 14.1.2. EXPLAIN ANALYZE 14.1.3. 警告 PostgreSQL为每个收到查询产生一个查询计划。
1466 0