微課sql最佳化(10)、關於資料訪問方法

orastar發表於2020-03-04

1、Table Access Operations

在Oracle資料庫中SQL訪問表的資料有2種方式:
  • TABLE ACCESS FULL、
  • TABLE ACCESS BY ROWID

  • Full Table Scans
全表掃描使用多塊讀,透過引數db_file_multiblock_read_count設定單次IO可以讀取的資料塊數。
當Oracle伺服器使用序列全表掃描讀取塊時,他們使用least
recently used(LRU)的緩衝區快取LRU列表。對於parallel(並行)掃描,當查詢資料塊不在緩衝區時,資料塊的讀寫採用direct I/O方式直接讀入子查詢程式的PGA中。
如果查詢行數較多(超過10%)或使用並行查詢時使用全表掃描會比較高效。否則,索引掃描會比較高效。
高水位是表中最後一個使用的資料塊。如果刪除表中的資料,該表的所有資料塊或部分資料塊可能為空,但全表掃描仍然會讀該塊。即全表掃描從高水位以下讀取,最佳化方法,降低高水位。
  • Table Access by ROWID
先訪問索引獲取ROWID,然後使用ROWID獲取需要的業務資料。

2、Index Access Operations


  • Index Unique Scan

該索引查詢是基於constraints or unique indexes,查詢結果為唯一值,或無查詢結果。
  • Index Range Scan
該索引查詢是基於所有nonunique index,可能有多個結果返回,使用的謂詞查詢條件為(for example: BETWEEN, < or >)。
  • Index   Full Scan
索引全掃描返回排序後的資料,透過CBO判定索引全掃描的訪問方法比全表掃描後再排序更
高效,但索引全掃描不能使用多塊讀。
  • Index   Fast Full Scan
使用基於CBO時,才會出現Index fast full scan。
只有當至少一個列的索引不為空時,Oracle伺服器使用index full scan (否則無法保證所有列會被查詢出來)
  • Index fast full scan
可以使用多塊讀和並行操作,但不一定會按照順序返回資料。當索引包含所有需要查詢的列時,會使用Index fast full scan。Index fast full scans不返回ROWID,進行回表查詢,因為該操作不需要沒有意義。
  • Index skip scan
當查詢條件沒有指定前導列,並且指定非前導列時出現。Index skip scan在邏輯上將複合索引劃分為更小的子索引。邏輯索引分割槽的數量取決於前導列distinct values數量
。前導列distinct values越小效能越好,否則效能越差。例如,假設您有以下(性別、
EMPLOYEE_ID)索引資料:
(' F ',98)
(' F ',100)
(' F ',102)
(' F ',104)
(' M ',101)
(' M ',103)
(' M ',105)
該索引在邏輯上分為以下兩個字索引:
——第一個子索引F鍵值。
——第二個子索引M鍵值。
性別列是跳過以下查詢:
SQL > select *
2 from employees
3 where employee_id = 101;
不執行完整的索引掃描。相當於以下執行,
 首先執行: select * from employees  where employee_id = 101 and GENDER='F' ;
 然後執行:select * from employees  where employee_id = 101 and GENDER='M' ;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31442014/viewspace-2678261/,如需轉載,請註明出處,否則將追究法律責任。

相關文章