DB2索引创建都应该哪些原则呢?这是很多人都提到的问题,下面就为您详细介绍DB2索引创建原则,供您参考学习。
DB2索引实现是一个B+树,通过索引可以实现快速查询,避免全表扫描以此来减少IO操作。
索引是对表数据的一种抽象,通过抽取有限数据,对数据的分布进行计算,以此来完成对数据的快速检索。
索引创建语句
- CREATE INDEX <INDEX_NAME> ON <TABLE_NAME> (<COLNAME1,COLNAME2…>)
创建索引需要注意的地方:
索引应该用来提高查询速度,但是会对更新和删除操作带来负面影响,因为要同步更新索引。所以索引应该创建到更新、删除相对比读取少的表上。
索引需要独立的空间进行存储和管理。索引是需要磁盘空间来存储。所以避免重复创建冗余索引。如下:
- “CREATE TABLE TEST_IDX (COL1 INT NOT NULL, COL2 INT NOT NULL, COL3 IN NOT NULL)”“CREATE INDEX TEST_IDX_IDX1 ON TEST_IDX (COL1, COL2, COL3)”
已经有索引TEST_IDX_IDX1在三个列上,在创建”CREATE INDEX TEST_IDX_IDX2 ON TEST_IDX (COL1, COL2)”,这样的索引一般没有什么作用。
索引用来避免表扫描。通过索引对大量数据抽取有限部分,形成一个相对少量的有序数据结构,通过对有序数据结构的查找可以快速想要查找的数据。所以索引适合建立在数据量比较大的表上,而且该表上的查询经常是根据条件查询部分数据。比如一些系统基础表,如SYSTEM表,这些表数据量小,而且经常是查询全部数据,所以这些表上建立索引对性能的影响不是很大,完全可以避免,以免对管理造成影响。
创建索引的目的还有一个就是保证数据唯一性,可以利用”CREATE UNIQUE INDEX <INDEX_NAME> ON <TABLENAME> (<COLNAME>)”,来完成。
主键会隐式创建索引,所以请不要在主键上创建索引浪费空间。
尽量减少索引的创建。DB2路径访问优化器会根据表中所提供的索引来完成尽可能多的访问路径的成本估计。创建过多的索引意味着DB2优化器生成更多的访问路径,完成更多的访问计划成本估算,这会增加SQL语句编译时间。
创建唯一索引可以避免排序。因为索引是有序数据结构,在进行扫描时,DB2会默认按照顺序输出结果,而不是按照插入先后。通过创建唯一索引可以避免排序,提高查询性能。
具有大量重复数据的列上不要创建索引。在大量重复的列上创建索引没有任何意义。如下数据结构:表中字段col1有大量重复数据,其中的数据分布是按照90%的Y,和10%的N来分布。这样的列上创建索引没有任何意义。在查询条件为col1=‘Y’时,该表的索引扫描和表扫描没有特大差异。根据实践经验,列上的数据分布应该均匀,并且抽密度不能大于5 ‰。
创建如下表:
- “CREATE TABLE TEST1 (NO INT NOT NULL, NAME CHAR(5))”
- “CREATE INDEX TEST1_IDX_1 ON TEST1 (NO)”
- “INSERT INTO TEST1 SELECT ROW_NUMBER() OVER(), CHR(INT(RAND()*75+48))||CHR(INT(RAND()*75+48))||CHR(INT(RAND()*75+48)) FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1.COLNAME!=T2.COLNAME FETCH FIRST 100 ROWS ONLY“
- “SELECT * FROM TEST1 WHERE NO = 50”
以上就是DB2索引创建原则介绍。