2017-06-18 100 views
0

我有一個日常工作,這個工作正在做基本如何避免對源表索引重建交換分區後

  1. LOAD臨時表
  2. 交換分區與源表
  3. 重建本地索引
  4. 重建全局索引

但是,問題在於重建索引需要大量時間,這使得源表在此期間不可用 。源表是非常關鍵的表以支持實時應用程序。 由於這種情況,使用此表的Web服務會超時例外。

我有其他的方法,而不是在源表上建立這個索引嗎?

任何幫助或討論是非常讚賞。

你可以找到剪斷了日常工作的代碼,源表(TableX的)結構和臨時表 (TABLEX_TEMP)

日常工作:

`CREATE OR REPLACE PROCEDURE X.LOAD__TABLES_X IS表和索引的

BEGIN 


EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLEX_TEMP REUSE STORAGE'; 
    INSERT /*+ APPEND */ INTO TABLEX_TEMP(CUST_NO ,IDNO,SEX,NAME,SURNAME) 
    SELECT CUST_NO ,IDNO,SEX,NAME,SURNAME,PHONE 
FROM T_X WHERE MAINT !='D'; 
COMMIT; 

EXECUTE IMMEDIATE 'ALTER TABLE TABLEX EXCHANGE PARTITION DUMMY WITH TABLE TABLEX_TEMP WITHOUT VALIDATION'; 
EXECUTE IMMEDIATE 'ALTER TABLE TABLEX MODIFY PARTITION DUMMY REBUILD UNUSABLE LOCAL INDEXES'; 
EXECUTE IMMEDIATE 'ALTER INDEX PK_CUST_NO REBUILD NOCOMPRESS NOPARALLEL TABLESPACE TS_X_INDEX'; 
EXECUTE IMMEDIATE 'ALTER INDEX PK_CUST_NO_TMP REBUILD NOCOMPRESS NOPARALLEL TABLESPACE TS_X_INDEX'; 
EXECUTE IMMEDIATE 'ALTER INDEX IDX_TABLEX REBUILD NOCOMPRESS NOPARALLEL TABLESPACE TS_X_INDEX'; 
EXECUTE IMMEDIATE 'ALTER INDEX IDX_TABLEX_TMP REBUILD NOCOMPRESS NOPARALLEL TABLESPACE TS_X_INDEX'; 
EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLEX_TEMP REUSE STORAGE'; 

COMMIT; 
END LOAD_TABLES_X;` 

結構:

