随笔-94  评论-56  文章-3  trackbacks-0
索引是表的一个概念部分 , 用来提高检索数据的效率, 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 小言身寸 阅读(2278) 评论(0)  编辑  收藏 所属分类: 数据库/SQL语言

只有注册用户登录后才能发表评论。


网站导航: