亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle Index索引無效的原因與解決方法

2024-08-29 14:01:31
字體:
來源:轉載
供稿:網友

索引無效原因

最近遇到一個Oracle SQL語句的性能問題,修改功能之前的運行時間平均為0.3s,可是添加新功能后,時間達到了4~5s。雖然幾張表的數據量都比較大(都在百萬級以上),但是也都有正確創建索引,不知道到底慢在了哪里,下面展開調查。

經過幾次排除,把問題范圍縮小在索引上,首先在確定索引本身沒有問題的前提下,考慮索引有沒有被使用到,那么新的問題來了,怎么知道指定索引是否被啟用。

判斷索引是否被執行

1. 分析索引

即將索引至于監控狀態下,對索引進行分析。如下對 ID_TT_SHOHOU_HIST_002 索引進行分析 

alter index ID_TT_SHOHOU_HIST_002 monitoring usage;

2. 查看v$object_usage視圖中記錄的信息

select * from v$object_usage;

Oracle,Index,索引無效

字段依次為: 

•INDEX_NAME --索引名

•TABLE_NAME --表名

•MONITORING --是否被監控

• USED --是否被啟用 

•START_MONITORING --監控開始時間

•END_MONITORING --監控結束時間

如上圖,雖然索引已經被引用,但是速度依舊很慢,莫非是雖然啟用了索引,但是又被其他的一些原因拖慢了速度,繼續調查。

調查途中,收集到一些Oracle 數據庫不走索引的原因分享給大家

不走索引的原因

1. 在索引列上使用函數時不會使用索引

例如常見的, TO_CHAR 、 TO_DATE 、 TO_NUMBER 、 TRUNC ...等等。

此時的解決辦法可以使用 函數索引 ,顧名思義就是把使用函數后的字段整體當成索引中的字段。

如下圖中的 TO_CHAR(SHOHOU_DATE, 'YYYYMMDD') 就是一個函數索引,因為日期字段中含有時分秒,進行日期比較的時候,必須轉化成固定的格式。 

CREATE INDEX ID_TT_SHOHOU_HIST_003ON TT_SHOHOU_HIST(DEL_FLG,TO_CHAR(SHOHOU_DATE, 'YYYYMMDD'), SHOHOU_ID)TABLESPACE SALESPA_INDEX

2. 索引的列進行隱式的類型轉換

SELECT * FROM TABLE WHERE INDEX_COLUM = 5

上面語句中的 INDEX_COLUM 字段類型為 VARCHAR2 ,這時就會發生隱式類型轉換,類似于 

SELECT * FROM TABLE WHERE TO_NUMBER(INDEX_COLUM) = 5

3. WHERE 子句中使用不等于操作

不等于操作包括: <> , != , NOT colum >= ? , NOT colum <= ? 

替代方式可以使用OR, colum <> 0 =====> colum > 0 or colum < 0;

4. 使用 IS NULL 和 IS NOT NULL

替代方式:函數索引

通過 nvl(b,c) 將為空的字段轉為不為空的c值,再在函數nvl(b,c)上建立函數索引

轉換前

SELECT * FROM A WHERE B = NULL

轉換后

SELECT * FROM A WHERE NVL(B,C) = C

5. 組合索引

組合索引:由多個列構成的索引。如

CREATE INDEX INDEX_EMP ON EMP (COL1,COL2,COL3,...)

INDEX_EMP 則為復合索引, COL1 為引導列。進行查詢時,可以使用 WHERE COL1 = ? ,也可以使用 WHERE COL1 = ? AND COL2 = ? ,這樣的限制條件都會使用索引,但是 WHERE COL2 = ? ,不會使用索引,所以限制條件中包含引導列時,該限制條件才會使用組合索引。

