oracle SQL表執行路徑(表掃瞄方式)

2021-05-12 19:39:16 字數 2441 閱讀 6492

oracle sql表執行路徑(表掃瞄方式)

優化器在形成執行計畫時需要做的乙個重要選擇是如何從資料庫查詢出需要的資料。對於sql語句訪問的任何表中的任何行,可能存在許多訪問路徑,通過它們可以定位和查詢出需要的資料。優化器會選擇其中自認為最優化的路徑。在物理層,oracle讀取資料,一次讀取的最小單位為資料庫塊,一次讀取的最大值由作業系統一次i/o的最大值與mulitblock引數共同決定,所以即使只需要一行資料,也是將該行所在的資料庫塊讀入記憶體。邏輯上,oralce用如下訪問方法訪問資料:1)全表掃瞄(full table scans,fts);2)通過rowid的表訪問(table access by rowid或rowid lookup);3)索引掃瞄(index scan或index lookup)。

1)全表掃瞄(full table scans,fts)

為實現全表掃瞄,oracle讀取表中所有的行,並檢查每一行是否滿足語句的where限制條件。oracle順序地讀取了分配給表的每個資料塊,直到讀到表的最高水線處(high water mak,hwm)。乙個多塊讀操作可以使一次i/o能讀取多塊資料塊(由db_block_multiblock_read_count引數設定),而不是只讀取乙個資料塊,這可以極大減少i/o的總次數,提高系統的吞吐量,所以利用多塊讀的方法可以十分高效地實現全表掃瞄,而且只有在全表掃瞄的情況下才能使用多塊讀操作。在這種訪問模式下,每個資料塊只能被讀一次。由於hwm標識最後一塊被讀入的資料,而delete操作不影響hwm值,所以乙個表的所有資料被delete後,其全表掃瞄的時間不會有所改善,所以一般要使用truncate命令使得hwm值歸為0。

適用情況:在較大的表上不建議適用全表掃瞄,除非取出的資料比較多,超過總量的5%-10%,或者想適用並行查詢功能時。

eg:2)通過rowid的表訪問(table access by rowid或rowid lookup)

資料行的rowid指出了該行所在的資料檔案、資料塊以及行在該塊中的位置,所以通過rowid來訪問資料可以快速定位到目標資料上,是oracle訪問單行資料的最快方法。

為了通過rowid訪問表,oracle首先要獲取被選擇行的rowid,或者從語句的where子句中得到,或者通過表的乙個或多個索引的索引掃瞄得到。oracle然後以得到的rowid為依據定位每個被選擇的行。這種訪問方法一次i/o只能讀取乙個資料塊。

eg: 3)

索引掃瞄(index scan或index lookup)

首先通過index查詢到資料對應的rowid值,然後根據rowid直接從表中得到具體的資料,稱為索引掃瞄或索引查詢。乙個rowid唯一的表示一行資料,該行對應的資料塊是通過一次i/o得到的,故該次i/o只讀取乙個資料庫塊。在索引中,除了儲存每個索引的值外,索引還儲存具有此值的行對應的rowid值。索引掃瞄可以由2步組成:a)掃瞄索引得到對應的rowid值;b)通過找到的rowid從表中讀取具體的資料。每步都是單獨的一次i/o,但是對於索引,由於經常使用,絕大多數據都已經cache到記憶體中,所以第一步的i/o經常是邏輯i/o,即資料可以從記憶體中得到。但是,對於第二步來說,如果表比較大,則其資料不可能全在記憶體中,所以其i/o很有可能是物理i/o,是極其耗時的。所以如果對大表進行索引掃瞄,取出的資料如果大於總量的5%-10%,使用索引掃瞄效率會下降很多。

根據索引的型別與where限制條件的不同,索引掃瞄可以分為以下幾種:3.1)索引唯一掃瞄(index unique scan);3.2)索引範圍掃瞄(index rang scan);3.3)索引全掃瞄(index full scan);3.4)索引快速掃瞄(index fast full scan)。

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

通過唯一索引查詢資料經常返回單個rowid。如果該唯一索引有多個列組成(即組合索引),則至少要有組合索引的引導列參與到該查詢中。如果結果只返回一行,則為索引唯一掃瞄。

eg:3.2

)索引範圍掃瞄(index rang scan)

使用乙個索引訪問多行資料,或者使用組合索引結果返回多行記錄,則該訪問方法為索引範圍掃瞄。在唯一索引上使用索引範圍掃瞄的典型情況是在where子句中使用了範圍操作符<,>,<=,>=,between and 等。使用索引範圍掃瞄的情況:a)在唯一索引列上使用了範圍操作符<,>,<=,>=,between and 等。b)在組合索引上,只使用部分列進行查詢,導致查詢出多行。c)對於非唯一索引列進行的任務查詢。eg:

3.3)索引全掃瞄(index full scan)

在某些情況下,可能需要進行索引全掃瞄而不是範圍掃瞄,全索引掃瞄只有在cbo模式下才能有效。cbo根據統計數值得知進行全索引掃瞄比進行全表掃瞄更有效時,才進行全索引掃瞄,而且此時查詢出的資料都必須從索引中可以直接得到。eg:

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

掃瞄索引中的所有資料塊,與索引全掃瞄類似,但是乙個顯著的區別就是它不對查詢出的資料進行排序,即資料不是以排序順序被返回的。在這種訪問方法中,可以使用多快讀功能,也可以使用並行讀入,以便獲得最大吞吐量與縮短執行時間。eg:

查詢執行路徑

當希望 mysql 能夠以更高的效能進行查詢時,最好的辦法就是弄清楚 mysql 是如何進行優化和查詢的。一旦理解這一點,很多查詢優化工作實際上就是遵循一些原則讓優化器能夠按照預想的合理的方式執行。下圖顯示了 mysql 如何處理乙個使用者請求的過程。img 從圖中可見,它的處理過程大致是這樣的 1...

bat檔案 執行路徑

最近用到了bat的一些東西,就是用c 程式呼叫bat檔案時,bat檔案中的路徑怎樣動態的獲取呢?用 dp0 可以得到。比如要註冊乙個名為test.dll的檔案,dll檔案和bat檔案放在同乙個資料夾下 bat檔案寫法 regsvr32 dp0test.dll s 又比如要呼叫另外乙個bat檔案 檔名...

MySQL查詢執行路徑

mysql查詢執行路徑 1.客戶端傳送一條查詢給伺服器 2.伺服器先會檢查查詢快取,如果命中了快取,則立即返回儲存在快取中的結果。否則進入下一階段 3.伺服器端進行sql解析 預處理,再由優化器生成對應的執行計畫 4.mysql根據優化器生成的執行計畫,呼叫儲存引擎的api來執行查詢 5.將結果返回...