1. 程式人生 > >Oracle優化-索引原理[注意索引跳躍式掃描!

Oracle優化-索引原理[注意索引跳躍式掃描!

Oracle 提供了大量索引選項。知道在給定條件下使用哪個選項對於一個應用程式的效能來說非常重要。一個錯誤的選擇可能會引發死鎖,並導致資料庫效能急劇下降或程序終止。而如果做出正確的選擇,則可以合理使用資源,使那些已經運行了幾個小時甚至幾天的程序在幾分鐘得以完成,這樣會使您立刻成為一位英雄。這篇文章就將簡單的討論每個索引選項。主要有以下內容:

[1] 基本的索引概念
查詢DBA_INDEXES檢視可得到表中所有索引的列表,注意只能通過USER_INDEXES的方法來檢索模式(schema)的索引。訪問USER_IND_COLUMNS檢視可得到一個給定表中被索引的特定列。

[2] 組合索引
當 某個索引包含有多個已索引的列時,稱這個索引為組合(concatented)索引。在 Oracle9i引入跳躍式掃描的索引訪問方法之前,查詢只能在有限條件下使用該索引。比如:表emp有一個組合索引鍵,該索引包含了empno、 ename和deptno。在Oracle9i之前除非在where之句中對第一列(empno)指定一個值,否則就不能使用這個索引鍵進行一次範圍掃描。
特別注意:在Oracle9i之前,只有在使用到索引的前導索引時才可以使用組合索引!

[3] ORACLE ROWID
通過每個行的ROWID,索引Oracle提供了訪問單行資料的能力。ROWID其實就是直接指向單獨行的線路圖。如果想檢查重複值或是其他對ROWID本身的引用,可以在任何表中使用和指定rowid列。

[4] 限制索引
限制索引是一些沒有經驗的開發人員經常犯的錯誤之一。在SQL中有很多陷阱會使一些索引無法使用。下面討論一些常見的問題:

4.1 使用不等於操作符(<>、!=)
下面的查詢即使在cust_rating列有一個索引,查詢語句仍然執行一次全表掃描。
select cust_Id,cust_name
from customers
where cust_rating <> 'aa';
把上面的語句改成如下的查詢語句,這樣,在採用基於規則的優化器而不是基於代價的優化器(更智慧)時,將會使用索引。
select cust_Id,cust_name
from customers
where cust_rating < 'aa' or cust_rating > 'aa';
特別注意:通過把不等於操作符改成OR條件,就可以使用索引,以避免全表掃描。

4.2 使用IS NULL 使 用IS NULL 會限制索引的使用。因為NULL值並沒有被定義。在SQL語句中使用NULL會有很多的麻煩。因此建議開發人員在建表時,把需要索引的列設成NOT NULL。如果被索引的列在某些行中存在NULL值,就不會使用這個索引(除非索引是一個位圖索引,關於點陣圖索引在稍後在詳細討論)。

4.3 使用函式
如果不使用基於函式的索引,那麼在SQL語句的WHERE子句中對存在索引的列使用函式時,會使優化器忽略掉這些索引。
下面的查詢不會使用索引(只要它不是基於函式的索引)
select empno,ename,deptno
from emp
where trunc(hiredate)='01-MAY-81';
把上面的語句改成下面的語句,這樣就可以通過索引進行查詢。
select empno,ename,deptno
from emp
where hiredate<(to_date('01-MAY-81')+0.9999);

4.4 比較不匹配的資料型別
比較不匹配的資料型別也是比較難於發現的效能問題之一。
注意下面查詢的例子,account_number是一個VARCHAR2型別,在account_number欄位上有索引。下面的語句將執行全表掃描。
select bank_name,address,city,state,zip
from banks
where account_number = 990354;
Oracle可以自動把where子句變成to_number(account_number)=990354,這樣就限制了索引的使用,改成下面的查詢就可以使用索引:
select bank_name,address,city,state,zip
from banks
where account_number ='990354';
特別注意:不匹配的資料型別之間比較會讓Oracle自動限制索引的使用,即便對這個查詢執行Explain Plan也不能讓您明白為什麼做了一 次“全表掃描”。

[5] 選擇性
使用USER_INDEXES檢視,該檢視中顯示了一個distinct_keys列。比較一下唯一鍵的數量和表中的行數,就可以判斷索引的選擇性。選擇性越高,索引返回的資料就越少。

[6] 群集因子(Clustering Factor)
Clustering Factor位於USER_INDEXES檢視中。該列反映了資料相對於已索引的列是否顯得有序。如果Clustering Factor列的值接近於索引中的樹葉塊(leaf block)的數目,表中的資料就越有序。如果它的值接近於表中的行數,則表中的資料就不是很有序。


[7] 二元高度(Binary height)
索引的二元高度對把ROWID返回給使用者程序時所要求的I/O量起到關鍵作用。在對一個索引進行分析後,可以通過查詢DBA_INDEXES的B- level列檢視它的二元高度。二元高度主要隨著表的大小以及被索引的列中值的範圍的狹窄程度而變化。索引上如果有大量被刪除的行,它的二元高度也會增加。更新索引列也類似於刪除操作,因為它增加了已刪除鍵的數目。重建索引可能會降低二元高度。

[8] 快速全域性掃描
在Oracle7.3 後就可以使用快速全域性掃描(Fast Full Scan)這個選項。這個選項允許Oracle執行一個全域性索引掃描操作。快速全域性掃描讀取B-樹索引上所有樹葉塊。初始化檔案中的 DB_FILE_MULTIBLOCK_READ_COUNT引數可以控制同時被讀取的塊的數目。

[9] 跳躍式掃描
從Oracle9i開始,索引跳躍式掃描特性可以允許優化器使用組合索引,即便索引的前導列沒有出現在WHERE子句中。索引跳躍式掃描比全索引掃描要快的多。下面的程式清單顯示出效能的差別:
create index skip1 on emp5(job,empno);
index created.

select count(*)
from emp5
where empno=7900;

Elapsed:00:00:03.13

Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=4 Card=1 Bytes=5)
1 0 SORT(AGGREGATE)
2 1 INDEX(FAST FULL SCAN) OF 'SKIP1'(NON-UNIQUE)

Statistics

6826 consistent gets
6819 physical reads

select count(*)
from emp5
where empno=7900;

Elapsed:00:00:00.56

Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=6 Card=1 Bytes=5)
1 0 SORT(AGGREGATE)
2 1 INDEX(SKIP SCAN) OF 'SKIP1'(NON-UNIQUE)

