索引是表的一个概念部分
,
用来提高检索数据的效率,
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语言