午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    Oracle 分區(qū)索引介紹和實例演示
    來源:易賢網(wǎng) 閱讀:1127 次 日期:2014-10-14 10:57:25
    溫馨提示:易賢網(wǎng)小編為您整理了“Oracle 分區(qū)索引介紹和實例演示”,方便廣大網(wǎng)友查閱!

    分區(qū)索引(或索引分區(qū))主要是針對分區(qū)表而言的。隨著數(shù)據(jù)量的不斷增長,普通的堆表需要轉(zhuǎn)換到分區(qū)表,其索引呢,則對應(yīng)的轉(zhuǎn)換到分區(qū)索引。分區(qū)索引的好處是顯而易見的。就是簡單地把一個索引分成多個片斷,在獲取所需數(shù)據(jù)時,只需要訪問更小的索引片斷(塊)即可實現(xiàn)。同時把分區(qū)放在不同的表空間可以提高分區(qū)的可用性和可靠性。本文主要描述了分區(qū)索引的相關(guān)特性并給出演示示例。

    1、分區(qū)索引的相關(guān)概念

    a、分區(qū)索引的幾種方式:表被分區(qū)而索引未被分區(qū);表未被分區(qū),而索引被分區(qū);表和索引都被分區(qū)

    b、分區(qū)索引可以分為本地分區(qū)索引以及全局分區(qū)索引

    本地分區(qū)索引:

    本地分區(qū)索引信息的存放依賴于父表分區(qū)。也就是說對于本地索引一定是基于分區(qū)表創(chuàng)建的。

    缺省情況下,創(chuàng)建本地索引時,如未指定索引存放表空間,會自動將本地索引存放到數(shù)據(jù)所在分區(qū)定義時的表空間。

    本地索引的分區(qū)機制和表的分區(qū)機制一樣,本地索引可以是是B樹索引或位圖索引。

    本地索引是對單個分區(qū)的,每個分區(qū)索引只指向一個表分區(qū),為對等分區(qū)。

    本地索引支持分區(qū)獨立性,因此對于這些單獨的分區(qū)增加,截取,刪除,分割,脫機等處理無需同時刪除或重建。

    本地索引多應(yīng)用于數(shù)據(jù)倉庫環(huán)境中。

    全局分區(qū)索引:

    全局分區(qū)索引時分區(qū)表和全局索引的分區(qū)機制不一樣,在創(chuàng)建時必須定義分區(qū)鍵的范圍和值。

    全局分區(qū)索引在創(chuàng)建時應(yīng)指定Global關(guān)鍵字且全局分區(qū)索引只能是B樹索引。

    全局索引可以分區(qū),也可以是不分區(qū)索引,全局索引必須是前綴索引,即索引列必須包含分區(qū)鍵。

    全局索引分區(qū)中,一個分區(qū)索引能指向n個表分區(qū),同時,一個表分區(qū),也可能指向n個索引分區(qū)。

    默認情況下全局索引對于分區(qū)增加,截取,刪除,分割等都必須重建或修改時指定update global indexs。

    全局分區(qū)索引只按范圍或者散列hash分區(qū)。

    全局分區(qū)索引多應(yīng)用于oltp系統(tǒng)中。

    c、有前綴索引和無前綴索引

    本地和全局分區(qū)索引又分為兩個子類型即有前綴索引和無前綴索引。

    前綴和非前綴索引都可以支持索引分區(qū)消除,前提是查詢的條件中包含索引分區(qū)鍵。

    有前綴索引:

    有前綴索引包含了分區(qū)鍵,即分區(qū)鍵列被包含在索引中。

    有前綴索引支持本地分區(qū)索引以及全局分區(qū)索引。

    無前綴索引:

    無前綴索引即沒有把分區(qū)鍵的前導(dǎo)列作為索引的前導(dǎo)列。

    無前綴索引僅僅支持本地分區(qū)索引。

    2、本地分區(qū)索引演示

    復(fù)制代碼 代碼如下:

    --環(huán)境

    SQL> select * from v$version where rownum<2;

    BANNER

    ----------------------------------------------------------------

    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi

    SQL> create user leshami identified by xxx;

    SQL> grant dba to leshami;

    --創(chuàng)建演示需要用到的表空間

    SQL> create tablespace tbs_tmp datafile '/u02/database/SYBO2/oradata/tbs_tmp.dbf' size 10m autoextend on;

    SQL> alter user leshami default tablespace tbs_tmp;

    SQL> create tablespace tbs1 datafile '/u02/database/SYBO2/oradata/tbs1.dbf' size 10m autoextend on;

    SQL> create tablespace tbs2 datafile '/u02/database/SYBO2/oradata/tbs2.dbf' size 10m autoextend on;

    SQL> create tablespace tbs3 datafile '/u02/database/SYBO2/oradata/tbs3.dbf' size 10m autoextend on;

    SQL> create tablespace idx1 datafile '/u02/database/SYBO2/oradata/idx1.dbf' size 10m autoextend on;

    SQL> create tablespace idx2 datafile '/u02/database/SYBO2/oradata/idx2.dbf' size 10m autoextend on;

    SQL> create tablespace idx3 datafile '/u02/database/SYBO2/oradata/idx3.dbf' size 10m autoextend on;

    SQL> conn leshami/xxx

    -- 創(chuàng)建一個lookup表

    CREATE TABLE lookup (

    id NUMBER(10),

    description VARCHAR2(50)

    );

    --添加主鍵約束

    ALTER TABLE lookup ADD (

    CONSTRAINT lookup_pk PRIMARY KEY (id)

    );

    --插入數(shù)據(jù)

    INSERT INTO lookup (id, description) VALUES (1, 'ONE');

    INSERT INTO lookup (id, description) VALUES (2, 'TWO');

    INSERT INTO lookup (id, description) VALUES (3, 'THREE');

    COMMIT;

    CREATE TABLE big_table (

    id NUMBER(10),

    created_date DATE,

    lookup_id NUMBER(10),

    data VARCHAR2(50)

    )

    PARTITION BY RANGE (created_date)

    (PARTITION big_table_2012 VALUES LESS THAN (TO_DATE('01/01/2013', 'DD/MM/YYYY')) tablespace tbs1,

    PARTITION big_table_2013 VALUES LESS THAN (TO_DATE('01/01/2014', 'DD/MM/YYYY')) tablespace tbs2,

    PARTITION big_table_2014 VALUES LESS THAN (MAXVALUE)tablespace tbs3 ) ;

    --填充數(shù)據(jù)到分區(qū)表

    DECLARE

    l_lookup_id lookup.id%TYPE;

    l_create_date DATE;

    BEGIN

    FOR i IN 1 .. 10000 LOOP

    IF MOD(i, 3) = 0 THEN

    l_create_date := ADD_MONTHS(SYSDATE, -24);

    l_lookup_id := 2;

    ELSIF MOD(i, 2) = 0 THEN

    l_create_date := ADD_MONTHS(SYSDATE, -12);

    l_lookup_id := 1;

    ELSE

    l_create_date := SYSDATE;

    l_lookup_id := 3;

    END IF;

    INSERT INTO big_table (id, created_date, lookup_id, data)

    VALUES (i, l_create_date, l_lookup_id, 'This is some data for ' || i);

    END LOOP;

    COMMIT;

    END;

    /

    --未指定索引分區(qū)及存儲表空間情形下創(chuàng)建索引

    SQL> CREATE INDEX bita_created_date_i ON big_table(created_date) LOCAL;

    Index created.

    SQL> select index_name, partitioning_type, partition_count from user_part_indexes;

    INDEX_NAME PARTITI PARTITION_COUNT

    ------------------------------ ------- ---------------

    BITA_CREATED_DATE_I RANGE 3

    --Author : Leshami

    --從下面的查詢可知,索引直接存放到分表表對應(yīng)的表空間

    SQL> select partition_name, high_value, tablespace_name from user_ind_partitions;

    PARTITION_NAME HIGH_VALUE TABLESPACE_NAME

    ------------------------------ ---------------------------------------- ------------------------------

    BIG_TABLE_2014 MAXVALUE TBS3

    BIG_TABLE_2013 TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-M TBS2

    M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

    BIG_TABLE_2012 TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-M TBS1

    M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

    --刪除索引

    SQL> drop index bita_created_date_i;

    --指定索引分區(qū)名表空間名創(chuàng)建索引

    SQL> CREATE INDEX bita_created_date_i

    2 ON big_table (created_date)

    3 LOCAL (

    4 PARTITION idx_2012 TABLESPACE idx1,

    5 PARTITION idx_2013 TABLESPACE idx2,

    6 PARTITION idx_2014 TABLESPACE idx3)

    7 PARALLEL 3;

    Index created.

    SQL> select partition_name, high_value, tablespace_name from user_ind_partitions;

    PARTITION_NAME HIGH_VALUE TABLESPACE_NAME

    ------------------------------ ---------------------------------------- ------------------------------

    IDX_2014 MAXVALUE IDX3

    IDX_2013 TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-M IDX2

    M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

    IDX_2012 TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-M IDX1

    M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

    SQL> select * from big_table where rownum<2;

    ID CREATED_ LOOKUP_ID DATA

    ---------- -------- ---------- --------------------------------------------------

    1413 20120625 2 This is some data for 1413

    --查看local index是否被使用,從下面的執(zhí)行計劃中可知,索引被使用,支持分區(qū)消除

    SQL> set autot trace exp;

    SQL> select * from big_table where created_date=to_date('20120625','yyyymmdd');

    Execution Plan

    ----------------------------------------------------------

    Plan hash value: 2556877094

    --------------------------------------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

    --------------------------------------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 41 | 2 (0)| 00:00:01 | | |

    | 1 | PARTITION RANGE SINGLE | | 1 | 41 | 2 (0)| 00:00:01 | 1 | 1 |

    | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| BIG_TABLE | 1 | 41 | 2 (0)| 00:00:01 | 1 | 1 |

    |* 3 | INDEX RANGE SCAN | BITA_CREATED_DATE_I | 1 | | 1 (0)| 00:00:01 | 1 | 1 |

    --------------------------------------------------------------------------------------------------------------------------

    3、全局分區(qū)索引演示

    復(fù)制代碼 代碼如下:

    --為表添加主鍵

    SQL> ALTER TABLE big_table ADD (

    2 CONSTRAINT big_table_pk PRIMARY KEY (id)

    3 );

    Table altered.

    SQL> select index_name,index_type,tablespace_name,global_stats,partitioned

    2 from user_indexes where index_name='BIG_TABLE_PK';

    INDEX_NAME INDEX_TYPE TABLESPACE_NAME GLO PAR

    ------------------------------ --------------------------- ------------------------------ --- ---

    BIG_TABLE_PK NORMAL TBS_TMP YES NO

    SQL> set autot trace exp;

    SQL> select * from big_table where id=1412;

    Execution Plan

    ----------------------------------------------------------

    Plan hash value: 2662411593

    -------------------------------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

    -------------------------------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 62 | 2 (0)| 00:00:01 | | |

    | 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE | 1 | 62 | 2 (0)| 00:00:01 | ROWID | ROWID |

    |* 2 | INDEX UNIQUE SCAN | BIG_TABLE_PK | 1 | | 1 (0)| 00:00:01 | | |

    -------------------------------------------------------------------------------------------------------------------

    --如上,在其執(zhí)行計劃中,Pstart與Pstop都為ROWID

    --出現(xiàn)了GLOBAL INDEX ROWID,我們添加主鍵時并未指定Global,但其執(zhí)行計劃表明執(zhí)行了全局索引訪問

    --這個地方有待證實,對于分區(qū)表,非分區(qū)鍵上的主鍵或唯一索引是否一定是全局索引

    SQL> drop index bita_created_date_i;

    --下面創(chuàng)建全局索引,創(chuàng)建時需要指定分區(qū)鍵的范圍和值

    SQL> CREATE INDEX bita_created_date_i

    ON big_table (created_date)

    GLOBAL PARTITION BY RANGE (created_date)

    (

    PARTITION

    idx_1 VALUES LESS THAN (TO_DATE ('01/01/2013', 'DD/MM/YYYY'))

    TABLESPACE idx1,

    PARTITION

    idx_2 VALUES LESS THAN (TO_DATE ('01/01/2014', 'DD/MM/YYYY'))

    TABLESPACE idx2,

    PARTITION idx_3 VALUES LESS THAN (maxvalue) TABLESPACE idx3);

    SQL> select index_name, partitioning_type, partition_count,locality from user_part_indexes;

    INDEX_NAME PARTITI PARTITION_COUNT LOCALI

    ------------------------------ ------- --------------- ------

    BITA_CREATED_DATE_I_G RANGE 3 GLOBAL

    SQL> select partition_name, high_value, tablespace_name from user_ind_partitions;

    PARTITION_NAME HIGH_VALUE TABLESPACE_NAME

    ------------------------------ --------------------- ------------------------------

    IDX_1 TO_DATE(' 2013-01-01 IDX1

    IDX_2 TO_DATE(' 2014-01-01 IDX2

    IDX_3 MAXVALUE IDX3

    --下面是其執(zhí)行計劃,可以看出支持分區(qū)消除

    SQL> set autot trace exp;

    SQL> select * from big_table where created_date=to_date('20130625','yyyymmdd');

    Execution Plan

    ----------------------------------------------------------

    Plan hash value: 1378264218

    ---------------------------------------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

    ---------------------------------------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 41 | 2 (0)| 00:00:01 | | |

    | 1 | PARTITION RANGE SINGLE | | 1 | 41 | 2 (0)| 00:00:01 | 2 | 2 |

    | 2 | TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE | 1 | 41 | 2 (0)| 00:00:01 | 2 | 2 |

    |* 3 | INDEX RANGE SCAN | BITA_CREATED_DATE_I | 1 | | 1 (0)| 00:00:01 | 2 | 2 |

    ---------------------------------------------------------------------------------------------------------------------------

    --以下為范圍查詢,Pstart為1,Pstop為2,同樣支持分區(qū)消除

    SQL> select * from big_table

    2 where created_date>=to_date('20120625','yyyymmdd') and created_date<=to_date('20130625','yyyymmdd');

    Execution Plan

    ----------------------------------------------------------

    Plan hash value: 213633793

    ------------------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

    ------------------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 3334 | 133K| 14 (0)| 00:00:01 | | |

    | 1 | PARTITION RANGE ITERATOR| | 3334 | 133K| 14 (0)| 00:00:01 | 1 | 2 |

    |* 2 | TABLE ACCESS FULL | BIG_TABLE | 3334 | 133K| 14 (0)| 00:00:01 | 1 | 2 |

    ------------------------------------------------------------------------------------------------------

    更多信息請查看IT技術(shù)專欄

    更多信息請查看數(shù)據(jù)庫
    易賢網(wǎng)手機網(wǎng)站地址:Oracle 分區(qū)索引介紹和實例演示
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇剩?/div>

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)