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

Sql 执行时间选择*与选择计数(*),sql,database,postgresql,time,Sql,Database,Postgresql,Time,我试图测量查询的执行时间,但我感觉我的结果是错误的 在我执行每个查询之前:sync;echo 3>/proc/sys/vm/drop\u缓存 我的服务器日志文件结果如下: 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 coun

我试图测量查询的执行时间,但我感觉我的结果是错误的

在我执行每个查询之前:sync;echo 3>/proc/sys/vm/drop\u缓存

我的服务器日志文件结果如下:

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
选择count*是否应该花费更多的时间执行,因为它会执行更多的操作


如服务器日志所示,要从select*输出所有结果,我需要4分钟而不是32秒。我知道客户端必须输出大量数据,而且速度会很慢,但是服务器的日志呢?它也计算输出操作吗

我还使用了解释分析,结果与预期一致:

select *:        Total runtime: 13254.733 ms
select count(*): Total runtime: 13463.294 ms
我已经运行了很多次,结果是相似的

日志究竟测量什么

为什么解释分析和服务器日志之间的select*查询有如此大的差异,尽管它不计算I/O操作

日志测量和解释分析之间的区别是什么

我有一个专用的服务器,带有Ubuntu 12.04和PostgreSQL 9.1


谢谢大家!

任何聚合函数都有一些小的开销,但另一方面,根据列数和列大小选择*发送给客户端大量数据


日志测量是一个总查询时间,它可以类似于EXPLAIN ANALYZE,但更多的时间要快得多,因为EXPLAIN ANALYZE会收集执行计划所有子节点的执行时间和执行统计信息。通常,这是一项重要的开销。但是,从服务器到客户端的数据传输没有开销。

第一个查询要求表中的所有行。因此,必须读取整个表


第二个查询只询问有多少行。数据库可以通过读取整个表来回答这个问题,但也可以通过读取该表的任何索引来回答这个问题。因为索引比表小,所以这样做会更快。实际上,几乎所有表都有索引,因为主键约束也会创建索引。

select*=选择所有包含的数据列 选择count*=计算行数 例如这张表

------------------------ name | id | address ---------------------- s | 12 | abc --------------------- x | 14 | cc --------------------- y | 15 | vv --------------------- z | 16 | ll --------------------- 选择*将显示所有表格


选择count*将显示行总数=4

count*返回的信息较少。大多数RDBMS必须为更少的信息做更少的工作。它使用的查询计划能够以最少的工作量提供所需的信息。出于实际目的,选择count*会更快,因为它只向调用数据的应用程序返回一行。@如果您正在测量客户端的执行时间,并且在返回第一行之前不通过计时来更正,则为DanBracuk True,但解释分析报告服务器端执行时间。我的结果来自服务器的日志文件。客户端时间几乎为4分钟。这已被测试了数千次。这仅适用于PostgreSQL 9.2的较新版本。唯一索引位于主键上。是否有任何方法可以查看是否使用了索引?解释选择。。显示所有我不认为OP应该知道查询之间的区别,但为什么它们有如此不同的性能输出我需要的所有数据大约4分钟而不是32秒,如服务器日志所示,但这是客户的度量。我需要知道为什么服务器的日志会有这样的差异。它也包括输出操作吗?要从select*输出所有结果,我需要4分钟而不是32秒,如服务器日志所示。我知道客户端必须输出大量数据,而且速度会很慢,但是服务器的日志文件呢?它也包括输出操作吗?日志中没有不包含客户端处理的时间。而且,当客户端过载时,一些大型数据集的客户端处理可能需要一些时间。这取决于客户端处理的复杂性。易于理解的因为复制输出所需的时间为零,所以像表格这样复杂的、有很多对齐方式的输出可能会很慢。