怎么在postgreSQL中对记录数进行计算

  介绍

怎么在postgreSQL中对记录数进行计算?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>一般方法

从table_name;选择计数(1)

全量扫描一遍表,记录越多,查询速度越慢

新法

postgreSQL还真提供了一个这样的途径,那就是系统表pg_class,这个系统表里头,存储着每个表的统计信息,其中reltuples就是对应的表的统计行,统计行的数据是pg有个独立进程,定期扫描不同的表,收集这些表的统计信息,保存在系统表里头。

方法如下:

select    ,reltuples: int  as  total    得到;   ,pg_class    where =,relname  & # 39; table_name # 39;,   relnamespace 害;=,(得到pg_namespace 获select  oid ; where  nspname =, & # 39;模式# 39;);

新方法不是通用的,如果要求特精确还是使用select count(1),如果是类似分页的,且分页数量超过比较多的,也不是要求特别精准的,这就是一个好方法!

<强>计数(1)计算记录数

select count (1)/() * table_name;

<强>补充

计数是最常用的聚集函数之一,看似简单,其实还是有坑的,如:

1, count(*):返回结果集的行数,是零也统计

2,计数(1):和count(*)基本没区别,pg92之前都是扫描全表的,pg92之后增加了指数> performance_test=#, select  count(*),得到test_tbl;   ,数   ----------   ,10000000   (1,行)   ,   时间:115090.380,小姐(01:55.090)   ,   performance_test=#, select 计数(1),得到test_tbl;   ,数   ----------   ,10000000   (1,行)   ,   时间:738.502,

女士可以看到两次查询的速度差别非常大,计数(1)真的有这么大的性能提升?接下来再次运行查询语句。

performance_test=#, select  count(*),得到test_tbl;   ,数   ----------   ,10000000   (1,行)   ,   时间:657.831,ms   ,   performance_test=#, select 计数(1),得到test_tbl;   ,数   ----------   ,10000000   (1,行)   ,   时间:682.157,

女士可以看到第一次查询时候会非常的慢,后面三次速度非常快并且时间相近,这里就有两个问题出现了:

为什么第一次查询速度这么慢?

count(*)和计数(1)到底存不存在性能差别?

查询缓存

使语用解释句重新执行查询语句

解释(分析、缓冲区、详细)从test_tbl select count (*),

可以看到如下输出:

Finalize  Aggregate (成本=529273.69,529273.70,行=1,宽度=8),(actual 时间=882.569,882.570,行=1,循环=1)   输出:才能,count (*)   缓冲区:才能,shared 打击=96,阅读=476095   →,才能Gather (成本=529273.48,529273.69,行=2,宽度=8),(actual 时间=882.492,884.170,行=3,循环=1)   ,,,,输出:,(PARTIAL  count (*))   ,,,,Workers 计划:2   ,,,,Workers 启动:2   ,,,,缓冲:,shared 打击=96,阅读=476095   ,,,,,,Partial  Aggregate (成本=528273.48,528273.49,行=1,宽度=8),(actual 时间=881.014,881.014,行=1,循环=3)   ,,,,,,,输出:,PARTIAL  count (*)   ,,,,,,,缓冲:,shared 打击=96,阅读=476095   ,,,,,,,Worker  0:, actual 时间=880.319,880.319,行=1,循环=1   ,,,,,,,,缓冲:,shared 打击=34,阅读=158206   ,,,,,,,Worker  1:, actual 时间=880.369,880.369,行=1,循环=1   ,,,,,,,,缓冲:,shared 打击=29,阅读=156424   ,,,,,,,,,Parallel  Seq  Scan 提醒public.test_tbl (成本=0.00,517856.98,行=4166598,宽度=0),(actual 时间=0.029,662.165,行=3333333,循环=3)   ,,,,,,,,,,缓冲:,shared 打击=96,阅读=476095   ,,,,,,,,,,Worker  0:, actual 时间=0.026,661.807,行=3323029,循环=1   ,,,,,,,,,,,缓冲:,shared 打击=34,阅读=158206   ,,,,,,,,,,Worker  1:, actual 时间=0.030,660.197,行=3285513,循环=1   ,,,,,,,,,,,缓冲:,shared 打击=29,阅读=156424   ,Planning 时间:0.043,女士   ,Execution 时间:884.207,女士

注意里面的共享,表示命中了内存中缓存的数据,这就可以解释为什么后面的查询会比第一次快很多。接下来去掉缓存,并重启PostgreSQL。

service  postgresql 停止   echo  1,祝辞,/proc/sys/vm/drop_caches   service  postgresql 开始

重新执行SQL语句,速度慢了很多。

怎么在postgreSQL中对记录数进行计算