`

CREATE TABLE X.TABLEX_TEMP ( CUST_NO NUMBER(9), NAME VARCHAR2(54 BYTE), SURNAME VARCHAR2(100 BYTE), SEX VARCHAR(1個字節) IDNO NUMBER(11)

) 
TABLESPACE TS_X_DATAA 
RESULT_CACHE (MODE DEFAULT) 
PCTUSED 0 
PCTFREE 0 
INITRANS 1 
MAXTRANS 255 
STORAGE (
     INITIAL   8M 
     NEXT    1M 
     MINEXTENTS  1 
     MAXEXTENTS  UNLIMITED 
     PCTINCREASE  0 
     BUFFER_POOL  DEFAULT 
     FLASH_CACHE  DEFAULT 
     CELL_FLASH_CACHE DEFAULT 
     ) 
LOGGING 
COMPRESS FOR QUERY HIGH 
NOCACHE 
NOPARALLEL 
MONITORING; 


CREATE INDEX X.IDX_TABLEX_TMP ON X.TABLEX_TEMP 
(IDNO) 
NOLOGGING 
TABLESPACE TS_X_INDEX 
PCTFREE 10 
INITRANS 2 
MAXTRANS 255 
STORAGE (
     INITIAL   64K 
     NEXT    1M 
     MINEXTENTS  1 
     MAXEXTENTS  UNLIMITED 
     PCTINCREASE  0 
     BUFFER_POOL  DEFAULT 
     FLASH_CACHE  DEFAULT 
     CELL_FLASH_CACHE DEFAULT 
     ) 
NOPARALLEL; 


CREATE UNIQUE INDEX X.PK_CUST_NO_TMP ON X.TABLEX_TEMP 
(CUST_NO) 
NOLOGGING 
TABLESPACE TS_X_INDEX 
PCTFREE 10 
INITRANS 2 
MAXTRANS 255 
STORAGE (
     INITIAL   64K 
     NEXT    1M 
     MINEXTENTS  1 
     MAXEXTENTS  UNLIMITED 
     PCTINCREASE  0 
     BUFFER_POOL  DEFAULT 
     FLASH_CACHE  DEFAULT 
     CELL_FLASH_CACHE DEFAULT 
     ) 
NOPARALLEL; 


ALTER TABLE X.TABLEX_TEMP ADD (
    CONSTRAINT PK_CUST_NO_TMP 
    PRIMARY KEY 
    (CUST_NO) 
    USING INDEX X.PK_CUST_NO_TMP 
    ENABLE NOVALIDATE); 

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

CREATE TABLE X.TABLEX 
(
    CUST_NO  NUMBER(9), 
    NAME   VARCHAR2(54 BYTE), 
    SURNAME   VARCHAR2(100 BYTE), 
    SEX    VARCHAR (1 BYTE) 
    IDNO   NUMBER(11) 
) 
COMPRESS FOR QUERY HIGH 
TABLESPACE TS_X_DATA 
RESULT_CACHE (MODE DEFAULT) 
PCTUSED 0 
PCTFREE 0 
INITRANS 1 
MAXTRANS 255 
STORAGE (
     BUFFER_POOL  DEFAULT 
     FLASH_CACHE  DEFAULT 
     CELL_FLASH_CACHE DEFAULT 
     ) 
PARTITION BY RANGE (CUST_NO) 
( 
    PARTITION DUMMY VALUES LESS THAN (999999999) 
    LOGGING 
    COMPRESS FOR QUERY HIGH 
    TABLESPACE TS_X_DATA 
    PCTFREE 0 
    INITRANS 1 
    MAXTRANS 255 
    STORAGE (
      INITIAL   64K 
      NEXT    1M 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
      ) 
    ) 
NOCACHE 
NOPARALLEL 
MONITORING; 


CREATE INDEX X.IDX_TABLEX ON X.TABLEX 
(IDNO) 
NOLOGGING 
TABLESPACE TS_X_INDEX 
PCTFREE 10 
INITRANS 2 
MAXTRANS 255 
STORAGE (
     INITIAL   64K 
     NEXT    1M 
     MINEXTENTS  1 
     MAXEXTENTS  UNLIMITED 
     PCTINCREASE  0 
     BUFFER_POOL  DEFAULT 
     FLASH_CACHE  DEFAULT 
     CELL_FLASH_CACHE DEFAULT 
     ) 
NOPARALLEL; 


CREATE UNIQUE INDEX X.PK_CUST_NO ON X.TABLEX 
(CUST_NO) 
NOLOGGING 
TABLESPACE TS_X_INDEX 
PCTFREE 10 
INITRANS 2 
MAXTRANS 255 
STORAGE (
     INITIAL   64K 
     NEXT    1M 
     MINEXTENTS  1 
     MAXEXTENTS  UNLIMITED 
     PCTINCREASE  0 
     BUFFER_POOL  DEFAULT 
     FLASH_CACHE  DEFAULT 
     CELL_FLASH_CACHE DEFAULT 
     ) 
NOPARALLEL; 



ALTER TABLE X.TABLEX ADD (
    CONSTRAINT PK_CUST_NO 
    PRIMARY KEY 
    (CUST_NO) 
    USING INDEX X.PK_CUST_NO 
    ENABLE NOVALIDATE); 

`

回答

1

那麼,由於分區交換修改了大部分數據,索引必須變爲不可用。但是,您可以通過在分區交換期間更新索引來避免索引變得不可用。

在我的經驗是,最好使用一個兩步走的方法:

  • 在此之前的分區交換,你應該建立在臨時表中的同一本地索引。然後,您必須將INCLUDING INDEXES附加到ALTER TABLE命令。
  • 如果必須使用全局索引,則可以在分區交換期間通過將UPDATE GLOBAL INDEXES附加到ALTER TABLE命令來更新它們。這將確保全局索引在整個操作過程中不可用。

所以你整個語句將成爲這樣的事情:

ALTER TABLE TABLEX EXCHANGE PARTITION DUMMY WITH TABLE TABLEX_TEMP INCLUDING INDEXES WITHOUT VALIDATION UPDATE GLOBAL INDEXES; 

你可能想看看Oracle官方文檔的詳細信息:

+0

謝謝y我們的答案 –