Statistics

21 consistent gets
17 physical reads

[10] 索引的型別
B-樹索引
點陣圖索引
HASH索引
索引編排表
反轉鍵索引
基於函式的索引
分割槽索引
本地和全域性索引

相關推薦

Oracle優化索引原理[注意索引跳躍式掃描!

Oracle 提供了大量索引選項。知道在給定條件下使用哪個選項對於一個應用程式的效能來說非常重要。一個錯誤的選擇可能會引發死鎖,並導致資料庫效能急劇下降或程序終止。而如果做出正確的選擇,則可以合理使用資源,使那些已經運行了幾個小時甚至幾天的程序在幾分鐘得以完成,這樣會使您立刻成為一位英雄。這篇文章就將簡單的討

MySQL優化(三):索引原理索引優化

建立高效能索引索引是提高MySQL查詢效能的一個重要途徑,但過多的索引可能會導致過高的磁碟使用率以及過高的記憶體佔用,從而影響應用程式的整體效能。應當儘量避免事後才想起新增索引,因為事後可能需要監控大量的SQL才能定位到問題所在,而且新增索引的時間肯定是遠大於初始新增索引所需

索引原理-btree索引與hash索引的區別

基於 信息 一起 特殊性 hash算法 一個 即使 數據 就會   btree索引與hash索引的區別,之前不清楚,mark一下。   Hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多

資料庫系列--資料庫底層索引原理索引資料結構 B+樹

1、什麼是索引 在關係資料庫中,索引是一種單獨的、物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。 索引是

oracle 優化--索引

數據庫應用 oracle create 程序 原則性 一、事務1、簡介事務是數據處理的核心,是業務上的一個邏輯單元,它能夠保證其中對數據所有的操作,要麽全部成功,要麽全部失敗。DBMS通過事務的管理來協調用戶的並發行為,減少用戶訪問資源的沖突。 1)顯示提交:當事務遇到COMMIT指令時,

MySQL索引原理及慢查詢優化(轉)

範圍 很難 等於 right 事件 原理 插入 jpg 個人網站 轉自:美團點評技術團隊http://tech.meituan.com/mysql-index.html MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經成為絕大多數互聯網公司的首選關系型數據庫。雖然性

MySQL索引原理及慢查詢優化-zz

