6

这个说法是真是假

这些查询的性能

SELECT * FROM table;

UPDATE table SET field = 1;

SELECT COUNT(*) FROM table;

是相同的

或者有没有一种情况,其中一个的表现会与另一个有很大的不同?

更新

  1. 如果 SELECT 和 UPDATE 之间存在很大差异,我会更感兴趣。如果需要,您可以忽略 COUNT(*)
  2. 假设 select 执行全表扫描。更新还将对表中的所有行执行更新。
  3. 假设更新只更新一个字段 - 尽管它会更新所有行(它是一个索引字段)
  4. 我知道他们会花不同的时间做不同的事情。我想知道的是差异是否显着。例如。如果更新将花费比选择长 5 倍的时间,那么这很重要。以此为阈值。而且没有必要精确。只给出一个近似值。
4

5 回答 5

8

涉及不同的资源类型:

  • 磁盘 I/O(这是每个 DBMS 中成本最高的部分)
  • 缓冲压力:取一行会导致从磁盘上取一个页面,这需要缓冲内存存储在
  • 用于中间表、结构和聚合的工作/临时内存。
  • 前端进程的“终端”I/O。
  • 锁定、序列化、版本控制和日志的成本
  • CPU 成本:在大多数情况下可以忽略不计(与磁盘 I/O 相比)

问题中的UPDATE查询是最难的:它将导致获取表的所有磁盘页面,放入缓冲区,更改为缓冲区并写回磁盘。在正常情况下,还会导致其他进程被锁死,从而产生争用甚至更大的缓冲压力。

SELECT *查询也需要所有页面;它需要将它们全部转换/格式化为前端格式并将它们发送回前端。

SELECT COUNT(*)在所有资源上,这是最便宜的。在最坏的情况下,必须获取所有磁盘页面。如果存在索引,则需要更少的磁盘 I/O 和缓冲区。CPU 成本仍然可以忽略不计(恕我直言),“终端”输出是微不足道的。

于 2013-10-10T22:12:42.277 回答
7

当您说“性能”时,您的意思是“执行它们需要多长时间”?

  • 其中之一是返回所有行中的所有数据。
  • 其中之一(如果您删除“FROM”)正在将数据写入行。
  • 一种是计算行数并且不返回行中的任何数据。

所有这三个查询都在做完全不同的事情。因此,可以合理地得出结论,它们三个都将花费不同的时间来完成。

最重要的是,你为什么要问这个问题?你想解决什么问题?我有一种不好的感觉,你问这个问题会走错路。

于 2013-10-10T21:39:58.793 回答
2

我在工作中有一个大的(授予索引的)表,这就是我发现的

select * from X(限于前 100,000 条记录)(12.5 秒)

select count(*) from X(返回数百万条记录)(15.57 秒)

索引表的更新非常快(不到一秒)

于 2013-10-10T21:40:40.303 回答
1

所有三个查询都做了截然不同的事情。

它们各有自己的性能特点,不能直接比较。

您能澄清一下您要调查的内容吗?

于 2013-10-10T21:39:37.570 回答
1

SELECT 和 UPDATE 应该大致相同(但它们很容易变化,这取决于数据库)。COUNT(*) 缓存在许多数据库中,在某种程度上,因此查询很容易成为 O(1)。当然,UPDATE 的惰性实现也可能是 O(1),但我不知道目前有人这样做。

tl;博士:“错误”或“取决于”。

于 2013-10-10T21:38:13.867 回答