利用索引
CREATE INDEX ONLINE 和 DROP INDEX ONLINE
目前可以以非独有的方式创建和删除索引。可以利用 CREATE INDEX ONLINE
和 DROP INDEX ONLINE
语法在联机大概静态状况中创建和删除索引。数据库和它的相干表不会被独有地锁住,以是可以被更新或读取。
在索引创建时期,如果索引创立地带 ONLINE
要害字,则不用要在表上安排独有锁。可以在表上举办读取和更新。索引的创建不用等到可以在表上安排独有锁。
如果索引是带 ONLINE
要害字创建的,则数据库效能器用一个特定的标记记实操纵。目前,规复操纵将搜检阿谁标记,而且可以从头创建索引。
利用 CREATE INDEX ONLINE
语句创建索引的所长有:
- 可以当即创建索引,不用在表上安排锁。
- 在创建索引的同时可以对表举办更新。
- 优化器可以更新未被锁的表中的统计信息,从而可以得到更佳的盘查狡计。
可以利用 CREATE INDEX ONLINE
语法创建附属索引,但是 ONLINE
语法只在变乱接连中断级别为脏读(dirty read)时才适用。索引创立地在表上安排一个独有锁,并守候统统其他扫描表的、利用索引分区的并发过程竣事,然后才创建附属索引。如果这个表正在被读取或更新,则 CREATE INDEX ONLINE
语句守候独有锁。
如果 LOCK MODE
没有被设为 WAIT
,则附属索引的创建可以或许失败,因为它不会守候其他用户完成。
详尽: 在索引创建之后,当引擎更新细碎编目信息时,它会短功夫地安排一个锁。
上面的清单 5 供给了带 ONLINE
要害字利用 CREATE INDEX
的语法:
清单 5. 带 ONLINE 要害字的 CREATE INDEX 示例
CREATE INDEX i1 ON tab1(c1) ONLINE
ONLIDX_MAXMEM
ONLIDX_MAXMEM
设置参数用于限定分派给原像日志池或更新日志池的内存年夜小。这些池是用 ONLINE
要害字创建索引时在共享内存中创建的。如果您狡计在被索引(利用 ONLINE 语法)的表列上完成其他操纵,哪里这可以或许有效。
ONLIDX_MAXMEM
的取值领域是 16KB 到 4294967295。在 onconfig.std 中的默许年夜小是 5120。
这个设置参数可以用 onmode -wf
静态所在窜大概用 onmode -wm
下令取代。
DROP INDEX ONLINE
DROP INDEX ONLINE
允许删除索引,而不用要独有锁。纵然在变乱接连中断级别为脏读时也可以删除索引(利用 ONLINE
要害字)。
利用 DROP INDEX ONLINE
语句删除索引的所长有:
- 可以间接删除低效的索引,而不会搅扰正在运转的盘查,纵然有盘查在利用阿谁索引也仍旧可以删除它。
- 盘查优化器将被赐顾到临不要将阿谁索援用于表上的新的 SELECT 操纵。
DROP INDEX ONLINE
在表更新完成之后才实行。发出 DROP INDEX ONLINE
语句之后,新的操纵不克不及援用该索引,但是以后的操纵可以利用该索引,直到操纵完成。数据库效能器等到一确切前用户拜候完索引之后才删除索引。
清单 6 包括带 ONLINE 语法利用 DROP INDEX 的例子:
清单 6. 带 ONLINE 语法利用 DROP INDEX 的示例
DROP INDEX i1 ONLINE
索引自衔接
索引自衔接是指一个表与它自己衔接的一种衔接。
在以下状况下,索引自衔接可以扶直提高功能:
- 盘查触及引导键,大概索引的最严重的列(常日是第一个列)有良多重复
- 用一个引导键搜检的成本或行数年夜于搜检非引导键列前往的行数的成本
邃晓个中的义务原理的法子是考虑盘查被拆分红有良多子盘查的结合(union)。每个子盘查是非限定性引导键列的效果集。然后,优化器可以考虑那些列,并利用它们创造更无限定性的非引导键列。
创建索引自衔接
如果必要自衔接,则法子是利用别名,以便在 from 子句中可以两次列出统一个表。
清单 7. 天生自衔接的示例语法
SELECT a1.customer_num FROM customer a1, customer b1 WHERE a1.customer_num = b1.customer_num AND ... Additional logic here
详尽两平凡名都援用统一个表。
自衔接盘查狡计和 sqexplain 输入
在盘查狡计中可以很年夜略地确定自衔接:
清单 8. 施展阐明自衔接的正文输入的示例片段
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 index parameter 和 NO_SORTINDEX 状况变量
NO_SORT
是用于索引创建的一个新选项,有助于提高特定场景(比方静态集群表)中的功能。
有了 NO_SORT
,可以利用一个前往数值空间键的函数以凭据一个函数 B-树索引创建静态集群表。当在天生的集群表上创建一个 R-树索引时,R-树副手拜候法子不用要对数据排序。它将自下而上创建索引,因为表已经凭据 自下而上创建 R-树时所利用的不异的尺度排过序。排序由 B-树函数索引完成。
欲利用 NO_SORT
索引参数创建 R-树索引,须依照以下步伐:
- 检察 DataBlade 模块文档,找到可凭据给定的被索引数据范例圭臬范例工具前往空间键的函数。
- 利用这个函数在表上创建一个集群函数 B-树索引。
- 利用
NO_SORT="YES"
语法在被用作空间键的列上创建一个 R-树索引。 - 至此,B-树索引已经没有相干,因此可以被删除。
利用 NO_SORT 语法创建 R-树索引的例子
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 状况变量
如果状况中设置了 NOSORTINDEX
状况变量,那么创建 R-树索引的默许行为相当于设置 NO_SORT="YES"
。
版权声明:
原创作品,允许转载,转载时请务必以超链接方式标明文章 原始因由 、作者信息和本声明。否则将究查法律责任。