2013-04-17 21 views
0

例如,记录中有20个字段,其中包括20个字段中的5个索引字段。如果给定了适当的列索引,并且将使用索引字段检索数据。我想在下面讨论两种情况。从数据库检索字段或整个记录时花费多少成本

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

我知道的唯一差别是,在情况1中,系统使用数据量小,所以它的较少花公交车辆。但是在检索时间方面,我不确定在这两种情况下硬件操作是否会有所不同,因为我认为无论有多少字段,在数据库上检索任务的主要成本都是查找记录。它是否正确?

+0

谢谢!我认为我的问题和这个问题在这个环境中有点不同。在这种情况下,column1,column2,column3 ...都是这些字段,这意味着检索目标是相同的。但我想讨论的是从记录中检索一个字段,然后检索整个记录。检索目标不同。 –

+0

这是**高**供应商特定。对于SQL Server,它总是以8k页的形式读写数据 - 所以即使你只是改变一个'BIT',你也会有8K被读取,8K被写入。 –

+0

在建议的重复问题(涵盖索引等)方面,存在有价值和正确的建议。如果您需要选择来自单个索引的字段,那么DBMS可能会执行仅索引扫描,而不从表中提取数据行 - 由于I/O较少,速度会更快。如果你需要所有的数据,它通常需要从表中读取行(不会有索引覆盖所有列)以及用于加快查询的索引。如果你不需要所有的数据,那就值得尽量减少你选择的数据;它也需要时间来传输。 –

回答

0

假设你从heap-based表中检索和您的WHERE子句是相同在两种情况下:

  1. 它重要领域(S)被检索是否在索引或没有。如果它在索引中,DBMS将不需要访问表堆 - 这被称为index-only scan。如果它不在索引中,则DBMS必须访问该字段所在的堆页面,如果尚未缓存,可能需要额外的I/O。
  2. 如果您正在阅读整行,则其所有字段的所有字段都被DBMS查询计划程序选择使用的索引覆盖的可能性较小,因此您很可能会支付表堆的I/O成本访问。这对于单行来说并不是那么糟糕,但是如果检索到很多行并且索引的clustering factor不好,那么可以绝对破坏性能。

的情况是类似的,但对于clustered表稍微复杂一些,因为索引往往甚至覆盖PK字段时没有明确提及在CREATE INDEX,和表中的“主”部分不能(通常)被直接访问,但通过索引寻求。正如您已经注意到的那样,传输更多数据会给网络带宽带来更大的压力。

由于这些原因,总是试着选择你所需要的,而不是更多。


一个好的查询优化器会注意到并执行全表扫描,因为它更便宜,即使该指数是可用的。

+0

为什么全表扫描更便宜? –

+0

@MarcusThornton因为对索引进行扫描时,如果集群因子不好,会导致整个表堆堆积如此之多的“跳跃”,导致最终读取的页面数比表堆中的实际页数多得多(读取每个页面多次)。如果表格不够小,无法放入缓存,这一点尤其糟糕。 –

+0

我得出结论。谢谢。 –

0

读取多个材料我来的结论:在执行查询时

  1. 只选择那些领域需要。
  2. 如果只扫描索引字段,数据库将执行快速索引搜索。
  3. 当试图获取包含未索引字段的许多行时,最糟糕的情况是查询将执行与行数一样多的块I/O,这非常昂贵。因此,更好的方法是执行全表扫描,因为块I/O的总数等于块的总数,这可能远小于行数。