oracle優化
記錄點常識:1、為實現全表掃描,Oracle讀取表中所有的行,并檢查每一行是否滿足語句的WHERE限制條件一個多塊讀操作可以使一次I/O能讀取多塊數據塊 (db_block_multiblock_read_count參數設定),而不是只讀取一個數據塊,這極大的減 少了I/O總次數,提高了系統的吞吐量,所以利用多塊讀的方法可以十分高效地實現全表掃描,而且只有在全表掃描的情況下才能使用多塊讀操作。在這種訪問模 式下,每個數據塊只被讀一次。
2、先通過index查找到數據對應的rowid值(對于非唯一索引可能返回多個rowid值),然后根據rowid直接從表中得到具體的數據,這 種查找方式稱為索引掃描或索引查找(index lookup)。一個rowid唯一的表示一行數據,該行對應的數據塊是通過一次i/o得到的,在此情況下該次i/o只會讀取一個數據庫塊。
在索引中,除了存儲每個索引的值外,索引還存儲具有此值的行對應的ROWID值。
索引掃描可以由2步組成:
(1) 掃描索引得到對應的rowid值。
?。?) 通過找到的rowid從表中讀出具體的數據。
每步都是單獨的一次I/O,但是對于索引,由于經常使用,絕大多數都已經CACHE到內存中,所以第1步的 I/O經常是邏輯I/O,即數據可以從內存中得到。但是對于第2步來說,如果表比較大,則其數據不可能全在內存中,所以其I/O很有可能是物理I/O,這 是一個機械操作,相對邏輯I/O來說,是極其費時間的。所以如果多大表進行索引掃描,取出的數據如果大于總量的5% —— 10%,使用索引掃描會效率下降很多
?。?) 通過找到的rowid從表中讀出具體的數據。
每步都是單獨的一次I/O,但是對于索引,由于經常使用,絕大多數都已經CACHE到內存中,所以第1步的 I/O經常是邏輯I/O,即數據可以從內存中得到。但是對于第2步來說,如果表比較大,則其數據不可能全在內存中,所以其I/O很有可能是物理I/O,這 是一個機械操作,相對邏輯I/O來說,是極其費時間的。所以如果多大表進行索引掃描,取出的數據如果大于總量的5% —— 10%,使用索引掃描會效率下降很多
然后對于特殊的業務場景要先做數據的篩選,然后再做查詢 關于查詢篩選出來的結果集能不能走到索引這個問題需要再測試一下
posted on 2011-11-08 16:44 doctor 閱讀(187) 評論(0) 編輯 收藏 所屬分類: 工作筆記