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

oracle_db發表於2010-04-07

索引掃描可以有以下一些型別:

  • Assessing I/O for Blocks, not Rows

  • Index Unique Scans

  • Index Range Scans

  • Index Range Scans Descending

  • Index Skip Scans

  • Full Scans

  • Fast Full Index Scans

  • Index Joins

  • Bitmap Indexes

    Assessing I/O for Blocks, not Rows[通過塊訪問IO,而不是行]

      oracle通過塊來操作IO,優化器決定是否使用全表掃描與訪問的塊的比例有關係,而不是與行有關係。這叫做:index clustering factor 。如果塊中只有一行,那麼訪問塊和訪問行都是一個效果[我想是速度上沒有差異]。儘管如此,表經常有多行,分佈在不同的塊中.因此,我們希望將資料集中在少數塊中,要不然它們就要佔用大量的塊。the clustering factor 是索引的一個屬性,通常反應出表中類似索引列值在資料塊中的分佈情況. clustering factor 的值如果小一般說明:個別的行是集中在少數塊中,如果值比較大則說明行分佈比較散亂,隨機。這個 clustering factor 大了不是好事哦

    Index Unique Scans[索引唯一掃描]

    這種掃描方式就返回一個rowid.如果語句中有unique或者PRIMARY KEY 約束就可以確保唯一行被訪問.當所有的唯一索引列,或者主鍵索引被指定為等值條件時,就會走索引唯一掃描

    Index Range Scans[索引範圍掃描]

  • 資料被取回,按照索引列升序的方式取回。如果資料必須要排序那麼使用order by 不要依賴索引,如果索引能夠用來滿足ORDER BY,或者說與ORDER BY有相同效果時,使用索引範圍掃描的屬性將起到避免排序的作用.

    何時使用index range scans呢?

    當優化器發現一列或者更多索引列被指定用到條件中,比如以下條件

    • col1 = :b1

    • col1 < :b1

    • col1 > :b1

    • AND combination of the preceding conditions for leading columns in the index

    • col1 like 'ASD%' wild-card searches should not be in a leading position otherwise the condition col1 like '%ASD' does not result in a range scan.

    範圍掃描避免排序,當索引列被用在order by ,group by 中時

     

     

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

    相關文章