索引 技巧

>避免在索引列上使用计算和函数.
WHERE子句中,若是索引列是函数的一部分.优化器将不使用索引而使用全表扫描.函数

举例:优化

低效:
SELECT …
FROM DEPT
WHERE SAL * 12 > 25000;对象

高效:
SELECT …
FROM DEPT
WHERE SAL > 25000/12;索引

这是一个很是实用的规则,请务必牢记数据类型

[注意:] 若是必须使用的话,能够建立集于函数的索引.引用

>避免在索引列上使用NOT
一般, 咱们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的数据

>避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何能够为空的列,ORACLE将没法使用该索引 .类型转换

>老是使用索引的第一个列 (前导列)
若是索引是创建在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.di

这也是一条简单而重要的规则. 见如下实例.co


>避免改变索引列的类型.
当比较不一样数据类型的数据时, ORACLE自动对列进行简单的类型转换.
假设 EMPNO是一个数值类型的索引列.
SELECT …
FROM EMP
WHERE EMPNO = ‘123’
实际上,通过ORACLE类型转换, 语句转化为:
SELECT …
FROM EMP
WHERE EMPNO = TO_NUMBER(‘123’)
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
如今,假设EMP_TYPE是一个字符类型的索引列.
SELECT …
FROM EMP
WHERE EMP_TYPE = 123
这个语句被ORACLE转换为:
SELECT …
FROM EMP
WHERE TO_NUMBER(EMP_TYPE)=123
由于内部发生的类型转换, 这个索引将不会被用到!
为了不ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型.

>须要小心的WHERE子句
某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
[总之:]对索引列的使用最好就是 where 索引列 = 条件
!=将不使用索引,记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
>分离表和索引
老是将你的表和索引创建在不一样的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不一样的硬盘上.

译者按: “同时,确保数据表空间和索引表空间置与不一样的硬盘上.”可能改成以下更为准确 “同时,确保数据表空间和索引表空间置与不一样的硬盘控制卡控制的硬盘上.”

相关文章
相关标签/搜索