經過一番調查,我使用的SQL語句檢索條件中對時間列進行 TO_CHAR(TTSH.SHOHOU_DATE, 'YYYYMMDD') 格式化日期,去除掉時分秒。再建立函數索引后仍然沒有起到優化加速的效果,仔細觀察發現在使用TO_CHAR格式化時間之后,又進行TO_DATE轉為時間格式和其他子查詢的字段進行比較。然后很快想到,建立一個 TO_DATE(TO_CHAR(TTSH.SHOHOU_DATE, 'YYYYMMDD'), 'YYYYMMDD') 這樣的函數索引,結果缺失提高了不少的運行速度,從4~5s縮短到了0.5s左右。

但是這只是在PL/SQL軟件中運行SQL提高了速度,實際項目運行仍然是4~5s,使用語句查看索引的使用狀況時,發現并沒有使用索引,但是在PL/SQL軟件中確實調用了索引,這至今都是未解之謎,如果有大神知道原因希望能幫我解答一下這個疑問。

既然不能自動調用,只能強制讓SQL走指定索引了,強制的方法如下

在 SELECT 語句后加入 /*+INDEX(TTSH ID_TT_SHOHOU_HIST_002)*/ ,其中 TTSH 是表的別名(當表有別名的時候,必須在索引前加入表的別名) 

SELECT /*+INDEX(TTSH ID_TT_SHOHOU_HIST_002)*/ TO_DATE(TO_CHAR(TTSH.SHOHOU_DATE, 'YYYYMMDD'), 'YYYYMMDD') AS SHOHOU_DATE FROM TT_SHOHOU_HIST TTSHWHERE ...

至此,SQL的效率問題已經解決了,但是這不是最好的解決方案。

首先,目前的索引中已經存在包含 TO_CHAR(TTSH.SHOHOU_DATE, 'YYYYMMDD') 的函數索引,又再創建一個 TO_DATE(TO_CHAR(TTSH.SHOHOU_DATE, 'YYYYMMDD'), 'YYYYMMDD') ,看著就很難受

其次,強制使用索引的方法需要在SQL中指定索引名,假如數據庫中的索引名發生變更,還需去更改SQL。

最好的方法是把索引字段的TO_DATE去掉,統一使用TO_CHAR的索引。

AND CAL.CALENDER = TO_DATE(TO_CHAR(TTSH.SHOHOU_DATE, 'YYYYMMDD'), 'YYYYMMDD')

