索引扫描和表扫描之间的I/O操作成本在访问数据,读取的页数以及基于查询选择性和数据组织的效率方面有所不同。
索引扫描涉及通过遍历索引结构(通常为B树)来访问数据。这里的成本主要包括两个组成部分:访问索引页的成本以及获取相应表页的成本。索引页面通常具有随机访问模式,因为索引叶节点可能在磁盘上物理连续不连续,从而导致随机的I/O操作。每个逻辑从根部到叶子的索引树都需要读取页面,并且使用系统的随机页面成本参数估算此费用。找到相关行的索引条目后,系统获取相应的表数据页面。此类数据页的数量获取取决于查询的选择性以及存储的数据和索引顺序(称为相关)之间的物理相关性。高相关性意味着索引条目行的位置与物理数据顺序非常匹配,减少了随机I/O并使索引扫描更有效。另一方面,低相关性导致许多随机提取,从而大大增加了I/O的成本。
索引扫描中的CPU成本包括处理检索每个单独的行,但主要成本问题是I/O。还有一个可见性的方面:如果数据库具有可见性图跟踪哪些数据页面对所有交易都可以完全可见,则系统有时可以在仅索引扫描过程中完全跳过读取某些页面,从而大大降低I/O成本。
相比之下,表扫描或全表扫描通过从表格上依次读取所有数据页来进行操作。这里的I/O主要是顺序的,在旋转磁盘上或对SSD的惩罚更少的速度比随机I/O更快。全表扫描的成本相对恒定,因为它读取整个表不管满足查询的行的数量如何。此成本取决于表中的页面总数,而不是所选行数。全表扫描不会从选择性中受益;他们也必须阅读每个页面,即使查询大量过滤了行。但是,借助现代存储技术和优化,诸如多块读取,并行读取和存储层卸载,全表扫描的成本可能具有竞争力,甚至比索引扫描的查询范围少于检索大部分表的查询。
基于成本的优化器(CBO)决定使用索引扫描和基于估计成本的全表扫描。对于高度选择性的查询,只需要检索一小部分的行 - 索引扫描的成本往往较低,因为获取了较少的表页面。随着选择性阈值的增加(需要更多的行),索引扫描的I/O成本增加了,由于随机页面获取和索引遍历的数量越高,最终超过了全表扫描的成本。在这一点上,CBO有利于表扫描,因为顺序I/O成本小于许多索引查找的随机I/O负担。
影响I/O成本差异的另一个重要因素是“聚类因子”或与索引密钥相对应的行的物理聚类。较低的聚类因子(更好的聚类)意味着通过索引访问的行彼此靠近,从而降低了随机I/O并提高了索引扫描效率。与表扫描相比,较高的聚类因子在索引扫描过程中导致更随机的I/O可降低其好处。
现代数据库系统还可以实施并行扫描索引和全表扫描,其中I/O和CPU资源在多个工人中共享,这可以减少总查询时间。但是,I/O用于索引扫描(随机页面访问)与表扫描(主要是顺序页面访问)的基本性质仍然是关键区别。
总结有关I/O成本差异的关键点:
- 索引扫描产生的I/O读取索引页(随机访问)以及获取相应的数据页面(可能随机访问)的成本。成本对选择性,相关性和聚类因子敏感。
- 完整的表扫描执行顺序i/o读取所有页面,无论选择性如何,相对稳定的I/O成本都相对稳定。
- 当查询针对少量数据子集时,索引扫描的表现可以胜过,但随着选择性的上升,索引扫描却遭受了随机的I/O台面的困扰。
- 由于有效的顺序I/O,当很大一部分需要访问桌子时,完整的表扫描可能会更有效。
- 可见性图和仅索引扫描可以通过避免读取数据页面读取某些索引扫描案例中的I/O成本。
- 并行性可以改善两种扫描类型,但不会改变基本的I/O特征。
- 优化器平衡了这些成本因素,以根据查询和数据特征选择最有效的方法。