我试图度量一个查询的执行时间,但我感觉结果是错误的。
在执行每个查询之前: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的专用服务器
谢谢大家!
3条答案
按热度按时间cfh9epnr1#
任何聚合函数都有一些小的开销-但另一方面,SELECT * 会根据列号和列大小向客户端发送大量数据。
日志度量是一个总的查询时间,它可以类似于EXPLAIN ANALYZE -但更多的时间明显更快,因为EXPLAIN ANALYZE收集执行计划的所有子节点的执行时间(和执行统计信息)。通常这是一个很大的开销。但从服务器到客户端传输数据没有开销。
kpbwa7wx2#
第一个查询要求获取表中的所有行。因此,必须读取整个表。
第二个查询只询问有多少行。数据库可以通过阅读整个表来回答这个问题,但也可以通过读取该表的任何索引来回答这个问题。由于索引比表小,这样做会更快。实际上,几乎所有表都有索引(因为主键约束条件也会创建索引)。
w7t8yxp53#
select * =选择所有数据包括所有列select count(*)=计算此表的行数
选择 * 将显示所有表
选择count(*)将显示行总数= 4