`` 原理 並不是 計劃 ora 實的 birt 總計 war https://tech.meituan.com/mysql-index.html MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經成為絕大多數互聯網公司的首選關系型數據庫。雖然性能出色,但所謂“好馬配

mysql:索引原理與慢查詢優化

一個 mark index out 般的 test output 都是 records 一 介紹 二 索引的原理 三 索引的數據結構 三 MySQL索引管理 四 測試索引 五 正確使用索引 六 查詢優化神器-explain 七 慢查詢優化的基本步驟 八 慢日誌管理 九 參

數據庫索引優化原理索引的工作機制

更新 重點 黃金 在一起 view gen 一點 lan 成了 我們通過一個簡單的例子來開始教程,解釋為什麽我們需要數據庫索引。假設我們有一個數據庫表 Employee, 這個表有三個字段(列)分別是 Employee_Name、Employee_Age 和Employee

MySQL數據備份 索引原理以及查詢優化

權限 示例 .cn 顯示 一個 物理 mysqld 恢復 cmd 補充 MySQL可視化(IDE)工具 我們之前對數據庫的操作都是通過cmd命令進行的比較繁瑣 那麽有沒有更漸變的方法去辦這個事呢? 答案事必須的 往下看吧。。。     navicat該工具是一

MySQL數據庫學習【第九篇】索引原理與慢查詢優化

xxx 結構 復合 unix select查詢 全文搜索 等等 學習 獲取數據 一、介紹 1.什麽是索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對

MySQL 之 索引原理與慢查詢優化

英文 borde 發生 聚集 引擎 返回 位置 時間 pro 一 索引介紹 二 索引類型 三 索引分類 四 聚合索引和輔助索引 五 測試索引 六 正確使用索引 七 組合索引 八 註意事項 九 查詢計劃 十 慢日誌查詢 十一 大數據量分頁優化 1. 索引介紹

mysql五:索引原理與慢查詢優化

mysql索引原理與慢查詢優化一、介紹1、為何要有索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對查詢語句的優化顯然是重中之重。說起加速查詢,就不得不提到索引了。2、什麽是索引?

MySQL索引原理以及查詢優化

地址 存儲引擎 想要 方式 聯合 執行 圖書 解決 範圍查詢 一、介紹 1.什麽是索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對查詢語句的優化顯然

索引原理和SQL優化(轉載待整理)

索引的本質 MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是資料結構。 我們知道,資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能儘可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最

阿里P8架構師談:MySQL資料庫的索引原理、與慢SQL優化的5大原則

MySQL憑藉著出色的效能、低廉的成本、豐富的資源,已經成為絕大多數網際網路公司的首選關係型資料庫。雖然效能出色,但所謂“好馬配好鞍”,如何能夠更好的使用它,已經成為開發工程師的必修課,我們經常會從職位描述上看到諸如“精通MySQL”、“SQL語句優化”、“瞭解資料庫原理”等要求。 我們知道一般

oracle 優化之組合索引

組合索引適用場景: 1.適用在單獨查詢返回記錄很多,組合查詢後忽然返回記錄很少的情況: 比如where 學歷=碩士以上 返回不少的記錄 比如where 職業=收銀員 同樣返回不少的記錄 於是無論哪個條件查詢做索引,都不合適。 可是,如果學歷為碩士以上,同時職業又是收銀員的,返回的就少之又少了。 於是聯合

MySQL - - 索引原理與慢查詢優化

詳解 limit 性能 取出 平衡 獲取數據 目的 官方文檔 百度 目錄 索引介紹 索引方法 索引類型 聚合索引和輔助索引 測試索引 正確使用索引 組合索引 註意事項 查詢計劃 慢日誌查詢 大數據量分頁優化 EXPLAIN 詳解 1, 索引介紹 需求: 一般的應用系

【轉載】Elasticsearch基礎介紹及索引原理分析

ES基礎資料結構分析的非常透徹,倒排索引,跳錶,壓縮技巧,聯合索引等 轉載:https://www.cnblogs.com/dreamroute/p/8484457.html 最近在參與一個基於Elasticsearch作為底層資料框架提供大資料量(億級)的實時統計查詢的方案設計工作,花

Elasticsearch基礎介紹及索引原理分析

轉:https://www.cnblogs.com/dreamroute/p/8484457.html 介紹 Elasticsearch 是一個分散式可擴充套件的實時搜尋和分析引擎,一個建立在全文搜尋引擎 Apache Lucene™ 基礎上的搜尋引擎.當然 Elasticsearc