oracle order by索引是否使用的情況
剛開始在網上看了很多說order by 走索引有兩個前提條件
1,ORDER BY中所有的列必須包含在相同的索引中並保持在索引中的排列順序.
2,ORDER BY中所有的列必須定義為非空.
下面是測試:
建表:
create table person
(
id VARCHAR2(50) not null,
name VARCHAR2(20) not null,
phone VARCHAR2(11) not null,
time TIMESTAMP(6) not null
)
建立索引
create index index_person on person(time,phone);
執行語句測試:
1,
select * from person
where 1=1
and time <= to_date('2013-12-12 12:12:12','yyyy-MM-dd hh24:mi:ss')
and phone = '13892441321'
order by time desc --使用索引
2,
select * from person order by time desc --不使用索引
這個有個特別的情況:
1,
select * from person
where 1=1
and phone = '13892441321'
order by time desc --使用索引
2,
select * from person
where 1=1
and phone = '13892441321' --不使用索引
這種情況是加了個order by time
才使用了索引,我的理解是隻有一個條件phone
的時候索引無效,加了order by time
,才用到了索引
分頁的時候使用索引,例如:
1,
select * from person
order by time desc --不使用索引
2,
select * from (
select * from person
order by time desc) --這裡換成order by phone也是不走索引的,這個是索引的字首原則。
where rownum <=1000 --使用索引
總結:其實order by
滿足以上的兩個條件後,決定走不走索引的還要看where後面的條件,先要where條件符合,走了索引才行。上面的第二條沒加條件,顯然是不使用索引的。很多時候建立索引要看具體業務需求,也就是查詢條件。走不走索引,主要是測試一下,看看執行計劃。
假如一定要對使用函式的列啟用索引, ORACLE
新的功能: 基於函式的索引(Function-Based Index
) 也許是一個較好的方案.
CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基於函式的索引*/
SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL'; /*將使用索引*/
5 怎樣監控無用的索引
Oracle 9i以上,可以監控索引的使用情況,假如一段時間內沒有使用的索引,一般就是無用的索引
語法為:
開始監控:alter index index_name monitoring usage;
檢查使用狀態:select * from v$object_usage;
停止監控:alter index index_name nomonitoring usage;
當然,假如想監控整個使用者下的索引,可以採用如下的指令碼:
set heading off set echo off set feedback off set pages 10000 spool start_index_monitor.sql SELECT 'alter index 'owner'.'index_name' monitoring usage;' FROM dba_indexes WHERE owner = USER; spool off set heading on set echo on set feedback on set heading off set echo off set feedback off set pages 10000 spool stop_index_monitor.sql SELECT 'alter index 'owner'.'index_name' nomonitoring usage;' FROM dba_indexes WHERE owner = USER; spool off set heading on set echo on set feedback on
其實最好的辦法是檢視執行計劃。
相關文章
- MySql ORDER BY索引是否失效MySql索引
- Oracle 12.2中的索引統計被呼叫情況Oracle索引
- 使用聯合索引的一種情況索引
- oracle組合索引什麼情況下生效?Oracle索引
- mysql索引失效的情況MySql索引
- 在oracle中監視索引的使用情況Oracle索引
- Oracle like、不等於、隱式轉換走索引與不走索引情況Oracle索引
- mysql索引不會命中的情況MySql索引
- [20231024]NULL值在索引的情況.txtNull索引
- Mysql 會導致索引失效的情況MySql索引
- MySQL哪些情況需要新增索引?MySql索引
- 4.3.4.1 在不使用Oracle OMF的情況下建立CDBOracle
- order by與索引索引
- MYSQL索引失效的各種情況小結MySql索引
- 在不安裝oracle客戶端的情況下,使用PLSQLOracle客戶端SQL
- oracle v$sqlare 分析SQL語句使用資源情況OracleSQL
- 簡單介紹MySQL索引失效的幾種情況MySql索引
- 盤一盤常見的6種索引失效情況索引
- 哪些情況下需要/不需要建立索引索引
- 用redis統計大量使用者的登陸情況[只判斷是否活躍]Redis
- Mysql利用explain確認是否使用索引MySqlAI索引
- 檢視錶和索引碎片情況相關資訊索引
- oracle dg 歸檔日誌恢復情況Oracle
- DB2檢視索引的使用情況DB2索引
- oracle的索引Oracle索引
- 記一次使用Oauth的情況OAuth
- 火狐是否在未經授權的情況下蒐集您的資料?
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- MySQL 中使用 EXPLAIN判斷索引使用情況MySqlAI索引
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- SQLServer索引優化(1):對於有order by欄位的建索引策略SQLServer索引優化
- win10檢視是否使用虛擬記憶體情況 win10是否使用虛擬記憶體在哪裡檢視Win10記憶體
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- Oracle優化案例-正確的使用索引(二)Oracle優化索引
- Oracle 歸檔使用情況分析Oracle
- 使用 Ledger 記錄(財務)情況
- Oracle RAC中驗證LUN_ID對應情況Oracle
- Oracle 索引Oracle索引