优化建立索引时的系统环境

优化建立索引时的系统环境》摘要: 在OLTP和DSS环境下建立索引 如果查询结果仅为一行或很少几行时(高选择性high selectivity),利用索引进行查询会大大提高效率。相比之下,如果没有索引,查询则只能顺序扫描整个表。在OLTP环境…

在OLTP和DSS环境下建立索引

如果查询结果仅为一行或很少几行时(高选择性high selectivity),利用索引进行查询会大大提高效率。相比之下,如果没有索引,查询则只能顺序扫描整个表。在OLTP环境下,事务处理在很大程度上依赖于索引。只有在表很小时,才会顺序扫描表。系统会根据SQL语句中的WHERE子句判断是否使用索引。顺序扫描表会使系统性能受到严重影响。sysmaster中sysptntab表中的pf_seqscnas列显示了所进行的顺序扫描。SET EXPLAIN命令同样可以提供关于SQL语句如何访问数据库中的重要信息。

DSS环境中的应用经常会查询出大量数据(低选择性 low selecviity),甚至整张表。顺序扫描对于这样的查询更为适合,因为此时顺序扫描可以利用light scan。light scan缓冲区位于共享内存的虚拟段与驻留段无关。关于light scan,以后章节中还将详述。

建立索引的代价

虽然索引可以很大地提高高选择性查询的性能,但维护这些索引是需要付出代价的。 以INSERT语句为例,在进行插入时系统首先将读取被插入表的索引以定位新记录关键字的位置。然后系统在将新记录写入数据页的同时还必须将新索引项写入索引节点。如果导致索引节点分裂,系统则必须多次写索引页

与INSERT语句相似,DELETE语句也要求读入整个索引以定位索引节点位置,并置上删除标志。在删除索引时还需要处理索引节点合并、整理等问题。

在执行UPDATE语句时,必须首先定位并且删除旧的关键字然后插入新的关键字。所以在UPDATE语句必须两次读取索引。

在实际系统中通常把索引的根节点和第一级节点读入共享内存中,但如果需要访问更低层次的索引节点则必须进行磁盘操作。

索引类型

通常建立分离索引(detached)或基于表达式的索引分片(expression based fragmented)。分离索引和分片索引可以使得索引的extent内页连续,因而能提高性能。而对于不分片的表来说,附加索引(attached)在建立索引时,索引页和数据页交叉存放在一起,因而会增加磁头寻找时间。

对于中、小型表应该建立分离索引。对于经常访问的大表应建立基于表达式的分片索引,以减少索引页的数量和提高检索速度。索引分片不宜太多,以免表达式计算开销过大。根据索引的大小,一般可以分为4片。索引分片不支持轮转法(round robin)。

分离式索引与数据页分别存放在不同的数据空间中。例如:

CREATE INDEX index1 ON TABLE table_name(col1) in idxldbs;

基于表达式的分片索引在FRAGMENT BY EXPRESSION 子句指定的数据空间中创建。例如:

CREATE INDEX index1 on TABLE table_name(col1)

FRAGMENT BY EXPRESSION

col1>=0 and col1<=25000 in idxldbs1

col1>=25001 and col1<=50000 in idxldbs2

col1>=50001 and col1<=75000 in idxldbs3

共3页: 上一页 1 [2] [3] 下一页
你的位置:电脑故障网 >> 数据库 >> Informix >> 优化建立索引时的系统环境