日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

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

本篇文章介紹了跟SQL語(yǔ)句性能提升有關(guān)的執(zhí)行計(jì)劃,工作時(shí)間長(zhǎng)了,或者說(shuō)高手的進(jìn)階途徑之一,就是如何能夠在數(shù)據(jù)量很大的情況下,數(shù)據(jù)庫(kù)的查詢效率還能保持良好的性能。

感興趣的朋友,可以收藏這篇文章哦,未來(lái)一定有用,對(duì)于高手就算了。當(dāng)然非常希望高手能夠指正文章內(nèi)容的錯(cuò)誤。

1 什么是執(zhí)行計(jì)劃

執(zhí)行計(jì)劃是一條查詢語(yǔ)句在 Oracle 中的執(zhí)行過(guò)程或訪問(wèn)路徑的描述。


2 配置執(zhí)行計(jì)劃需要顯示的項(xiàng)。


3 執(zhí)行計(jì)劃的常用列字段解釋

基數(shù)(Cardinality):Oracle 估計(jì)的當(dāng)前操作的返回結(jié)果集行數(shù)

字節(jié)(Bytes):執(zhí)行該步驟后返回的字節(jié)數(shù)

耗費(fèi)(COST)、CPU 耗費(fèi):Oracle 估計(jì)的該步驟的執(zhí)行成本,用于說(shuō)明 SQL 執(zhí)行的

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

時(shí)間(Time):Oracle 估計(jì)的當(dāng)前操作所需的時(shí)間。


4 使用執(zhí)行計(jì)劃

通過(guò)工具啟動(dòng)執(zhí)行計(jì)劃。選中需要查看執(zhí)行計(jì)劃的查詢語(yǔ)句,在工具欄中選擇

Tools--->Explain Plan

或者是選擇需要查看執(zhí)行計(jì)劃的查詢語(yǔ)句后按 F5


5 查看執(zhí)行計(jì)劃

5.1 執(zhí)行順序

縮進(jìn)最多的最先執(zhí)行;(縮進(jìn)相同時(shí),最上面的最先執(zhí)行)。

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

? TABLEACCESS FULL(全表掃描)

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

? TABLEACCESS BY INDEX SCAN(索引掃描)

5.2.1TABLEACCESS FULL (全表掃描)

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

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

表數(shù)據(jù)總量的 5% ~ 10% 或以上

5.2.2 TABLE ACCESS BY INDEX ROWID (通過(guò) ROWID 的

表存取)

5.2.2.1 什么是 ROWID

ROWID 是由 Oracle 自動(dòng)加在表中每行最后的一列偽列,既然是偽列,就說(shuō)明表中并不

會(huì)物理存儲(chǔ) ROWID 的值。

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

一旦一行數(shù)據(jù)插入后,則其對(duì)應(yīng)的 ROWID 在該行的生命周期內(nèi)是唯一的,即使發(fā)生行

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

5.2.2.2 TABLE ACCESS BY INDEX ROWID

行的 ROWID 指出了該行所在的數(shù)據(jù)文件、數(shù)據(jù)塊以及行在該塊中的位置,所以通過(guò)

ROWID 可以快速定位到目標(biāo)數(shù)據(jù)上,這也是 Oracle 中存取單行數(shù)據(jù)最快的方法;

5.2.3 TABLEACCESS BY INDEX SCAN (索引掃描)

在索引塊中,既存儲(chǔ)每個(gè)索引的鍵值,也存儲(chǔ)具有該鍵值的行的 ROWID。

5.2.3.1 索引掃描其實(shí)分為兩步

1 掃描索引得到對(duì)應(yīng)的 ROWID。

2 通過(guò) 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 (索引唯一掃描)

針對(duì)唯一性索引(UNIQUE INDEX)的掃描,每次至多只返回一條記錄;

表中某字段存在 UNIQUE、PRIMARYKEY 約束時(shí),Oracle 常實(shí)現(xiàn)唯一性掃描;

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

使用一個(gè)索引存取多行數(shù)據(jù);

發(fā)生索引范圍掃描的三種情況:

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

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

3 對(duì)非唯一索引列上進(jìn)行的任何查詢;

5.2.3.2.3 INDEX FULLSCAN (索引全掃描)

進(jìn)行全索引掃描時(shí),查詢出的數(shù)據(jù)都必須從索引中可以直接得到;

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

掃描索引中的所有的數(shù)據(jù)塊,與 INDEX FULL SCAN 類(lèi)似,但是一個(gè)顯著的區(qū)別是它

不對(duì)查詢出的數(shù)據(jù)進(jìn)行排序(即數(shù)據(jù)不是以排序順序被返回);

5.2.3.2.5 INDEX SKIPSCAN (索引跳躍掃描)

表有一個(gè)復(fù)合索引,且在查詢時(shí)有除了前導(dǎo)列(索引中第一列)外的其他列作為條件;

5.2.4 Oracle 的優(yōu)化器

5.2.4.1 Oracle 的優(yōu)化器 種類(lèi)

? RBO(Rule-Based Optimization) 基于規(guī)則的優(yōu)化器

? CBO(Cost-Based Optimization) 基于代價(jià)的優(yōu)化器

5.2.4.2 RBO 優(yōu)化器

RBO 有嚴(yán)格的使用規(guī)則,只要按照這套規(guī)則去寫(xiě) SQL 語(yǔ)句,無(wú)論數(shù)據(jù)表中的內(nèi)容怎樣,

也不會(huì)影響到你的執(zhí)行計(jì)劃。換句話說(shuō),RBO 對(duì)數(shù)據(jù)“不敏感”,它要求 SQL 編寫(xiě)人員必

須要了解各項(xiàng)細(xì)則。RBO 一直沿用至 ORACLE 9i,從 ORACLE 10g 開(kāi)始,RBO 已經(jīng)徹底

被拋棄。

5.2.4.3 CBO 優(yōu)化器

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

通過(guò)計(jì)算各種可能的執(zhí)行計(jì)劃的“代價(jià)”,即 COST,從中選用 COST 最低的執(zhí)行方案作為實(shí)

際運(yùn)行方案。


6 執(zhí)行計(jì)劃的使用

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 示例一

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

6.1.6.2 示例二

對(duì)薪水創(chuàng)建索引,使用薪水列做=、>、<、<>條件判斷。

6.2 多表

6.2.1 內(nèi)連接

6.2.1.1 示例一

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

6.2.1.2 示例二

使用子查詢,查詢所有部門(mén)以及所有部門(mén)下的雇員。

6.2.2 外連接

6.2.2.1 示例一

查詢所有雇員與雇員的部門(mén)名稱(chēng),包含那些沒(méi)有部門(mén)的雇員。

6.2.2.2 示例二

查詢所有部門(mén)以及雇員,包含哪些沒(méi)有雇員的部門(mén)。

感謝~~

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。