如何建立合理的索引
在项目开发过程中,我们也可以根据需要定义索引,比如当表结构和Sql稳定后,我们便可以根据该sql执行的频率来决定是否需要为该sql建立索引。Sql中类似where 子句后就单个谓词,我们比较容易建立索引,而如果是多表关联并且谓词关系较多时,我们可以先采用Db2 提供的索引优化工具Db2Advis来帮助我们建立索引,至少它可以综合各个表的存量和各个列的占比为我们提供建议。语法如下:
db2advis -d dbname -i test1.sql -n schema_name -t 5 > wf_task.adv
注:将上述加粗的参数用自己的数据库参数代替;
dbname 是数据库名称
Test1.sql 是存放你待提供建议sql的文件名称
schema_name 是你建立索引所在的视图,这里和表保持一致就好
或者用如下Sql:
db2advis -d dbname -s "SELECT * FROM T1 ORDER BY EMPNO" -m IMCP
注:这里只需要将dbname换成自己的数据库名称,sql statement换成自己的
为了对比索引建立前后带来的不同,除了cost之外,我们还可以去查看它的执行计划,观察走索引到底比没有索引快了多少。我们仍然使用DB2提供的工具 dynexpln或者db2expln语法如下:
db2expln –d dbname –s –g –q “sql statement” –t 或者
dynexpln –d dbname –s –g –q “sql statement” -t
此外在建立索引时,需要注意以下几点:
1) 根据条件中谓词的选择度创建索引
可以简单的通过select count(*) from tabname where col=’X’这样的方式,观察每个谓词条件过滤的总数。过滤出结果集越小,代表选择度越高,如果是建立组合索引,那么应该将该谓词放在首位
2) 避免在建有索引的列上使用函数
3) 在需要被排序的列上建立索引(注意索引的顺序与排序顺序一致),对大表很有效
4) include关键词创建索引
存在这种情况,当表足够大时(通常是百万级),我们需要通过一个谓词col(是唯一的)来获取列中的colA,这时候,如果将colA加入索引很浪费,因为它并没有很大选择性,而如果不加入,当表很大时,fetch cost太高。这是可以用include来将列colA包含进索引,这样不再有多余并且耗时的fetch,include列也不会影响索引的选择性。建立include类索引,必须要求索引字段是唯一的,否则无法include。