博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 妙用explain Plan Rows快速估算结果集数量
阅读量:6238 次
发布时间:2019-06-22

本文共 2875 字,大约阅读时间需要 9 分钟。

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 cJOIN    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

转载地址:http://fgkia.baihongyu.com/

你可能感兴趣的文章
SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页
查看>>
怎样实现智能异地组网
查看>>
如何学好面向对象?类写法的困惑
查看>>
JSTL标签库
查看>>
JavaWeb经典三层框架
查看>>
ZFS 阶段小结
查看>>
[Curator] Node Cache 的使用与分析
查看>>
Cisco EIGRP 小综合实验
查看>>
review what i studied `date` - 2017-3-31
查看>>
Eclipse -Maven环境集成
查看>>
设计模式之UML关系符号解释
查看>>
使用Windows 7 USB/DVD Download Tool制作WIN7系统安装盘
查看>>
全球五大顶级域名一周统计 .BIZ环比增长123.3%
查看>>
中国五大顶级域名7月第二周增4.1万 美国减3.1万
查看>>
我的友情链接
查看>>
分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(3月12日-3月18日)
查看>>
再次升级!阿里云Kubernetes日志解决方案
查看>>
聊聊Dubbo - Dubbo可扩展机制实战
查看>>
mysql如何分表mysql分表的3种方法比较优点缺点
查看>>
linux平台上的扫描技术Nmap
查看>>