postgresql 执行时间选择 * 与选择计数(*)

bmp9r5qi  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(106)

我试图度量一个查询的执行时间,但我感觉结果是错误的。
在执行每个查询之前:sync; echo 3 > /proc/sys/vm/drop_caches
我的服务器日志文件结果为:

2014-02-08 14:28:30 EET LOG:  duration: 32466.103 ms  statement: select * from partsupp
2014-02-08 14:32:48 EET LOG:  duration: 9785.503 ms   statement: select count(*) from partsupp

select count(*)执行更多操作,难道不应该花费更多时间吗?
输出select *的所有结果需要4分钟(不是服务器日志显示的32秒)。我知道客户端必须输出大量数据,速度会很慢,但是服务器日志呢?它也计算输出操作吗?
我还使用了explain analyze,结果如下(如预期):

select *:        Total runtime: 13254.733 ms
select count(*): Total runtime: 13463.294 ms

我已经运行了很多次,结果都差不多。
这个对数到底是用来测量什么的?
为什么explain analyze和服务器日志之间的select *查询存在如此大的差异,尽管它不计算I/O操作?

    • 对数测量解释分析**之间的区别是什么?

我有一个安装Ubuntu 12.04和PostgreSQL 9.1的专用服务器
谢谢大家!

cfh9epnr

cfh9epnr1#

任何聚合函数都有一些小的开销-但另一方面,SELECT * 会根据列号和列大小向客户端发送大量数据。
日志度量是一个总的查询时间,它可以类似于EXPLAIN ANALYZE -但更多的时间明显更快,因为EXPLAIN ANALYZE收集执行计划的所有子节点的执行时间(和执行统计信息)。通常这是一个很大的开销。但从服务器到客户端传输数据没有开销。

kpbwa7wx

kpbwa7wx2#

第一个查询要求获取表中的所有行。因此,必须读取整个表。
第二个查询只询问有多少行。数据库可以通过阅读整个表来回答这个问题,但也可以通过读取该表的任何索引来回答这个问题。由于索引比表小,这样做会更快。实际上,几乎所有表都有索引(因为主键约束条件也会创建索引)。

w7t8yxp5

w7t8yxp53#

select * =选择所有数据包括所有列select count(*)=计算此表的行数

------------------------
name | id | address 
----------------------
s    | 12 | abc
---------------------  
x    | 14 | cc
---------------------  
y    | 15 | vv
---------------------  
z   | 16 | ll
---------------------

选择 * 将显示所有表
选择count(*)将显示行总数= 4

相关问题