oracle全局索引 前缀索引_Oracle 分区索引介绍和实例演示
--環境
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;
--創建演示需要用到的表空間
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
-- 創建一個lookup表
CREATE TABLE lookup (
id??????????? NUMBER(10),
description?? VARCHAR2(50)
);
--添加主鍵約束
ALTER TABLE lookup ADD (
CONSTRAINT lookup_pk PRIMARY KEY (id)
);
--插入數據
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 ) ;
--填充數據到分區表
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;
/
--未指定索引分區及存儲表空間情形下創建索引
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
--從下面的查詢可知,索引直接存放到分表表對應的表空間
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;
--指定索引分區名表空間名創建索引
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是否被使用,從下面的執行計劃中可知,索引被使用,支持分區消除
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 |
--------------------------------------------------------------------------------------------------------------------------
總結
以上是生活随笔為你收集整理的oracle全局索引 前缀索引_Oracle 分区索引介绍和实例演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曰出东南隅的下一句是什么啊?
- 下一篇: http和dubbo的区别_(转载)Du