索引是表的一个概念部分
				,
				用来提高检索数据的效率,
				ORACLE
				使用了一个复杂的自平衡
				B-tree
				结构
				. 
				通常
				,
				通过索引查询数据比全表扫描要快
				. 
				当
				ORACLE
				找出执行查询和
				Update
				语句的最佳路径时
				, ORACLE
				优化器将使用索引。
		
		
		大部分的性能问题其实都是索引应用的问题,Where子句、Order By、Group By 都要用到索引。
一般开发人员认为将索引建全了就可以下班回家了,实则还有颇多的思量和陷阱。
		
		
		索引列上不要使用IS NULL 或 IS NOT NULL
		
				× SELECT Col FROM tbl WHERE col IS NULL
		
		
		索引列上不要使用函数
		
				× SELECT Col FROM tbl WHERE substr(name
				,
				 
				1
				,
				 
				3
				) 
				=
				 'ABC'
○ SELECT Col FROM tbl WHERE name LIKE 'ABC%'
		
		WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
		
		索引列上不要使用NOT
		
				(
				!=
				、
				<>
				)
		
		
				× SELECT Col FROM tbl WHERE col !
				=
				 
				10
				
						
○ SELECT Col FROM tbl WHERE col > 
				10
				 OR col < 
				10
				
						
				
		
		
				
						记住
						, 
						索引只能告诉你什么存在于表中
						, 
						而不能告诉你什么不存在于表中
						.
						
						要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描。
				
				索引列上不要进行计算
				
				
		
		
				× SELECT Col FROM tbl WHERE col / 
				10
				 > 
				10
				
						
○ SELECT Col FROM tbl WHERE col > 
				10
				 * 
				10
				
						
				
		
		这是最最普遍的失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。索引失效的原因也简单,索引是针对原值建的二叉树,你将列值*3/4+2折腾一番后,原来的二叉树当然就用不上了。
		
		
		
		
				
						
								
										
												
										
								
						
				 
		
				
		
	posted on 2007-01-22 11:13 
小言身寸 阅读(2311) 
评论(0)  编辑  收藏  所属分类: 
数据库/SQL语言