2008年(239)
分类: DB2/Informix
2008-06-17 23:45:54
对表中数据的访问,可以使用表扫描,也可以使用索引访问。对一个SQL语句来说,究竟采用哪种数据访问路径,最终由优化器决定。
使用索引访问表中数据时,系统首先要将索引页读入内存,根据索引记录中的指针,找到数据所在表中的数据页,然后再将数据页读入内存,进而找到所需数据。使用索引访问表中的一条记录,至少需要两次的I/O操作。
优化器通过估算I/O操作的多少,来决定表的访问路径。对建有索引的表,优化器并不总是按照索引访问表中的数据。有时候使用索引找到所需数据,会比单纯的表扫描需要更多的I/O操作。在下列情况下,优化器会使用表扫描而不会选择索引,来作为数据的访问路径:
(1)表中的记录较少,只使用很少的数据页。
在这种情况下,优化器采用表扫描方式访问数据。依据索引访问,反而会增加磁盘的I/O操作。同时我们也可以看出,在这种小数据量的表上建立索引,对数据的查询不会有所帮助,反而影响到表的更新操作。
(2)查询语句需要返回大量的记录。
如果一个查询语句需要从表中返回大量的记录,例如:返回记录占表中总记录的30%以上,使用索引将需要更多的I/O操作。这时表扫描会是更好的数据访问路径。
(3)查询语句的条件选择中包含多个条件。
如果查询语句中的多个条件是或的关系,或者可以使用索引的查询条件不能有效地降低记录的数目,在这种情况下系统就使用一次表扫描,同时检查所有的查询条件。将多个条件分开、使用索引查询,再进行记录集合并,将需要更多的I/O操作。
(4)表上没有索引,或者有索引,但无法使用。
为经常需要访问的表建立索引。索引的创建,应结合应用程序,根据查询条件中字段的使用频度,决定在那些字段上建立索引。至于索引创建所需要遵循的一些原则,可见第5.6.1一节。
(5)SQL语句的写法存在问题。
至于如何写好SQL语句,我们将在第5.6.2一节中说明。