怎么在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中对记录数进行计算