ORACLE SQL性能優化系列 (七)

發表于:2008-10-27來源:作者:點擊數: 標簽:SqlsqlSQLoracleOracle
43. 用WHERE替代ORDER BY ORDER BY 子句只在兩種嚴格的條件下使用索引. ORDER BY中所有的列必須包含在相同的索引中并保持在索引中的排列順序. ORDER BY中所有的列必須定義為非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. 例如: 表DEPT包
43. 用WHERE替代ORDER BY

  ORDER BY 子句只在兩種嚴格的條件下使用索引.

  ORDER BY中所有的列必須包含在相同的索引中并保持在索引中的排列順序.

  ORDER BY中所有的列必須定義為非空.

  WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

  例如:

  表DEPT包含以下列:

DEPT_CODE PK NOT NULL

DEPT_DESC NOT NULL

DEPT_TYPE NULL

  非唯一性的索引(DEPT_TYPE)

  低效: (索引不被使用)

SELECT DEPT_CODE

FROM DEPT

ORDER BY DEPT_TYPE

EXPLAIN PLAN:

SORT ORDER BY

TABLE ACCESS FULL

  高效: (使用索引)

SELECT DEPT_CODE

FROM DEPT

WHERE DEPT_TYPE > 0

EXPLAIN PLAN:

TABLE ACCESS BY ROWID ON EMP

INDEX RANGE SCAN ON DEPT_IDX

  譯者按:ORDER BY 也能使用索引! 這的確是個容易被忽視的知識點. 我們來驗證一下:

SQL> select * from emp order by empno;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (FULL SCAN) OF 'EMPNO' (UNIQUE)

  44. 避免改變索引列的類型

  當比較不同數據類型的數據時, 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會優先轉換數值類型到字符類型.

  

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97