oracle 前导列_通过 PL/SQL Developer (Oracle)-数据库(26)
本篇文章介紹了跟SQL語句性能提升有關(guān)的執(zhí)行計劃,工作時間長了,或者說高手的進(jìn)階途徑之一,就是如何能夠在數(shù)據(jù)量很大的情況下,數(shù)據(jù)庫的查詢效率還能保持良好的性能。
感興趣的朋友,可以收藏這篇文章哦,未來一定有用,對于高手就算了。當(dāng)然非常希望高手能夠指正文章內(nèi)容的錯誤。
1 什么是執(zhí)行計劃
執(zhí)行計劃是一條查詢語句在 Oracle 中的執(zhí)行過程或訪問路徑的描述。
2 配置執(zhí)行計劃需要顯示的項。
3 執(zhí)行計劃的常用列字段解釋
基數(shù)(Cardinality):Oracle 估計的當(dāng)前操作的返回結(jié)果集行數(shù)
字節(jié)(Bytes):執(zhí)行該步驟后返回的字節(jié)數(shù)
耗費(COST)、CPU 耗費:Oracle 估計的該步驟的執(zhí)行成本,用于說明 SQL 執(zhí)行的
代價,理論上越小越好(該值可能與實際有出入)
時間(Time):Oracle 估計的當(dāng)前操作所需的時間。
4 使用執(zhí)行計劃
通過工具啟動執(zhí)行計劃。選中需要查看執(zhí)行計劃的查詢語句,在工具欄中選擇
Tools--->Explain Plan
或者是選擇需要查看執(zhí)行計劃的查詢語句后按 F5
5 查看執(zhí)行計劃
5.1 執(zhí)行順序
縮進(jìn)最多的最先執(zhí)行;(縮進(jìn)相同時,最上面的最先執(zhí)行)。
5.2 表訪問的幾種方式(非全部) :
? TABLEACCESS FULL(全表掃描)
? TABLEACCESS BY INDEX ROWID(通過 ROWID 的表存取)
? TABLEACCESS BY INDEX SCAN(索引掃描)
5.2.1TABLEACCESS FULL (全表掃描)
Oracle 會讀取表中所有的行,并檢查每一行是否滿足 SQL 語句中的 Where 限制條件;
使用建議:數(shù)據(jù)量太大的表不建議使用全表掃描,除非本身需要取出的數(shù)據(jù)較多,占到
表數(shù)據(jù)總量的 5% ~ 10% 或以上
5.2.2 TABLE ACCESS BY INDEX ROWID (通過 ROWID 的
表存取)
5.2.2.1 什么是 ROWID
ROWID 是由 Oracle 自動加在表中每行最后的一列偽列,既然是偽列,就說明表中并不
會物理存儲 ROWID 的值。
你可以像使用其它列一樣使用它,只是不能對該列的值進(jìn)行增、刪、改操作。
一旦一行數(shù)據(jù)插入后,則其對應(yīng)的 ROWID 在該行的生命周期內(nèi)是唯一的,即使發(fā)生行
遷移,該行的 ROWID 值也不變。
5.2.2.2 TABLE ACCESS BY INDEX ROWID
行的 ROWID 指出了該行所在的數(shù)據(jù)文件、數(shù)據(jù)塊以及行在該塊中的位置,所以通過
ROWID 可以快速定位到目標(biāo)數(shù)據(jù)上,這也是 Oracle 中存取單行數(shù)據(jù)最快的方法;
5.2.3 TABLEACCESS BY INDEX SCAN (索引掃描)
在索引塊中,既存儲每個索引的鍵值,也存儲具有該鍵值的行的 ROWID。
5.2.3.1 索引掃描其實分為兩步
1 掃描索引得到對應(yīng)的 ROWID。
2 通過 ROWID 定位到具體的行讀取數(shù)據(jù)。
5.2.3.2 五種索引掃描
? INDEX UNIQUE SCAN(索引唯一掃描)
? INDEX RANGE SCAN(索引范圍掃描)
? INDEX FULL SCAN(索引全掃描)
? INDEX FAST FULL SCAN(索引快速掃描)
? INDEX SKIP SCAN(索引跳躍掃描)
5.2.3.2.1 INDEX UNIQUE SCAN (索引唯一掃描)
針對唯一性索引(UNIQUE INDEX)的掃描,每次至多只返回一條記錄;
表中某字段存在 UNIQUE、PRIMARYKEY 約束時,Oracle 常實現(xiàn)唯一性掃描;
5.2.3.2.2 INDEX RANGE SCAN (索引范圍掃描)
使用一個索引存取多行數(shù)據(jù);
發(fā)生索引范圍掃描的三種情況:
1 在唯一索引列上使用了范圍操作符(如:> < <> >= <= between);
2 在組合索引上,只使用部分列進(jìn)行查詢(查詢時必須包含前導(dǎo)列,否則會走全表掃描);
3 對非唯一索引列上進(jìn)行的任何查詢;
5.2.3.2.3 INDEX FULLSCAN (索引全掃描)
進(jìn)行全索引掃描時,查詢出的數(shù)據(jù)都必須從索引中可以直接得到;
5.2.3.2.4 INDEX FAST FULLSCAN (索引快速掃描)
掃描索引中的所有的數(shù)據(jù)塊,與 INDEX FULL SCAN 類似,但是一個顯著的區(qū)別是它
不對查詢出的數(shù)據(jù)進(jìn)行排序(即數(shù)據(jù)不是以排序順序被返回);
5.2.3.2.5 INDEX SKIPSCAN (索引跳躍掃描)
表有一個復(fù)合索引,且在查詢時有除了前導(dǎo)列(索引中第一列)外的其他列作為條件;
5.2.4 Oracle 的優(yōu)化器
5.2.4.1 Oracle 的優(yōu)化器 種類
? RBO(Rule-Based Optimization) 基于規(guī)則的優(yōu)化器
? CBO(Cost-Based Optimization) 基于代價的優(yōu)化器
5.2.4.2 RBO 優(yōu)化器
RBO 有嚴(yán)格的使用規(guī)則,只要按照這套規(guī)則去寫 SQL 語句,無論數(shù)據(jù)表中的內(nèi)容怎樣,
也不會影響到你的執(zhí)行計劃。換句話說,RBO 對數(shù)據(jù)“不敏感”,它要求 SQL 編寫人員必
須要了解各項細(xì)則。RBO 一直沿用至 ORACLE 9i,從 ORACLE 10g 開始,RBO 已經(jīng)徹底
被拋棄。
5.2.4.3 CBO 優(yōu)化器
CBO 是一種比 RBO 更加合理、可靠的優(yōu)化器,在 ORACLE 10g 中完全取代 RBO。CBO
通過計算各種可能的執(zhí)行計劃的“代價”,即 COST,從中選用 COST 最低的執(zhí)行方案作為實
際運行方案。
6 執(zhí)行計劃的使用
6.1 單表
6.1.1 分析查詢表中的所有數(shù)據(jù)
6.1.1.1 示例
查詢 employees 表中的所有數(shù)據(jù)
6.1.2 分析主鍵作為條件的查詢
6.1.2.1 示例
查詢 employees 表中 employees_id 為 100 的雇員
6.1.3 分析非主鍵列作為查詢條件
6.1.3.1 示例
查詢雇員名字為 Tarloy 的雇員
6.1.4 分析 like 條件
6.1.4.1 示例
查詢雇員名字中含有 a 的雇員
6.1.5 分析非唯一性索引列作為條件的查詢
6.1.5.1 示例一
將 last_name 創(chuàng)建索引
create index emp_name on employees(last_name);
6.1.5 分析非唯一性索引列作為條件的查詢
6.1.5.1 示例一
將 last_name 創(chuàng)建索引
create index emp_name on employees(last_name);
6.1.6 分析非唯一性索引中= 、> 、< 、<> 條件
6.1.6.1 示例一
對雇員薪水列做=、>、<、<>條件判斷。
6.1.6.2 示例二
對薪水創(chuàng)建索引,使用薪水列做=、>、<、<>條件判斷。
6.2 多表
6.2.1 內(nèi)連接
6.2.1.1 示例一
使用等值連接,查詢所有部門以及所有部門下的雇員。
6.2.1.2 示例二
使用子查詢,查詢所有部門以及所有部門下的雇員。
6.2.2 外連接
6.2.2.1 示例一
查詢所有雇員與雇員的部門名稱,包含那些沒有部門的雇員。
6.2.2.2 示例二
查詢所有部門以及雇員,包含哪些沒有雇員的部門。
感謝~~
總結(jié)
以上是生活随笔為你收集整理的oracle 前导列_通过 PL/SQL Developer (Oracle)-数据库(26)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python图像边缘检测_python
- 下一篇: matlab和python哪个运行快_M