索引的相关知识 ①.创建准则
				
		
		
				
				 
		
				
						    今天学习索引的知识。所谓索引,恩,这个可以再我以前的文章《索引的概念及创建》看到,多的也不说了,反正是看着教材,再重新学习一遍。这里介绍的索引的内容还是比较详细的,一些很细小的东西都讲到了,可以增进对索引的理解。
				
		
		
				
				 
		
				
						一、管理准则
				
		
		
				
				 
		
				
						    Oracle的索引可以更快的定位信息,提供访问表的数据的更快路径。索引的种类有:
				
		
		
				
						
						
				 
		
				
						    ● B-Tree索引:默认的最常用索引
				
		
		
				
						    ● B-Tree簇索引:特意为簇定义的索引
				
		
		
				
						
								
										    ● 散列值索引:特意为散列簇定义的索引
						
				
		
		
				
						
								    ● 全局和局部索引:相应于分区表的索引
						
				
		
		
				
						
								
										    ● 逆转值索引:特别适用于Oracle真实应用簇的应用
								
						
				
		
		
				
						
								
										
												    ● 位图索引:紧凑的,特别适用于少量值集的列
										
								
						
				
		
		
				
						
								
										
												
														    ● 基于函数的索引:包含函数/表达式的预先计算的值
												
										
								
						
				
		
		
				
						
								
										
												
														
																    ● 域索引:特别针对应用或插件
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    索引的管理准则包括:
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ① 在表中插入数据后创建索引
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ② 索引正确的表和列
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    * 如需经常检索大表中少于15%的行,则创建索引(百分比值与扫描速度有关)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    * 改善多个表联结性能创建索引。特别是外键需要创建索引。
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    * 小表不需要索引
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    * 列中的值比较唯一适合创建所以
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    * 取值范围大(适合作常规索引)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    * 取值范围小(适合作位图索引)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    * 列中有许多空值,但经常查询所有具有值的行适合创建索引
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    * 列中有许多空值,但又不查询非空值适合创建索引
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    注:查询非空值,用 WHERE COL > -9.99 * power(10,125) 效果要比 WHERE COL IS NOT NULL 好,因为可以使用索引。
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		    ③ 调整索引列位置(
																
														
												
										
								
								
										
												
														
																
																		常用列放在最前面)
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ④ 限制每个表的索引数量
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑤ 删除不需要的索引(重建索引前必须先删除索引)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑥ 指定索引数据块空间使用
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑦ 估计索引大小,设置存储参数
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑧ 为每个索引指定表空间
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑨ 考虑并行创建索引
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑩ 考虑用NOLOGGING创建索引
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑾ 考虑合并或重建索引时的损益
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ⑿ 停用或删除约束之前考虑开销
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		二、创建索引
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		1、明确地创建索引
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    CREATE INDEX emp_ename ON emp(ename)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    TABLESPACE users
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    STORAGE (INITIAL 20K
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    NEXT 20K
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    PCTINCREASE 75)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    PCTFREE 0;
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    注:索引创建时不能指定PCTUSED参数。
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		2、明确得创建唯一索引
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    唯一索引可以保证键列上表不会有两行重复的值。
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    CREATE UNIQUE INDEX dept_unique_index ON dept(dname)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    TABLESPACE indx;
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		3、创建与约束相关的索引
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    在创建UNIQUE KEY或PRIMARY KEY时,会自动创建一个唯一索引,以确保数据的完整性。在使用CREATE TABLE或ALTER TABLE时不需要用户进行操作,但是用户可以使用USING INDEX子句来对创建实施控制。
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    CREATE TABLE emp (
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    empno NUMBER(5) PRIMARY KEY, 
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    age INTEGER)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    ENABLE PRIMARY KEY USING INDEX
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    TABLESPACE users
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    PCTFREE 0;
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    当要对UNIQUE和PRIMARY KEY约束相关索引进行更明确的控制时:
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    例1:
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    CREATE TABLE a (
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    a1 INT PRIMARY KEY USING INDEX (create index ai on a(a1)));
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    例2:
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    CREATE TABLE b (
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    b1 INT,
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    b2 INT,
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    CONSTRAINT bu1 UNIQUE (b1,b2)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    USING INDEX (create unique index bi on b(b1,b2)),
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    CONSTRAINT bu2 UNIQUE (b2,b1) USING INDEX bi);
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    例3:
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    CREATE TABLE c(c1 INT, c2 INT);
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    CREATE INDEX ci ON c(c1,c2);
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		4、采集创建索引时伴随的统计数据
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    CREATE INDEX emp_ename ON emp(ename)
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    COMPUTE STATISTICS;
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		5、创建大索引
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    ① 创建一个新的临时表空间
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    ② 将用户默认临时表空间设置为新建的表空间
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    ③ 创建索引
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																    ④ 删除表空间,并将用户的临时表空间更改过来
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		6、联机创建索引
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    可以用联机创建索引的办法,使得创建时仍可更改基础表
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    CREATE INDEX emp_name ON emp (mgr,emp1,emp2,emp3) ONLINE;
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    注:可是使用DML,但不能使用DDL,而且不支持并行执行。
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		7、创建基于函数的索引
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																    特点:
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		    ● 创建更强有力的分类
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				    ● 预先计算出计算密集的函数值,并在索引中分类
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						    ● 则加优化器执行范围扫描而不是全表扫描的数量
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								    ● 真正的降序索引成为可能
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    ● 在对象列和REF列上创建索引
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																										
																								
																						
																				
																		
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    注:在创建基于函数的索引之后,必须ANALYZE分析表。
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																										
																								
																						
																				
																		
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    CREATE INDEX empi ON emp
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    UPPER((ename),NLSSORT(ename));
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																										
																								
																						
																				
																		
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																												8、创建键压缩索引
																										
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																										
																								
																						
																				
																		
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    CREATE INDEX emp_name ON emp(ename)
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    TABLESPACE users
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    COMPRESS 1;
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																										
																								
																						
																				
																		
																
														
												
										
								
						
				 
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    可以使用以下语句停用压缩:
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										    ALTER INDEX emp_ename REBUILD NOCOMPRESS;