DB2索引

--索引创建原则

DB2索引创建都应该哪些原则呢?这是很多人都提到的问题,下面就为您详细介绍DB2索引创建原则,供您参考学习。

DB2索引实现是一个B+树,通过索引可以实现快速查询,避免全表扫描以此来减少IO操作。

索引是对表数据的一种抽象,通过抽取有限数据,对数据的分布进行计算,以此来完成对数据的快速检索。

索引创建语句

 
 
  1. CREATE INDEX <INDEX_NAME> ON <TABLE_NAME> (<COLNAME1,COLNAME2…>

创建索引需要注意的地方:

索引应该用来提高查询速度,但是会对更新和删除操作带来负面影响,因为要同步更新索引。所以索引应该创建到更新、删除相对比读取少的表上。

索引需要独立的空间进行存储和管理。索引是需要磁盘空间来存储。所以避免重复创建冗余索引。如下:

 
 
  1. “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)”,这样的索引一般没有什么作用。

wenchao注释:真的是这样的吗????----待以后深入了解

索引用来避免表扫描。通过索引对大量数据抽取有限部分,形成一个相对少量的有序数据结构,通过对有序数据结构的查找可以快速想要查找的数据。所以索引适合建立在数据量比较大的表上,而且该表上的查询经常是根据条件查询部分数据。比如一些系统基础表,如SYSTEM表,这些表数据量小,而且经常是查询全部数据,所以这些表上建立索引对性能的影响不是很大,完全可以避免,以免对管理造成影响。

创建索引的目的还有一个就是保证数据唯一性,可以利用”CREATE UNIQUE INDEX <INDEX_NAME> ON <TABLENAME> (<COLNAME>)”,来完成。

主键会隐式创建索引,所以请不要在主键上创建索引浪费空间。

尽量减少索引的创建。DB2路径访问优化器会根据表中所提供的索引来完成尽可能多的访问路径的成本估计。创建过多的索引意味着DB2优化器生成更多的访问路径,完成更多的访问计划成本估算,这会增加SQL语句编译时间。

创建唯一索引可以避免排序。因为索引是有序数据结构,在进行扫描时,DB2会默认按照顺序输出结果,而不是按照插入先后。通过创建唯一索引可以避免排序,提高查询性能。

具有大量重复数据的列上不要创建索引。在大量重复的列上创建索引没有任何意义。如下数据结构:表中字段col1有大量重复数据,其中的数据分布是按照90%的Y,和10%的N来分布。这样的列上创建索引没有任何意义。在查询条件为col1=‘Y’时,该表的索引扫描和表扫描没有特大差异。根据实践经验,列上的数据分布应该均匀,并且抽密度不能大于5 ‰。

创建如下表:

 
 
  1. “CREATE TABLE TEST1 (NO INT NOT NULL, NAME CHAR(5))”  
  2.  
  3. “CREATE INDEX TEST1_IDX_1 ON TEST1 (NO)”  
  4.  
  5. “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“  
  6.  
  7. “SELECT * FROM TEST1 WHERE NO = 50”  

以上就是DB2索引创建原则介绍。

转自:http://database.51cto.com/art/201011/232342.htm


--DB2数据库中索引的语法介绍

