oracle sql tuning 9--理解優化器訪問路徑

oracle_db發表於2010-03-19

訪問路徑:說是是如何從資料庫中取資料,一般說來對於表的小部分資料用到索引訪問,對於訪問表的大部分資料全表掃描更有效。

在OLTP系統中,有些SQL是小的[我理解為運算元據量不大的]那些SQL,可用索引來訪問,相反在 Decision support systems中,使用分割槽表,全表掃描相關分割槽或許更好。

需要了解以下訪問路徑:

  • Full Table Scans

  • Rowid Scans

  • Index Scans

  • Cluster Access

  • Hash Access

  • Sample Table Scans

  • How the Query Optimizer Chooses an Access Path

    Full Table Scan?

  • 這種掃描方式過慮掉那些SELECT中不需要的資料,讀取表中所有行,當執行全表掃描的時候,表中所有在高水位標記下的塊被掃描,高水位標記暗示了表使用的空間情況.或者說空間被表中資料格式化.每一行都被檢查,以發現表中資料是不是和where條件中的相符。

    當oracle執行全表掃描的時候,所有的塊被順序讀.I/O calls larger than a single block can be used to speed up the process. 參DB_FILE_MULTIBLOCK_READ_COUNT決定讀取塊的大小.使用多塊讀全表掃描將更有效。每一個塊只讀一次.

    為什麼說全表掃描在訪問大資料量的時候很有效?

    因為全表掃描使用比較大的IO呼叫,這種大的IO呼叫,比呼叫多個小的IO花費的代價要小些[原文:This is because full table scans can use larger I/O calls, and making fewer large I/O calls is cheaper than making many smaller calls]

    那麼何時使用全表掃描呢?

    1.缺少索引

    如果查詢語句中沒有使用到現在的索引,就會用全表掃描.如果說索引列上使用了索引,那麼優化器也會執行全表掃描。比如:upper(index列)

    2.訪問資料量很大時

    當優化器認為:你要取的資料,將需要訪問表中的絕大多數塊時,它就會走全表掃描。儘管如此,通過索引來訪問往往更好.

    3.足夠小的表

    當表包含的塊資料小於引數DB_FILE_MULTIBLOCK_READ_COUNT 的大小,在高水位標記以下。一次IO操作就可以把表中資料讀取,這個時候全表掃描就很有效。

    4. high degree of parallelism

    A high degree of parallelism for a table skews the optimizer toward full table scans over range scans. Examine the DEGREE column in ALL_TABLES for the table to determine the degree of parallelism.

    5.使用hint full(table 別名)強制優化器走全表掃描.

    6.並行查詢的時候

    當全表掃描的時候,響應時間可以通過並行這個特點來縮小。並行查詢一般應用於資料倉儲環境.

    Rowid Scans?

    表中第一行的ROWID指定的該行的資料檔案,塊(包含該行在塊中的位置).通過rowid來定位表中資料是最快的,因為資料庫中第一行確切的位置是指定好的。

    當使用rowid方式來訪問表的時候,ORACLE先獲取SELECT語句中那些行的ROWID,通過WHERE條件或者是索引掃描,然後定位選擇的每一行.

    index scans?

    這種方式下,一行資料被取回,通過語句中指定的索引。為了進行索引掃描,ORACLE查詢索引列上的索引,如果語句訪問的只是索引列,那就直接讀取索引

     

     

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

    相關文章