1. 程式人生 > >oracle索引失效的原因及解決方案

oracle索引失效的原因及解決方案

一、以下的方法會引起索引失效

?1,<>
2,單獨的>,<,(有時會用到,有時不會)
3,like "%_" 百分號在前.
4,表沒分析.
5,單獨引用複合索引裡非第一位置的索引列.
6,字元型欄位為數字時在where條件裡不新增引號.
7,對索引列進行運算.需要建立函式索引.
8,not in ,not exist.
9,當變數採用的是times變數,而表的欄位採用的是date變數時.或相反情況。
10, 索引失效。
11,基於cost成本分析(oracle因為走全表成本會更小):查詢小表,或者返回值大概在10%以上
12,有時都考慮到了 但就是不走索引,drop了從建試試在
13,B-tree索引 is null不會走,is not null會走,點陣圖索引 is null,is not null   都會走
14,聯合索引 is not null 只要在建立的索引列(不分先後)都會走, 
in null時   必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時,其他建立索引的列可以是is null(但必須在所有列都滿足is null的時候),或者=一個值;
當建立索引的第一位置是=一個值時,其他索引列可以是任何情況(包括is null =一個值),以上兩種情況索引都會走。其他情況不會走。

二、索引失效解決方法

1. 選用適合的Oracle優化器

Oracle的優化器共有3種:

a. RULE (基於規則) b. COST (基於成本) c. CHOOSE (選擇性)。

設定預設的優化器,可以通過對init.ora檔案中OPTIMIZER_MODE引數的各種宣告,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。你當然也在SQL句級或是會話(session)級對其進行覆蓋。

為了使用基於成本的優化器(CBO, Cost-Based Optimizer) , 你必須經常執行analyze 命令,以增加資料庫中的物件統計資訊(object statistics)的準確性。

如果資料庫的優化器模式設定為選擇性(CHOOSE),那麼實際的優化器模式將和是否執行過analyze命令有關。如果table已經被analyze過, 優化器模式將自動成為CBO , 反之,資料庫將採用RULE形式的優化器。

(分析table

analyze table PROD_PARTS compute statistics;

ANALYZE TABLE PROD_PARTS COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;

analyze table PROD_PARTS compute statistics for table for all indexes for all indexed columns;

)【有一次索引失效之後,請教DBA後,發現是資料統計的問題,具體的解決辦法是執行以上語句】

在預設情況下,Oracle採用CHOOSE優化器, 為了避免那些不必要的全表掃描(full table scan), 你必須儘量避免使用CHOOSE優化器,而直接採用基於規則或者基於成本的優化器。

2、?重建索引 
?alter index 索引名 rebuild 【online】

3、強制索引

給該語句加上hint後,強制其使用'RECORD_ENTITYID' 這個索引

sql語句變成這樣

引用

select /*+ index(record,record_entityid) */ *

from RECORD

where entityId='24' and entityType='blog';

/*+ index(record,record_entityid) */ 中,index表示強制使用index,record是表名,record_entityid是索引名。其執行計劃跟測試資料庫上一致,都是使用用 'RECORD_ENTITYID' 這個索引,邏輯讀寫同樣為4。

後來經過測試,在不加hint的情況下,對該表和兩個索引執行analyze 後,同樣也能使用 'RECORD_ENTITYID' 這個索引。但是因為該表更新頗為頻繁,不知道要多久就要再分析一次


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(784) | 評論(0) | 轉發(0) | 評論熱議

相關推薦

oracle索引失效原因解決方案

一、以下的方法會引起索引失效?1,<>2,單獨的>,<,(有時會用到,有時不會)3,like "%_" 百分號在前.4,表沒分析.5,單獨引用複合索引裡非第一位置的索引列.6,字元型欄位為數字時在where條件裡不新增引號.7,對索引列進行運算.需要建

ORACLE 臨時表空間使用率過高的原因解決方案

        在資料庫的日常學習中,發現公司生產資料庫的預設臨時表空間temp使用情況達到了30G,使用率達到了100%; 待調整為32G後,使用率還是為100%,導致磁碟空間使用緊張。根據臨時表空間的主要是對臨時資料進行排序和快取臨

oracle變異表觸發器中ORA-04091錯誤原因解決方案

變異表是指激發觸發器的DML語句所操作的表 當對一個表建立行級觸發器時,有下列兩條限制: 1.不能讀取或修改任何觸發語句的變異表; 2.不能讀取或修改觸發表的一個約束表的PRIMARY   KEY,UNIQUE 或FOREIGN KEY關鍵字的列, 但  可以修改其他列

內存溢出原因解決方案

使用 -xmx 遞歸調用 其它 地址 str 啟動 遞歸 對象 參考地址:http://baike.baidu.com/view/79183.htm 內存溢出是指應用系統中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於虛擬機能提供的最大內存

CentOS7下Tomcat啟動慢的原因解決方案

按鍵 source 命令 mon 進程 tomcat apps 守護進程 中斷 現象   在一次CentOS 7系統中安裝Tomcat,啟動過程很慢,需要幾分鐘,經過查看日誌,發現耗時在這裏:是session引起的隨機數問題導致的。Tocmat的Session ID是通過S

