达梦索引测试

达梦索引测试

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可减少IO,快速访问数据库表中的特定信息。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。

建设原则:

1索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。(返回数据量占10%以上 建议使用全表扫描,使用多块读操作,提升吞吐量)。

2 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序(先等值再其他,返回数据量,使用频率)

3 对于小型的表,没必要建立索引,优化不明显,增加开销

4 随着数据的变化,索引的效率会下降,因此应定期重建索引

alter index index_name rebuild

CSCN :基础全表扫描(a),从头到尾,全部扫描
SSCN :二级索引扫描(b), 从头到尾,全部扫描
SSEK :二级索引范围扫描(b) ,通过键值精准定位到范围或者单值
CSEK :聚簇索引范围扫描(c) ,通过键值精准定位到范围或者单值
BLKUP :根据二级索引的ROWID 回原表中取出全部数据(b + a)

创建测试表

create table idx (id int,name varchar(50),count int)

构造10万条测试数据

CREATE OR REPLACE PROCEDURE proc_index AS

begin

for i in 1..100000 loop

INSERT INTO  idx (id,name,count)  select i,CHR(MOD(i,27)+65),convert(int,100*rand()) from dual;

end loop;

commit;

end;

调用存储过程,可以看到idx有10万条数据,name为A的有3千多条

call PROC_INDEX

 

没建索引之前,查看执行计划

如下示例,执行计划走了全表扫描CSCN

 

 创建索引,查看执行计划

create index index_t on idx (name)

 explain select /*+INDEX(idx, index_t) */ *  from idx where name='A'

下图可以看到,执行计划走了二级索引范围扫描SSEK

 

创建聚集索引

create cluster index index_t2 on idx(id);

explain select * from idx where id >1000 and id <2000

如下所示,执行计划走了聚簇索引范围扫描CSEK

 

创建组合索引

create index index_t3 on idx(name,count)

explain select  /*+INDEX(idx, index_t3) */ * from idx where  name='A' and count=50

 

删除组合索引,查看执行计划

drop index index_t3

 

下列情况不走索引

索引列上使用函数

 

 索引列上进行计算

 

索引列上使用IS NULL和IS NOT NULL

 

索引列上做了隐式转换(经测试,实际上走了索引)

 

返回结果过多

1 聚集索引创建之后执行计划都能走索引

 

2 经测试,除了聚集索引,其他索引如不加hint,执行计划还是走的全表扫描

create index index_t5 on idx(count);

3 加hint之后,执行计划虽走了索引,因返回值过多,开销太大,优化不明显

 

查看索引信息

select table_name,index_name from dba_indexes where table_name=表名

 

 

posted @ 2021-01-08 10:33  fangzpa  阅读(1612)  评论(0编辑  收藏  举报