oracle數(shù)據(jù)庫索引失效的問題及解決
oracle數(shù)據(jù)庫索引失效問題
場景
在開發(fā)中有時候遇到某個表中的列明明是創(chuàng)建了索引,但查詢時卻發(fā)現(xiàn)索引失效。
環(huán)境
下面是工作流activiti中的兩張表act_hi_procinst、act_hi_taskinst關(guān)系是一對多(一個流程包含多個流程環(huán)節(jié)),一個是歷史流程表,一個是歷史流程環(huán)節(jié)表。
索引失效情況及驗證
(單表act_hi_procinst已經(jīng)在delete_reason_列上創(chuàng)建了索引 )
驗證一:索引列為is null 和 is not null時,索引失效
select * from act_hi_procinst t where t.delete_reason_ is not null; select * from act_hi_procinst t where t.delete_reason_ is null;
全表掃描,該列索引失效
select * from act_hi_procinst t where t.delete_reason_ ='ACTIVITI_DELETED' and rownum < 1000;
索引生效,Oracle 數(shù)據(jù)庫使用索引范圍掃描方式。
這種掃描方式通過索引鍵值的范圍來定位需要的數(shù)據(jù)。
select * from act_hi_procinst t where t.delete_reason_ is not null and t.start_time_ between TO_DATE('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and TO_DATE('2023-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and rownum < 1000
結(jié)論一
經(jīng)驗證索引列查詢使用is null 和 is not null則該列索引失效。
驗證二:索引列為 !=和 <> 時會導(dǎo)致該索引列失效
select * from act_hi_procinst t where t.delete_reason_ !='ACTIVITI_DELETED'; select * from act_hi_procinst t where t.delete_reason_ <>'ACTIVITI_DELETED';
結(jié)論二
經(jīng)驗證索引列查詢使用 !=和 <> 時會導(dǎo)致該索引列失效
驗證三:索引列用函數(shù)處理則該索引會失效
select * from act_hi_procinst t where to_char(start_time_,'YYYY')= '2023'
結(jié)論三
索引列用函數(shù)處理則該索引會失效,如字符串函數(shù)trunc,to_char,substring,to_date等函數(shù)
區(qū)別下面的sql(下面的sql走索引)
select * from act_hi_procinst t where t.start_time_ >= TO_DATE('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
驗證四:索引列使用like的前置%查詢,則該索引列失效。
select * from act_hi_procinst t where t.business_key_ like '%20230103-0000102'
like 使用后置百分號走索引
結(jié)論四
經(jīng)驗證索引列使用like的前置%查詢時會導(dǎo)致該索引列失效,但是使用了ike的后置%則會走索引
驗證五:范圍索引查詢和等值索引查詢同時存在,則范圍索引失效
其中start_time_創(chuàng)建有普通索引,delete_reason_字段也創(chuàng)建了普通索引
- SQL一:
select * from act_hi_procinst t where t.start_time_ between TO_DATE('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and TO_DATE('2023-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and t.delete_reason_ ='ACTIVITI_DELETED' and rownum < 1000;
- SQL二:
select * from act_hi_procinst t where t.start_time_ >= TO_DATE('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and t.start_time_<= TO_DATE('2023-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and t.delete_reason_ ='ACTIVITI_DELETED' and rownum < 1000
結(jié)論五
范圍索引查詢和等值索引查詢同時存在,則范圍索引失效
注:上面的查詢sql中加 rownum < 1000的目的主要是數(shù)據(jù)量太大,這里只是要驗證一下查詢是否走索引列
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
oracle合并列的函數(shù)wm_concat的使用詳解
本篇文章是對oracle合并列的函數(shù)wm_concat的使用進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Oracle中幾種常見的數(shù)據(jù)庫錯誤類型及處理方法
處理常見的數(shù)據(jù)庫錯誤是數(shù)據(jù)庫管理的重要組成部分,以下是幾種常見的數(shù)據(jù)庫錯誤類型及其處理方法,結(jié)合具體代碼示例,以幫助你更好地解決這些問題,感興趣的小伙伴跟著小編一起來看看吧2024-09-09mybatis?調(diào)用?Oracle?存儲過程并接受返回值的示例代碼
這篇文章主要介紹了mybatis?調(diào)用?Oracle?存儲過程?并接受返回值,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08Oracle 閃回技術(shù)詳細(xì)介紹及總結(jié)
這篇文章主要介紹了Oracle 閃回技術(shù)詳細(xì)介紹的相關(guān)資料,這里提供了4種閃回技術(shù),需要的朋友可以參考下2016-11-11Oracle使用TRUNCATE TABLE清空多個表的應(yīng)用實例
在數(shù)據(jù)庫管理中,TRUNCATE TABLE 是一個非常實用的命令,然而,在Oracle數(shù)據(jù)庫中,TRUNCATE TABLE 命令是針對單個表的操作,不直接支持在一個語句中清空多個表,本文探討如何在Oracle環(huán)境中高效地對多個表執(zhí)行 TRUNCATE TABLE,并提供實際的應(yīng)用場景示例2024-05-05oracle正則表達式多項匹配時相似項有優(yōu)先級詳解
這篇文章主要給大家介紹了關(guān)于oracle正則表達式多項匹配時相似項有優(yōu)先級的相關(guān)資料,Oracle中使用正則表達式需先使用REGEXP_LIKE函數(shù)來匹配字符串,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06