hive表數據導出到csv亂碼原因解決方案

exce 默認 concat_ws 分隔符 語句 解決方案 打開 clas 連接 轉載自http://blog.csdn.net/lgdlxc/article/details/42126225 Hive表中的數據使用hive - e"select * from table"

U-Mail郵件系統詳解郵件收發延遲原因解決方案

郵件系統 郵件是現代社會辦公最常見、最頻繁的通聯工具,但使用郵件系統時,用戶普遍最關心兩個安全,一個是安全性,郵件會不會被竊密?自己的郵箱賬號會不會被盜取被攻占呢?保存的數據會不會丟失呢?關於這個問題,國內知名通聯解決方案提供商U-Mail資深專家馬工已反復闡述過很多次。 另一個問題是關於郵件傳輸的,郵

sql異常 獲取數據失敗的原因解決方案

報錯 解決方案 utils har .com SQ 技術 提示 png 使用dbutils工具類時 不能使用char作為sql的字段類型 報錯提示不能轉換 所以替換成別的(一般是String)即可 sql異常 獲取數據失敗的原因及解決方案

RHEL7下Tomcat啟動慢的原因解決方案

tomcat分析結果 主要原因是生成隨機數的時候卡住了,導致tomcat啟動不了。是否有足夠的熵來用於產生隨機數,可以通過如下命令來查看[root@tomcat tools]# cat /proc/sys/kernel/random/entropy_avail7為了加速/dev/random提供隨機數的速度,

no session 問題出現的原因解決方案

lte base 請求 屬性 TP IE session關閉 範圍 關聯對象 session是hibernate框架與數據庫交互的對象,與HttpSession是完全不同的東西。session通常與線程綁定,使用完之後就會關閉。 no session問題的出現與延遲加載有關

啟動Hadoop時候datanode沒有啟動的原因解決方案

data 重要 http tar img 保存 src com sta 有時候我們start-dfs.sh啟動了hadoop但是發現datanode進程不存在 一、原因 當我們使用hadoop namenode -format格式化namenode時,會在namenod

Oracle 字符集常見字符集解決方案

sun png microsoft 打開 服務器 isp weight web 客戶端 Oracle 字符集常見字符集及解決方案 一.查看字符集: 1.查詢服務端字符集: select userenv(‘language‘) from dual or sele

Redis線上間歇性查詢慢原因解決方案

   場景:隨著線上redis所儲存的key值原來越多,偶爾會遇到某個查詢耗時很長的問題,剛開始並沒有重視,隨著業務量的增加和某些人對redis操作不規範,導致線上查詢慢的發生概率越來越高,所以領導就找我和運維的人一起查詢此類問題和解決辦法,也順便記錄一下排查過程。 &nbs

Could not obtain transaction-synchronized Session for current thread原因解決方案

          在開發中,碰到到了Could not obtain transaction-synchronized Session for current thread異常,因此特意記錄下。 一、問題的產生    

java.util.NoSuchElementException錯誤原因解決方案

1.原因:沒有控制語句導致的迭代器的越界,使得map中的資料無法傳入reduce,從而無法把結果傳入目標檔案中。 在進行Mapreduce例項——WordCount實驗時遇到的錯誤,開始以為是lib包匯入和讀取原始檔格式的問題,後來無論怎麼修改都會報這個錯誤,報錯如下: java.lang.Excepti

kafka資料丟包原因解決方案

資料丟失是一件非常嚴重的事情事,針對資料丟失的問題我們需要有明確的思路來確定問題所在,針對這段時間的總結,我個人面對kafka 資料丟失問題的解決思路如下: 是否真正的存在資料丟失問題,比如有很多時候可能是其他同事操作了測試環境,所以首先確保資料沒有第三方干擾。 理清你的業務流程,資

win10下用vritualbox下安裝redhat黑屏原因解決方案

背景,想裝個虛擬機器。 當前環境,win10,聯想小新。 其他版本資訊: vritualbox  5.2.22 映象  rhel-server-7.0-x86_64-dvd.iso 利用vritualbox安裝虛擬機器的過程不贅述,在新建後,選擇iso,然

Oracle 12c 安裝問題解決方案

1. 介紹 今天在我的開發電腦上安裝Oracle12c,電腦環境是windows10家庭中文版,安裝的Oracle資料庫版本Oracle(12.1.0.2.0) - Standard Edition (SE2) Microsoft Windows x64 (64-bit),之前沒有在該電腦上安裝過Oracl

Python常見warning或error原因解決方案

一般講warning是不會影響取值的,可忽略,全忽略如下: import warnings warnings.simplefilter('ignore') #warnings.filterwarnings(action='ignore',category=Use

在SSH框架中,多個持久層物件相互引用,從而引發分頁查詢中,查詢所得的持久化物件轉換為JSON字串報錯的原因解決方案

引言: 使用EasyUI框架的小夥伴們都知道,在使用datagrid(資料表格)時,會傳入如一個URL,用於請求資料表格中的所顯示的資料: <!--建立一個空表格--> <table id="mytable"></table>