DB2索引的语法是学习DB2数据库的基础知识,下面就为您详细介绍DB2索引的语法,希望可以对您学习DB2索引的语法方面有所帮助。

  CREATE INDEX

  CREATE INDEX 语句用来为 DB2 Everyplace 表创建索引。

  调用

  此语句可以在使用 DB2 CLI 函数的应用程序中使用,也可以通过 CLP 发出。

  语法

  >>-CREATE--INDEX--index-name--ON--table-name-------------------->

  .-,-----------------------------------------.

  V .-ASC--. |

  >--(----+-column-name-----------------+--+------+-+--)---------><

  +-UCASE--(--| expression |--)-+ '-DESC-'

  '-LCASE--(--| expression |--)-'

  描述

  INDEX index-name

  命名索引。

  ON table-name

  table-name 命名要对其创建索引的表。

  column-name

  对于索引,列名标识要作为索引键一部分的列。

  每个列名都必须是标识一个表列的未限定名。使用 8 列或更少的列;不能重复列名(SQLSTATE 42711)。

  每个指定列的长度一定不能超过 1024 字节。

  ASC

  按列以升序顺序排列索引条目。这是缺省值。

  DESC

  按列以降序顺序排列索引条目。

  LCASE / UCASE

  LCASE 或 LOWER 函数返回一个字符串,其中所有 SBCS 字符都已转换为小写字符。即,字符 A 至 Z 将转换为字符 a 至 z,而带有区分标记的字符将转换为其小写等效项(如果它们存在的话)。

  自变量必须是其值为 CHAR 或 VARCHAR 数据类型的表达式。

  该函数的结果的数据类型和长度属性与自变量的数据类型和长度属性相同。如果自变量可以为空,则结果可以为空;如果自变量为空,则结果为空值。

  确保 EMPLOYEE 表中的列 JOB 的值中的字符将以小写字符的形式返回。例如:

  SELECT LCASE(JOB)

  FROM EMPLOYEE

  WHERE EMPNO = '000020';

  规则

  对于没有主键的表,最多可创建 15 个索引。对于有主键的表,最多可创建 14 个索引。

  如果尝试创建与现有索引匹配的索引,则 CREATE INDEX 语句将失败。在下列情况下,两个索引描述被认为是重复的:

  索引中的列集及其顺序与现有索引的列集和顺序相同。

  排序属性是相同的。

  不能在 CREATE INDEX 语句中使用具有 BLOB 数据类型的列。

  注意事项

  CREATE INDEX 语句可包含最多 8 列。

  DB2 Everyplace 支持索引的双向扫描。尽管下面两个索引的定义不同,但它们的作用是相同的。

  CREATE INDEX IDX1 ON EMPLOYEE (JOB ASC)

  CREATE INDEX IDX1 ON EMPLOYEE (JOB DESC)

  通常,应在不指定排序方向的情况下创建索引。通常,索引越少,索引维护的成本也就越低。

  DB2 Everyplace 支持索引的前缀扫描。考虑以下示例。创建了以下索引。

  CREATE INDEX J1 ON T (A, B, C, D, E, F, G, K)

  不需要为 T (A,B,C,D) 创建另一索引。

  如果该表未包含数据,则 CREATE INDEX 创建索引的描述;在对表插入数据时创建索引条目。

  要为脏位索引创建索引,请使用以下示例:

  CREATE INDEX

  ON   ($dirty)

  有关脏位的更多信息,请参阅 ***。

  示例

  为 EMPLOYEE 表创建名为 JOB_BY_DPT 的索引。按每个部门(WORKDEPT)中的职位(JOB)以升序顺序排列索引条目。

  CREATE INDEX JOB_BY_DPT

  ON EMPLOYEE (WORKDEPT, JOB)

  在建表的时候可以指定索引的表空间,比如: create table tabname(...) in tabspace index in tabindexspace

http://soft.chinabyte.com/database/404/12262904.shtml

--带您了解DB2数据库索引结构

DB2索引结构是怎样的呢?这是很多人都提到过的问题,下面就为您详细介绍DB2索引结构,希望可以让您对DB2索引结构有更深的认识。

  DB2索引结构

  在DB2中,索引的数据结构是一颗B+树。B树把它的存储块组织成一棵树。这棵树是平衡的,即从树根到树叶的所有路径都一样长。通常B树有三层:根、中间层和叶,但也可以是任意多层。

  典型的B+树结构:

  根结点中至少有两个指针被使用。所有指针指向位于B树下一层的存储块;

  叶结点中,最后一个指针指向它右边的下一个叶结点存储块,即指向下一个键值大于它的块。在叶块的其他n个指针当中,至少有个指针被使用且指向数据记录;未使用的指针可看作空指针且不指向任何地方。如果第i个指数被使用,则指向具有第i个键值的记录;

  在内层结点中,所有的n+ 1个指针都可以用来指向B树中下一层的块。其中至少

  个指针被实际使用(但如果是根结点,则不管n多大都只要求至少两个指针被使用)。如果j个指针被使用,那该块中将有j-1个键,设为K1,K2⋯⋯,Kj - 1。第一个指针指向B树的一部分,一些键值小于K1的记录可在这一部分找到。第二个指针指向B树的另一部分,所有键值大小等于K1且小于K2的记录可在这一部分中。依此类推。最后,第j个指针指向B树的又一部分,一些键值大于等于Kj - 1的记录可以在这一部分中找到。注意:某些键值远小于K1或远大于Kj - 1的记录可能根本无法通过该块到达,但可通过同一层的其他块到达。

  假若我们以常规的画树方式来画B树,任一给定结点的子结点按从左(第一个子结点)到右(最后一个子结点)的顺序排列。那么,我们在任何一个层次上从左到右来看B树的结点,结点的键值将按非减的顺序出现。

  DB2中索引结构

  标准表的表和索引管理

  

  记录表示和数据页

  在DB2中可使用命令db2dart /di /tsi /oi /ps p /np 1 /v y来查看索引的物理结构以增加对索引的理解。

http://soft.chinabyte.com/database/89/12241589.shtml
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值