通過分析SQL語句的執行計畫優化SQL 七 (1)

2021-04-17 06:03:35 字數 1730 閱讀 1364

訪問路徑(方法) -- access path

優化器在形成執行計畫時需要做的乙個重要選擇是如何從資料庫查詢出需要的資料。對於

sql語句訪問的任何表中的任何行,可能存在許多訪問路徑(訪問方法),通過它們可以定位和查詢出需要的資料。優化器選擇其中自認為是最優化的路徑。

在物理層,oracle讀取資料,一次讀取的最小單位為資料庫塊(由多個連續的作業系統塊組成),一次讀取的最大值由作業系統一次i/o的最大值與multiblock引數共同決定,所以即使只需要一行資料,也是將該行所在的資料庫塊讀入記憶體。邏輯上,oracle用如下訪問方法訪問資料:

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

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

由fts模式讀入的資料被放到快取記憶體的least recently used (lru)列表的尾部,這樣可以使其快速交換出記憶體,從而不使記憶體重要的資料被交換出記憶體。

使用fts的前提條件:在較大的表上不建議使用全表掃瞄,除非取出資料的比較多,超過總量的5% -- 10%,或你想使用並行查詢功能時。

使用全表掃瞄的例子:

~~~~~~~~~~~~~~~~~~~~~~~~

sql> explain plan for select * from dual; query plan ------------------------------------ select statement [choose] cost= table access full dual

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

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

為了通過rowid訪問表,oracle 首先要獲取被選擇行的rowid,或者從語句的where子句中得到,或者通過表的乙個或多個索引的索引掃瞄得到。oracle然後以得到的rowid為依據定位每個被選擇的行。

這種訪問方法不會用到多塊讀操作,一次i/o只能讀取乙個資料塊。我們會經常在執行計畫中看到該訪問方法,如通過索引查詢資料。

使用rowid訪問的方法:

sql> explain plan for select * from dept where rowid = 'aaaaygaadaaaaataaf'; query plan ------------------------------------ select statement [choose] cost=1 table access by rowid dept [analyzed]

通過分析SQL語句的執行計畫優化SQL (二)

第1章 效能調整綜述 oracle資料庫是高度可調的資料庫產品。本章描述調整的過程和那些人員應與oracle伺服器的調整有關,以及與調整相關聯的作業系統硬體和軟體。本章包括以下方面 l 誰來調整系統?l 什麼時候調整?l 建立有效調整的目標 l 在設計和開發時的調整 l 調整產品系統 l 監控產品系...

通過分析SQL語句的執行計畫優化SQL 四

五 oracle的執行計畫 背景知識 為了更好的進行下面的內容我們必須了解一些概念性的術語 共享sql語句 為了不重複解析相同的sql語句 因為解析操作比較費資源,會導致效能下降 在第一次解析之後,oracle將sql語句及解析後得到的執行計畫存放在記憶體中。這塊位於系統全域性區域sga syste...

通過分析SQL語句的執行計畫優化SQL 三

四 oracle的優化器 優化器有時也被稱為查詢優化器,這是因為查詢是影響資料庫效能最主要的部分,不要以為只有select語句是查詢。實際上,帶有任何where條件的dml insert update delete 語句中都包含查詢要求,在後面的文章中,當說到查詢時,不一定只是指select語句,也...