Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427382
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

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一节。

5SQL语句的写法存在问题。

至于如何写好SQL语句,我们将在第5.6.2一节中说明。

阅读(582) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~