oracle執行計畫的一些概念

2021-05-22 06:13:38 字數 4066 閱讀 8587

oracle執行計畫的一些概念(基礎的記憶)

開始學習oracle語句優化,從執行計畫開始,先熟悉這些名詞以及基本含義,記憶在我腦子裡,2010-04-10

rowid

:系統給

oracle

資料的每行附加的乙個偽列,包含資料表名稱,資料庫

id,儲存資料庫

id以及乙個流水號等資訊,

rowid

在行的生命週期內唯一。

recursive sql

:為了執行使用者語句,系統附加執行的額外操作語句,譬如對資料字典的維護等。

row source(行源)

oracle

執行步驟過程中,由上乙個操作返回的符合條件的行的集合。

predicate

(謂詞)

where

後的限制條件。

driving table(驅動表):又稱為連線的外層表,主要用於巢狀與

hash

連線中。

一般來說是將應用限制條件後,返回較少行源的表作為驅動表。在後面的描述中,將

driving table

稱為連線操作的

row source 1

probed table

(被探查表):連線的內層表,在我們從

driving table

得到具體的一行資料後,在

probed table

中尋找符合條件的行,所以該錶應該為較大的

row source

,並且對應連線條件的列上應該有索引。在後面的描述中,一般將該錶稱為連線操作的

row source 2.

concatenated index

(組合索引):乙個索引如果由多列構成,那麼就稱為組合索引,組合索引的第一列為引導列,只有謂詞中包含引導列時,索引才可用。

可選擇性:表中某列的不同數值數量

/表的總行數如果接近於

1,則列的可選擇性為高。

oracle

訪問資料的訪問方法:

full table scan (fts

全表掃瞄)通過設定

db_block_multiblock_read_count

可以設定一次

io能讀取的資料塊個數,從而有效減少全表掃瞄時的

io總次數,也就是通過預讀機制將將要訪問的資料塊預先讀入記憶體中。只有在全表掃瞄情況下才能使用多塊讀操作。

table access by rowed(通過

rowid訪問表,

rowid lookup由於

rowid

中記錄了行儲存的位置,所以這是

oracle

訪問單行資料的最快方法。

index scan(索引掃瞄

index lookup):在索引中,除了儲存每個索引的值外,索引還儲存具有此值的行對應的

rowid

值,索引掃瞄分兩步(1),掃瞄索引得到rowid(2),通過rowid讀取具體資料。每步都是單獨的一次

io,所以如果資料經限制條件過濾後的總量大於原表總行數的5%-

10%,則使用索引掃瞄效率下降很多。而如果結果資料能夠全部在索引中找到,則可以避免第二步操作,從而加快檢索速度。

根據索引型別與

where

限制條件的不同,有

4種型別的索引掃瞄:

index unique scan(索引唯一掃瞄):

存在

unique

或者primary key

的情況下,返回單個

rowid

資料內容.

index range scan(索引範圍掃瞄):(1)

,在唯一索引上使用了

range

操作符(

>,<,<>,>=,<=,between

);(2)

,在組合索引上,只使用部分列進行查詢;

(3),對非唯一索引上的列進行的查詢。

index full scan(索引全掃瞄):需要查詢的資料從索引中可以全部得到。

index fast full scan(索引快速掃瞄):

index full scan

類似,但是這種方式下不對結果進行排序。

目前為止,典型的連線型別有3種:

sort merge joinsmj排序-合併連線):首先生產

driving table

需要的資料,然後對這些資料按照連線操作關聯列進行排序;然後生產

probed table

需要的資料,然後對這些資料按照與

driving table

對應的連線操作列進行排序;最後兩邊已經排序的行被放在一起執行合併操作。排序是乙個費時、費資源的操作,特別對於大表。所以

smj通常不是乙個特別有效的連線方法,但是如果

driving table

和probed table

都已經預先排序,則這種連線方法的效率也比較高。

nested loopsnl巢狀迴圈):連線過程就是將

driving table

和probed table

進行一次巢狀迴圈的過程。就是用

driving table

的每一行去匹配

probed table

的所有行。

nested loops

可以先返回已經連線的行,而不必等待所有的連線操作處理完成才返回資料,這可以實現快速的響應時間。

hash join(雜湊連線):較小的

row source

被用來構建

hash table

與bitmap

,第二個

row source

用來被hashed

,並與第乙個

row source

生產的hash table

進行匹配。以便進行進一步的連線。當被構建的

hash table

與bitmap

能被容納在記憶體中時,這種連線方式的效率極高。但需要設定合適的

hash_area_size

引數且只能用於等值連線中。

cartesian product(笛卡爾積):表的每一行依次與另外一表的所有行匹配。

oracle執行計畫的一些概念

oracle執行計畫的一些概念 rowid 系統給oracle資料的每行附加的乙個偽列,包含資料表名稱,資料庫id,儲存資料庫id以及乙個流水號等資訊,rowid在行的生命週期內唯一。recursive sql 為了執行使用者語句,系統附加執行的額外操作語句,譬如對資料字典的維護等。predicat...

oracle執行計畫相關概念

oracle執行計畫相關概念 1.什麼是執行計畫?為什麼要了解執行計畫?為了執行一條sql語句,oracle可能必須要執行某些步驟的操作,每一步驟可能是從資料庫中物理檢索資料行,或者用某種方法準備資料行,供發出語句的使用者使用。oracle用來執行語句的這些步驟的組合即為執行計畫。執行計畫是sql優...

有關執行計畫,空間釋放的另一些

最近負責起了dba的部分工作,於是有一天在對錶空間的清理中發現了一張表,這個表有27g那麼大,是乙個分割槽表,按天分割槽。我檢視了過程,每天刪除35天以前的資料,但是用的方法是delete,那麼我就可以很明確的推斷出,這個表占用了大量本應該釋放的空間。我第乙個使用的方法是move alter tab...