上面的部分語句因為 CALENDER 字段是DATE類型,所以比較時使用了TO_DATE,其實只要把 CALENDER 轉化成CHAR類型就行了,雖然看起來要改動的地方很多,其實解決了更大的問題。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91午夜在线播放| 美日韩在线视频| 国产精品 欧美在线| 亚洲第一区第二区| 欧美性猛交xxxx富婆| 久久香蕉频线观| 亚洲欧美日韩区| 久久精品国产亚洲精品2020| 欧美理论片在线观看| 精品欧美国产一区二区三区| 久久国产精品首页| 少妇高潮久久久久久潘金莲| 欧美华人在线视频| 亚洲在线观看视频| 国内精品伊人久久| 中文字幕亚洲欧美在线| 欧美精品午夜视频| 日韩av网址在线| 欧美大片在线看免费观看| 亚洲一区二区三| 国产在线播放91| 久热精品在线视频| 欧美大片在线看免费观看| 日韩精品视频免费在线观看| 最新国产精品亚洲| 精品国产一区二区三区在线观看| 91免费在线视频| 国产在线精品自拍| 国产视频久久久久| 亚洲精品一二区| 在线精品高清中文字幕| 久久中国妇女中文字幕| 亚洲男人第一网站| 国产精品激情av电影在线观看| 精品久久久久久久久久久久| 国产精品亚洲美女av网站| 欧美黑人xxxⅹ高潮交| 91中文精品字幕在线视频| 欧美猛少妇色xxxxx| 成人午夜黄色影院| 国内精品久久久久久影视8| 亚洲最大的免费| 亚洲成年网站在线观看| 91欧美视频网站| 精品国产一区二区在线| 欧美—级a级欧美特级ar全黄| 欧美巨大黑人极品精男| 欧美精品video| 大伊人狠狠躁夜夜躁av一区| 久久亚洲精品网站| 亚洲97在线观看| 美女扒开尿口让男人操亚洲视频网站| 欧美最近摘花xxxx摘花| 国产日韩欧美夫妻视频在线观看| 欧美另类精品xxxx孕妇| 亚洲成人黄色在线观看| 日本韩国在线不卡| 亚洲白虎美女被爆操| 久久精彩免费视频| 91日本在线观看| 91亚洲精品在线| 欧洲成人午夜免费大片| 国产精品夜间视频香蕉| 国产精品678| 日韩欧美aⅴ综合网站发布| 欧美性猛交xxxx富婆弯腰| 亚洲视频一区二区三区| 久久免费国产精品1| 欧美激情一区二区三区在线视频观看| 少妇精69xxtheporn| 91老司机在线| 日韩电影视频免费| 亚洲国产中文字幕在线观看| 欧美视频在线视频| 911国产网站尤物在线观看| 亚洲欧美日本伦理| 亚洲午夜未删减在线观看| 国产精品女人网站| 亚洲一区二区三区毛片| 欧美日韩免费在线| 91成人天堂久久成人| 亚洲网站在线看| 久久久久女教师免费一区| 欧美视频在线视频| 欧美大人香蕉在线| 亚洲永久在线观看| 亚洲精品之草原avav久久| 亚洲丝袜av一区| 亚洲欧美日韩精品| 欧美亚洲国产日本| 中文字幕久精品免费视频| 久久久久久国产精品三级玉女聊斋| 伊是香蕉大人久久| 亚洲性xxxx| 97成人精品区在线播放| 久色乳综合思思在线视频| 91国内精品久久| 日韩电影大片中文字幕| 国产美女精品视频| 国产视频精品va久久久久久| 最近2019年好看中文字幕视频| 91国产美女在线观看| 2020国产精品视频| 亚洲一区二区三区777| 最近的2019中文字幕免费一页| 欧美激情精品久久久久久免费印度| 日韩黄色在线免费观看| 成人中文字幕+乱码+中文字幕| 亚洲缚视频在线观看| 成人激情视频网| 欧洲成人午夜免费大片| 久久久综合av| 国产做受高潮69| 亚洲人成在线电影| 久久av在线看| 国产精品久久激情| 亚洲欧美一区二区三区四区| 精品久久久久久久久久久久久久| 欧美高清性猛交| 欧美裸身视频免费观看| 91成人天堂久久成人| 亚洲高清久久久久久| 欧美激情视频网| 精品亚洲一区二区三区在线观看| 日韩高清电影免费观看完整版| 亚洲欧美国产高清va在线播| 国产精品视频色| 欧美最顶级的aⅴ艳星| 97精品视频在线播放| 国产www精品| 国产v综合ⅴ日韩v欧美大片| 亚洲区中文字幕| 亚洲va久久久噜噜噜久久天堂| 欧美在线观看视频| 亚洲午夜国产成人av电影男同| 亚洲欧洲中文天堂| 日本免费一区二区三区视频观看| 92裸体在线视频网站| 欧美日韩中文在线| 国产香蕉一区二区三区在线视频| 欧美大奶子在线| 国产精品日韩欧美大师| 欧洲成人免费aa| 亚洲国产成人91精品| 97国产成人精品视频| 久久久91精品国产一区不卡| 中文字幕欧美日韩在线| 免费91麻豆精品国产自产在线观看| 青青久久av北条麻妃黑人| 日韩男女性生活视频| 中文字幕亚洲欧美一区二区三区| 欧美一区亚洲一区| 中文字幕精品www乱入免费视频| 大伊人狠狠躁夜夜躁av一区| 成人www视频在线观看| 欧美一区二区视频97| 亚洲精品国产综合区久久久久久久| 亚洲电影免费观看高清完整版| 亚洲欧美日韩一区二区在线| 国产精品亚洲第一区| 国产91精品久久久久久| 欧美日韩激情视频| 日韩动漫免费观看电视剧高清| 国外日韩电影在线观看|