Oracle 10gR2 查詢資料的方法

531968912發表於2015-02-27

     在Oracle 10g有幾種查詢資料的方法,瞭解這些查詢資料的方法,有利於我們讀懂執行計劃,並透過執行計劃來最佳化我們的ORacle資料庫系統。

     查詢資料主要有一下方式:

       1,全表掃描和RowId查詢資料

       2,透過索引查詢資料

     1.1 全表掃描(Full Table Scans

        有時Oracle資料庫在評估最優執行計劃時,當去取大量資料時,就會優先考慮使用全表掃描,因為這時全表掃描是最優的。一般取出的資料佔表的資料5%--10%左右會發生表掃描,一般在OLTP系統中儘量避免表掃描。

       為了更好的使用表掃描,提高效率,在oracle 中有好幾種分割槽方法,提高表掃描的效率,讓表按具體業務邏輯來分割槽,儘量做到分割槽消除,減少表掃描的大小,提高效能。

     1.2 ROWID查詢資料(Table Access by ROWID Rowid lookup

       行ROWID是行資料在資料庫檔案,資料塊和行在塊的具體位置,所以是Oracle最快的定位方法。

       這種方法只能一次讀取一個IO,不會涉及多個IO。

     目前透過索引查詢,主要有5種索引查詢方式:

         1,索引唯一查詢(index unique scan

         2,索引範圍查詢 (index range scan

         3,索引全部掃描 (index full scan

         4,索引快速掃描  (index fast full scan

         5,索引跳躍式查詢 (index skip scan

      2.1 ,索引唯一查詢(index unique scan

           當查詢列是 如果存在UNIQUE 或PRIMARY KEY 約束(它保證了語句只存取單行)的話,Oracle經常實現唯一性掃描。此查詢方法效率很高。

      2.2 ,索引範圍查詢 (index range scan

          使用一個索引存取多行資料,在唯一索引上使用索引範圍掃描的典型情況下是在謂詞(where限制條件)中使用了範圍運算子(如>、、>=、<=、between)

      2.3, 索引全部掃描 (index full scan

        全索引掃描。對查詢出的資料進行排序,而且此時查詢出的資料都必須從索引中可以直接得到。同時order by排序的資料應該是按索引的順序來讀取的。如下:        

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)


--&gtexplain plan for select empno,ename from big_emp order by empno,ename

      2.4,索引快速掃描  (index fast full scan

          與 index full scan很類似,但是一個顯著的區別就是它不對查詢出的資料進行排序,即資料不是以排序順序被返回,在這種存取方法中,可以使用多塊讀功能,也可以使用並行讀入,以便獲得最大吞吐量與縮短執行時間,索引快速全域性掃描,不帶order by情況下常發生,如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)


--&gt explain plan for select empno,ename from big_emp

      2.5, 索引跳躍式查詢 (index skip scan

         where條件列是非索引的前導列情況下常發生。如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)


--&gtcreate index i_emp on emp(empno, ename);
select  /*+ index_ss(emp i_emp)*/  job from emp where ename='SMITH';

      

   總結:

      index full scan (索引全掃描):有排序,就是利用到了index的排序功能。原理:透過root根級----到中間級---葉級

      index fast full scan (索引快速掃描): 無排序,就可以利用多塊讀取方式,提高查詢速度,因為資料要求是無序的。即可以使用多塊查詢,取出的資料就是資料存放的順序。

      當進行index full scan的時候 oracle定位到索引的root block,然後到branch block(如果有的話),再定位到第一個leaf block, 然後根據leaf block的雙向連結串列順序讀取。它所讀取的塊都是有順序的,也是經過排序的。

     而index fast full scan則不同,它是從段頭開始,讀取包含點陣圖塊,root block,所有的branch block, leaf block,讀取的順序完全有物理儲存位置決定,並採取多塊讀,沒次讀取db_file_multiblock_read_count個

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

相關文章