• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            幾種索引掃描方式

            Posted on 2009-07-21 21:04 Prayer 閱讀(372) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫,SQLDB2

            1)索引唯一掃描 如果查詢時是通過unique或primary key約束來保證只返回一條數(shù)據(jù),那么優(yōu)化器就會選擇索引唯一掃描,這是訪問一條數(shù)據(jù)的最快方式。

            2)索引范圍掃描

            索引鍵非唯一,當(dāng)遇到如下條件時會使用索引范圍掃描:

            1.col=:b1

            2.col<:b1

            3.col>:b1

            3)索引降序范圍掃描

            與2)中的情況相同,只不過2)默認是安裝升序進行查找的,而這里是按降序進行查找,如:

            select line_item_id,order_id from order_items where order_id<:b1 order by order_id desc;

            4)跳躍式索引(Skip Scan Index)。當(dāng)表有一個復(fù)合索引,而在查詢中有除了索引中第一列的其他列作為條件,并且優(yōu)化器模式為CBO,這時候查詢計劃就有可能使用到SS,另外通過使用提示index_ss(CBO下)來強制使用SS。跳躍式索引使復(fù)合索引從邏輯上分為幾個小的子索引,分的條件就是復(fù)合索引列的第一個字段,可以這樣理解,Oracle將索引從邏輯上劃分為a.num_distinct個子索引,每次對一個子索引進行掃描。因此SS的索引掃描成本為a.num_distinct.而且使用SS的條件需要第一列的distinct num要足夠小

            5)index full scan和Index Fast Full Scan(全索引掃描和快速全索引掃描)

            index full scan和index fast full scan是指同樣的東西嗎?答案是no。兩者雖然從字面上看起來差不多,但是實現(xiàn)的機制完全不同。我們一起來看看兩者的區(qū)別在哪里?
            首先來看一下IFS,FFS能用在哪里:在一句sql中,如果我們想搜索的列都包含在索引里面的話,那么index full scan 和 index fast full scan 都可以被采用代替full table scan。比如以下語句:
              
              SQL> CREATE TABLE TEST AS SELECT * FROM dba_objects WHERE 0=1;
              
              SQL> CREATE INDEX ind_test_id ON TEST(object_id);
              
              SQL> INSERT INTO TEST
              SELECT  *
              FROM dba_objects
              WHERE object_id IS NOT NULL AND object_id > 10000
              ORDER BY object_id DESC;
              
              17837 rows created.
              
              SQL> analyze table test compute statistics for table for all columns for all indexes;
              
              Table analyzed.
              SQL> set autotrace trace;
              
              SQL> select object_id from test;
              
              17837 rows selected.
              
              Execution Plan
              ----------------------------------------------------------
                0   SELECT STATEMENT ptimizer=CHOOSE (Cost=68 Card=17837 Bytes=71348)
                1  0  TABLE ACCESS (FULL) OF 'TEST' (Cost=68 Card=17837 Bytes=71348)
              
              這時候Oracle會選擇全表掃描,因為 object_id 列默認是可以為null的,來修改成 not null:
              
              
              SQL>alter table test modify(object_id not null);
              
              SQL> select object_id from test;
              
              17837 rows selected.
              
              Execution Plan
              ----------------------------------------------------------
                0   SELECT STATEMENT ptimizer=CHOOSE (Cost=11 Card=17837 Bytes=71348)
                1  0  INDEX (FAST FULL SCAN) OF 'IND_TEST_ID' (NON-UNIQUE) (Cost=11 Card=17837 Bytes=71348)
              
              當(dāng)然我們也可以使用index full scan:
              
              
              SQL> select/*+ index(test ind_TEST_ID)*/ object_id from test;
              
              17837 rows selected.
              
              Execution Plan
              ----------------------------------------------------------
                0   SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=17837 Bytes=71348)
                1  0  INDEX (FULL SCAN) OF 'IND_TEST_ID' (NON-UNIQUE) (Cost=101 Card=17837 Bytes=71348)
              
              我們看到了兩者都可以在這種情況下使用,那么他們有什么區(qū)別呢?有個地方可以看出兩者的區(qū)別, 來看一下兩者的輸出結(jié)果,為了讓大家看清楚一點,我們只取10行。
              
              INDEX FAST FULL SCAN
              
              SQL> select object_id from test where rownum<11;
              
               OBJECT_ID
              ----------
                 66266
                 66267
                 66268
                 66269
                 66270
                 66271
                 66272
                 66273
                 66274
                 66275
              10 rows selected.
              
              
              INDEX FULL SCAN
              
              SQL> select/*+ index(test ind_TEST_ID)*/ object_id from test where rownum<11;
              
               OBJECT_ID
              ----------
                 10616
                 12177
                 12178
                 12179
                 12301
                 13495
                 13536
                 13539
                 13923
                 16503
              10 rows selected.
              
              可以看到兩者的結(jié)果完全不一樣,這是為什么呢?這是因為當(dāng)進行index full scan的時候oracle定位到索引的root block,然后到branch block(如果有的話),再定位到第一個leaf block, 然后根據(jù)leaf block的雙向鏈表順序讀取。它所讀取的塊都是有順序的,也是經(jīng)過排序的。
              
              而index fast full scan則不同,它是從段頭開始,讀取包含位圖塊,root block,所有的branch block, leaf block,讀取的順序完全有物理存儲位置決定,并采取多塊讀,沒次讀取db_file_multiblock_read_count個塊。

            使用這兩種索引掃描需要表的索引字段至少有一個是not null限制。

            快速全索引掃描比普通索引掃描速度快是因為快速索引掃描能夠多塊讀取,并且能并行處理。

            普通快速索引掃描可以減少排序操作。

            6)Index Join索引連接

            我們都知道表與表之間可以連接,那么索引與索引之間呢?當(dāng)然也可以。索引連接是一種索引之間的hash連接,當(dāng)查找的字段都已經(jīng)包括在索引中時,就不需要去訪問表的內(nèi)容,直接通過訪問多個索引就能得到結(jié)果。Index join只能在CBO使用的情況下進行。

            久久久这里有精品中文字幕| 国产A级毛片久久久精品毛片| 国产一区二区三区久久| 99久久精品费精品国产一区二区| 亚洲狠狠综合久久| 亚洲精品国产自在久久| 久久精品无码午夜福利理论片| 国产精品毛片久久久久久久| 久久不见久久见免费影院www日本| 日韩亚洲国产综合久久久| 99久久国产宗和精品1上映| 久久精品嫩草影院| 一本色道久久综合狠狠躁| 一本久久久久久久| 日产精品久久久久久久性色| 亚洲国产天堂久久综合| 精品永久久福利一区二区| 久久久久这里只有精品| 久久精品国产秦先生| 久久一日本道色综合久久| 久久久久亚洲精品无码网址| 久久99精品久久久久久| 亚洲人成网亚洲欧洲无码久久 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久精品天天中文字幕人妻| 亚洲精品tv久久久久久久久久| 日本三级久久网| 77777亚洲午夜久久多喷| 一本色综合网久久| 青青草原综合久久大伊人导航| 久久精品国产半推半就| 久久国产精品国产自线拍免费| 日本人妻丰满熟妇久久久久久| 色播久久人人爽人人爽人人片AV| 久久九色综合九色99伊人| 国产精品嫩草影院久久| 欧美亚洲另类久久综合| 精品久久久久久久久中文字幕| 成人久久精品一区二区三区| 国产精品久久久久久一区二区三区| 亚洲AV乱码久久精品蜜桃|