Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91215460
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-05-31 16:55:56

使用索引

现在可以以非独占的方式创建和删除索引。可以使用 CREATE INDEX ONLINEDROP INDEX ONLINE 语法在联机或者动态环境中创建和删除索引。数据库和它的相关表不会被独占地锁住,所以可以被更新或读取。

在索引创建期间,如果索引创建时带 ONLINE 关键字,则不需要在表上放置独占锁。可以在表上进行读取和更新。索引的创建不必等到可以在表上放置独占锁。

如果索引是带 ONLINE 关键字创建的,则数据库服务器用一个特定的标志记录操作。现在,恢复操作将检查那个标志,并且可以重新创建索引。

使用 CREATE INDEX ONLINE 语句创建索引的优点有:

  • 可以立即创建索引,不必在表上放置锁。
  • 在创建索引的同时可以对表进行更新。
  • 优化器可以更新未被锁的表中的统计信息,从而可以获得更佳的查询计划。

可以使用 CREATE INDEX ONLINE 语法创建附属索引,但是 ONLINE 语法只在事务隔离级别为脏读(dirty read)时才适用。索引创建时在表上放置一个独占锁,并等待所有其他扫描表的、使用索引分区的并发进程结束,然后才创建附属索引。如果这个表正在被读取或更新,则 CREATE INDEX ONLINE 语句等待独占锁。

如果 LOCK MODE 没有被设为 WAIT,则附属索引的创建可能失败,因为它不会等待其他用户完成。

注意: 在索引创建之后,当引擎更新系统编目信息时,它会短时间地放置一个锁。

下面的清单 5 提供了带 ONLINE 关键字使用 CREATE INDEX 的语法:



                    				
CREATE INDEX i1 ON tab1(c1) ONLINE

ONLIDX_MAXMEM 配置参数用于限制分配给原像日志池或更新日志池的内存大小。这些池是用 ONLINE 关键字创建索引时在共享内存中创建的。如果您计划在被索引(使用 ONLINE 语法)的表列上完成其他操作,那儿这可能有用。

ONLIDX_MAXMEM 的取值范围是 16KB 到 4294967295。在 onconfig.std 中的默认大小是 5120。

这个配置参数可以用 onmode -wf 动态地修改或者用 onmode -wm 命令取代。

DROP INDEX ONLINE 允许删除索引,而不需要独占锁。即使在事务隔离级别为脏读时也可以删除索引(利用 ONLINE 关键字)。

使用 DROP INDEX ONLINE 语句删除索引的优点有:

  • 可以直接删除低效的索引,而不会干扰正在运行的查询,即使有查询在使用那个索引也仍然可以删除它。
  • 查询优化器将被通知不要将那个索引用于表上的新的 SELECT 操作。

DROP INDEX ONLINE 在表更新完成之后才执行。发出 DROP INDEX ONLINE 语句之后,新的操作不能引用该索引,但是当前的操作可以使用该索引,直到操作完成。数据库服务器等到所有当前用户访问完索引之后才删除索引。

清单 6 包含带 ONLINE 语法使用 DROP INDEX 的例子:



                    				
DROP INDEX i1 ONLINE







索引自连接是指一个表与它自己连接的一种连接。

在以下情况下,索引自连接可以帮助提高性能:

  • 查询涉及引导键,或者索引的最重要的列(通常是第一个列)有很多重复
  • 用一个引导键检查的成本或行数大于检查非引导键列返回的行数的成本

理解其中的工作原理的方法是考虑查询被拆分成有很多子查询的联结(union)。每个子查询是非限制性引导键列的结果集。然后,优化器可以考虑那些列,并使用它们发现更有限制性的非引导键列。

如果需要自连接,则方法是使用别名,以便在 from 子句中可以两次列出同一个表。



                    				
SELECT a1.customer_num 
FROM customer a1, customer b1
WHERE a1.customer_num = b1.customer_num AND
... Additional logic here

注意两个别名都引用同一个表。

在查询计划中可以很简单地确定自连接:



                    				5
Index Self Join Keys (customer_num lname )
   Lower bound: informix.a.customer_num >= 00702 AND 
   (informix.a.lname >= 'Aaron ' ) 
   Upper bound: informix.a.customre_num <= 12345 AND 
   (informix.a.lname <= 'Croyle' )

注意,索引自连接中涉及的列中的键将被显示。

有两个优化器指令可用于指示优化器使用自连接功能:

  • INDEX_SJ 指令强制索引自连接路径使用指定的索引,或者从索引列表中选择成本最低的索引,即使没有关于引导索引键列的数据分布统计信息也是如此。
  • AVOID_INDEX_SJ 指令防止自连接使用指定的索引或索引列表。






NO_SORT 是用于索引创建的一个新选项,有助于提高特定场景(例如静态集群表)中的性能。

有了 NO_SORT,可以使用一个返回数值空间键的函数以根据一个函数 B-树索引创建静态集群表。当在生成的集群表上创建一个 R-树索引时,R-树辅助访问方法不需要对数据排序。它将自下而上创建索引,因为表已经根据 自下而上创建 R-树时所使用的相同的标准排过序。排序由 B-树函数索引完成。

欲使用 NO_SORT 索引参数创建 R-树索引,须遵循以下步骤:

  1. 查看 DataBlade 模块文档,找到可根据给定的被索引数据类型对象返回空间键的函数。
  2. 使用这个函数在表上创建一个集群函数 B-树索引。
  3. 使用 NO_SORT="YES" 语法在被用作空间键的列上创建一个 R-树索引。
  4. 至此,B-树索引已经没有关系,因此可以被删除。



                    				
CREATE CLUSTER INDEX btree_functional_index ON
    table1 (SpatialKey(column1));

"btree_functional_index" 是集群函数 B-树索引的名称; "table1" 是表的名称。 "SpatialKey" 是所创建的索引的名称;"column1" 是包含空间数据的列的名称。


                    				
CREATE INDEX rtree_index ON table1 (column1 op1) 
    USING RTREE (NO_SORT = 'YES');

"rtree_index" 是 R-树索引的名称; "op1" 是与列 column1 关联的操作符类型的名称。


                    				
DROP INDEX btree_functional_index;

如果环境中设置了 NOSORTINDEX 环境变量,那么创建 R-树索引的默认行为相当于设置 NO_SORT="YES"

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