0

例如,一条记录有 20 个字段,其中包括 20 个字段中的 5 个索引字段。给定列上的正确索引已设置,并且将使用索引字段检索数据。我想讨论以下两种情况。

  1. 从记录中检索字段
  2. 检索整个记录

我知道的唯一区别是,在案例 1 中,系统使用的数据量很小,因此它在总线流量上的花费更少。但是在检索时间方面,我不确定这两种情况在硬件操作方面是否会有任何差异,因为我认为在数据库上检索任务的主要成本是找到记录,而不管有多少字段。这个对吗?

4

2 回答 2

0

假设您正在从基于堆的表中检索,并且您的 WHERE 子句在两种情况下都是相同的:

  1. 被检索的字段是否在索引中很重要。如果它在索引中,则 DBMS 将不需要访问表堆 - 这称为index-only scan。如果它不在索引中,则 DBMS 必须访问该字段所在的堆页面,如果尚未缓存,则可能需要额外的 I/O。
  2. 如果您正在读取整行,则其所有字段都不太可能被 DBMS 查询计划器选择使用的索引覆盖,因此您更有可能支付表堆访问的 I/O 成本。这对于单行来说并不是那么糟糕,但如果检索到许多行并且索引的聚类因子为 bad 1 ,则绝对会破坏性能。

对于聚簇表,情况类似但稍微复杂一些,因为即使在 CREATE INDEX 中没有明确提及,索引也倾向于覆盖 PK 字段,并且表的“主要”部分不能(通常)直接访问,而是通过索引查找.

最重要的是,正如您已经指出的那样,传输更多数据会给网络带宽带来更大压力。

由于这些原因,请始终尝试准确地选择您需要的东西,仅此而已。


1一个好的查询优化器会注意到这一点并执行全表扫描,因为它更便宜,即使索引可用。

于 2013-04-17T09:57:37.697 回答
0

阅读了一些材料,我得出了结论:

  1. 仅选择执行查询时所需的那些字段。
  2. 如果只扫描索引字段,则数据库将执行仅索引搜索,速度很快。
  3. 当尝试获取许多包含未索引字段的行时,最坏的情况是查询将执行与行数一样多的块 I/O,这是非常昂贵的成本。所以更好的方法是执行全表扫描,因为块 I/O 的总数等于块的总数,可能远小于行数。
于 2013-04-19T03:17:16.840 回答