索引 技巧

>避免在索引列上使用計算和函數.
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表空間裏. 同時,確保數據表空間和索引表空間置於不一樣的硬盤上.

譯者按: 「同時,確保數據表空間和索引表空間置與不一樣的硬盤上.」可能改成以下更爲準確 「同時,確保數據表空間和索引表空間置與不一樣的硬盤控制卡控制的硬盤上.」

相關文章
相關標籤/搜索