日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

oracle 前导列_通过 PL/SQL Developer (Oracle)-数据库(26)

發布時間:2025/4/16 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 前导列_通过 PL/SQL Developer (Oracle)-数据库(26) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇文章介紹了跟SQL語句性能提升有關的執行計劃,工作時間長了,或者說高手的進階途徑之一,就是如何能夠在數據量很大的情況下,數據庫的查詢效率還能保持良好的性能。

感興趣的朋友,可以收藏這篇文章哦,未來一定有用,對于高手就算了。當然非常希望高手能夠指正文章內容的錯誤。

1 什么是執行計劃

執行計劃是一條查詢語句在 Oracle 中的執行過程或訪問路徑的描述。


2 配置執行計劃需要顯示的項。


3 執行計劃的常用列字段解釋

基數(Cardinality):Oracle 估計的當前操作的返回結果集行數

字節(Bytes):執行該步驟后返回的字節數

耗費(COST)、CPU 耗費:Oracle 估計的該步驟的執行成本,用于說明 SQL 執行的

代價,理論上越小越好(該值可能與實際有出入)

時間(Time):Oracle 估計的當前操作所需的時間。


4 使用執行計劃

通過工具啟動執行計劃。選中需要查看執行計劃的查詢語句,在工具欄中選擇

Tools--->Explain Plan

或者是選擇需要查看執行計劃的查詢語句后按 F5


5 查看執行計劃

5.1 執行順序

縮進最多的最先執行;(縮進相同時,最上面的最先執行)。

5.2 表訪問的幾種方式(非全部) :

? TABLEACCESS FULL(全表掃描)

? TABLEACCESS BY INDEX ROWID(通過 ROWID 的表存取)

? TABLEACCESS BY INDEX SCAN(索引掃描)

5.2.1TABLEACCESS FULL (全表掃描)

Oracle 會讀取表中所有的行,并檢查每一行是否滿足 SQL 語句中的 Where 限制條件;

使用建議:數據量太大的表不建議使用全表掃描,除非本身需要取出的數據較多,占到

表數據總量的 5% ~ 10% 或以上

5.2.2 TABLE ACCESS BY INDEX ROWID (通過 ROWID 的

表存取)

5.2.2.1 什么是 ROWID

ROWID 是由 Oracle 自動加在表中每行最后的一列偽列,既然是偽列,就說明表中并不

會物理存儲 ROWID 的值。

你可以像使用其它列一樣使用它,只是不能對該列的值進行增、刪、改操作。

一旦一行數據插入后,則其對應的 ROWID 在該行的生命周期內是唯一的,即使發生行

遷移,該行的 ROWID 值也不變。

5.2.2.2 TABLE ACCESS BY INDEX ROWID

行的 ROWID 指出了該行所在的數據文件、數據塊以及行在該塊中的位置,所以通過

ROWID 可以快速定位到目標數據上,這也是 Oracle 中存取單行數據最快的方法;

5.2.3 TABLEACCESS BY INDEX SCAN (索引掃描)

在索引塊中,既存儲每個索引的鍵值,也存儲具有該鍵值的行的 ROWID。

5.2.3.1 索引掃描其實分為兩步

1 掃描索引得到對應的 ROWID。

2 通過 ROWID 定位到具體的行讀取數據。

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 常實現唯一性掃描;

5.2.3.2.2 INDEX RANGE SCAN (索引范圍掃描)

使用一個索引存取多行數據;

發生索引范圍掃描的三種情況:

1 在唯一索引列上使用了范圍操作符(如:> < <> >= <= between);

2 在組合索引上,只使用部分列進行查詢(查詢時必須包含前導列,否則會走全表掃描);

3 對非唯一索引列上進行的任何查詢;

5.2.3.2.3 INDEX FULLSCAN (索引全掃描)

進行全索引掃描時,查詢出的數據都必須從索引中可以直接得到;

5.2.3.2.4 INDEX FAST FULLSCAN (索引快速掃描)

掃描索引中的所有的數據塊,與 INDEX FULL SCAN 類似,但是一個顯著的區別是它

不對查詢出的數據進行排序(即數據不是以排序順序被返回);

5.2.3.2.5 INDEX SKIPSCAN (索引跳躍掃描)

表有一個復合索引,且在查詢時有除了前導列(索引中第一列)外的其他列作為條件;

5.2.4 Oracle 的優化器

5.2.4.1 Oracle 的優化器 種類

? RBO(Rule-Based Optimization) 基于規則的優化器

? CBO(Cost-Based Optimization) 基于代價的優化器

5.2.4.2 RBO 優化器

RBO 有嚴格的使用規則,只要按照這套規則去寫 SQL 語句,無論數據表中的內容怎樣,

也不會影響到你的執行計劃。換句話說,RBO 對數據“不敏感”,它要求 SQL 編寫人員必

須要了解各項細則。RBO 一直沿用至 ORACLE 9i,從 ORACLE 10g 開始,RBO 已經徹底

被拋棄。

5.2.4.3 CBO 優化器

CBO 是一種比 RBO 更加合理、可靠的優化器,在 ORACLE 10g 中完全取代 RBO。CBO

通過計算各種可能的執行計劃的“代價”,即 COST,從中選用 COST 最低的執行方案作為實

際運行方案。


6 執行計劃的使用

6.1 單表

6.1.1 分析查詢表中的所有數據

6.1.1.1 示例

查詢 employees 表中的所有數據

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 創建索引

create index emp_name on employees(last_name);

6.1.5 分析非唯一性索引列作為條件的查詢

6.1.5.1 示例一

將 last_name 創建索引

create index emp_name on employees(last_name);

6.1.6 分析非唯一性索引中= 、> 、< 、<> 條件

6.1.6.1 示例一

對雇員薪水列做=、>、<、<>條件判斷。

6.1.6.2 示例二

對薪水創建索引,使用薪水列做=、>、<、<>條件判斷。

6.2 多表

6.2.1 內連接

6.2.1.1 示例一

使用等值連接,查詢所有部門以及所有部門下的雇員。

6.2.1.2 示例二

使用子查詢,查詢所有部門以及所有部門下的雇員。

6.2.2 外連接

6.2.2.1 示例一

查詢所有雇員與雇員的部門名稱,包含那些沒有部門的雇員。

6.2.2.2 示例二

查詢所有部門以及雇員,包含哪些沒有雇員的部門。

感謝~~

總結

以上是生活随笔為你收集整理的oracle 前导列_通过 PL/SQL Developer (Oracle)-数据库(26)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。