13-where與order by以及型別轉換

安佰勝發表於2010-10-20


13-where與order by以及型別轉換

===============

1、使用where替代orader by

order by子句只在兩種嚴格的條件下使用索引

order by中所有的列必須包含在相同的索引中並保持在索引中的排列順序
order by中所有的列不許定義為非空

where子句使用的索引和order by子句中所使用的索引不能並列

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

2、避免改變索引列的型別

當比較不同資料型別的資料時,oracle自動對列進行簡單的型別轉換

SQL> select count(*) from an1 where id

  COUNT(*)
----------
     20001

已用時間:  00: 00: 00.06

執行計劃
----------------------------------------------------------
Plan hash value: 4005259610

------------------------------------------
| Id  | Operation         | Name         |
------------------------------------------
|   0 | SELECT STATEMENT  |              |
|   1 |  SORT AGGREGATE   |              |
|*  2 |   INDEX RANGE SCAN| INDEX_AN1_ID |
------------------------------------------

做了隱式轉換,但轉換的是等式的右邊,所以索引依然有效

SQL> select count(*) from an1 where to_number(id)<50000;

  COUNT(*)
----------
     20001

已用時間:  00: 00: 00.04

執行計劃
----------------------------------------------------------
Plan hash value: 2832067379

-----------------------------------
| Id  | Operation          | Name |
-----------------------------------
|   0 | SELECT STATEMENT   |      |
|   1 |  SORT AGGREGATE    |      |
|*  2 |   TABLE ACCESS FULL| AN1  |
-----------------------------------

索引無效

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

3、

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13177610/viewspace-676349/,如需轉載,請註明出處,否則將追究法律責任。

相關文章