2017-06-14 97 views
0

我有一張名爲Employee的表,爲了使問題保持​​較短,我沒有在此粘貼所有列,但例如爲了讓說的遞減員工如下:如何部分更新大表中的數百萬條記錄

EMPNO  NOT NULL NUMBER(4)  
FIRST_NAME   VARCHAR2(10) 
LAST_NAME   VARCHAR2(10) 
SALARY    NUMBER(24) 
HIREDATE   DATE   
DEPT_ID    VARCHAR2(20) 
ELIGIBILITY   VARCHAR(2) 

表包含了超過500萬條記錄,我需要基於以下where子句在其上運行的更新:

update employee set ELIGIBILITY = 'N' where DEPT_ID IN 'INS, BAN, AUT'; 

現在目前的更新需要超過24小時。

我在幾個論壇的在線閱讀,在這些類型的情況下,您應該

  1. 插入到一個臨時表沒有記錄 - >我有兩個關於第一步的問題:

    a)如果我選擇插入新表,我需要知道如何執行no logging部分

    b)我是否需要編寫兩個單獨的插入:一個用於插入符合條件的記錄,另一個用於插入休息的記錄?

  2. 新表創建並行索引和約束 - >基於我已閱讀,這是平行

    CREATE INDEX {new_index} ON employee({column_name}) PARALLEL 35 NOLOGGING;

創建索引的命令 - 請指正在這裏,如果我錯了

  • 刪除舊錶
  • 重命名新標籤樂。
  • 就像我剛纔提到的,我只需要更新與條件相匹配的特定行,而不是全部。我將如何使用上述推薦的解決方案來做這件事。

    +0

    你預計有多少行會被改變?表格(GB)有多大?爲什麼更新需要24小時纔會出現問題? – miracle173

    回答

    1

    更新

    您的更新語句將無法正常工作。正確的語法是

    update employee 
        set ELIGIBILITY = 'N' 
        where DEPT_ID IN ('INS', 'BAN', 'AUT'); 
    

    插入,因爲甲骨文公司擁有的東西,被稱爲臨時表但你可能不使用臨時表,因爲在這種情況下,您的數據

    一個臨時表聽起來很奇怪在您註銷後會丟失。所以我們稱之爲輔助表

    CREATE TABLE auxtable 
    ... 
    ) 
    NOLOGGING; 
    

    將創建一個有資格進行nologging操作的表。但只有在表空間或甚至整個數據庫處於強制日誌記錄模式下。

    現在只用一個INSERT語句來插入數據 - 它必須提供相應的數據:

    INSERT /*+APPEND */ INTO AUXTABLE(
        EMPNO, 
        FIRST_NAME, 
        LAST_NAME, 
        SALARY, 
        HIREDATE, 
        DEPT_ID, 
        ELIGIBILITY) 
    SELECT 
        EMPNO, 
        FIRST_NAME, 
        LAST_NAME, 
        SALARY, 
        HIREDATE, 
        DEPT_ID, 
        DECODE(DEPT_ID, 
         'INS', 'N', 
         'BAN', 'N', 
         'AUT', 'N', 
         ELIGIBILITY 
         ) 
    FROM EMPLOYEE; 
    

    APPEND提示建議甲骨文做插入NOLOGGING模式,如果這是在桌子上啓用。

    指數

    創建了索引之後,你應該chnage指數

    ALTER INDEX {new_index} NOPARALLEL; 
    

    ,或者在源表中的索引使用值的並列分句。

    您可以使用圖形工具(如Oracle Grid Control或SQL Developer)生成提取表的sql,也可以使用expdp/impdp生成sqlfile。

    $ expdp myuser content=metadata_only tables=myuser.MYTABLE DUMPFILE='mydump.dp' 
    
    Export: Release 11.2.0.4.0 - Production on Sun Jan 01 01:00:00 2017 
    
    Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 
    Password: 
    
    Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 
    Starting "MYUSER"."SYS_EXPORT_TABLE_01": myuser/******** content=metadata_only tables=myuser.MYTABLE DUMPFILE=mydump.dp 
    Processing object type TABLE_EXPORT/TABLE/TABLE 
    Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS 
    Master table "MYUSER"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded 
    ****************************************************************************** 
    Dump file set for MYUSER.SYS_EXPORT_TABLE_01 is: 
        /mypath/mydump.dp 
    
    
    
    $ impdp myuser sqlfile=mytable.sql tables=myuser.MYTABLE DUMPFILE='mydump.dp' 
    
    Import: Release 11.2.0.4.0 - Production on Sun Jan 01 01:00:10 2017 
    
    Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 
    Password: 
    
    Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 
    Master table "MYUSER"."SYS_SQL_FILE_TABLE_01" successfully loaded/unloaded 
    Starting "MYUSER"."SYS_SQL_FILE_TABLE_01": myuser/******** sqlfile=mytable.sql tables=myuser.MYTABLE DUMPFILE=mydump.dp 
    Processing object type TABLE_EXPORT/TABLE/TABLE 
    Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS 
    Job "MYUSER"."SYS_SQL_FILE_TABLE_01" successfully completed at Sun Jan 01 01:00:15 2017 elapsed 0 00:00:05 
    
    The Sqlfile will be here: 
    /mypath/mytable.sql 
    
    +0

    這是所有真棒信息。我無法感謝你。我有兩個問題:我怎樣才能平行插入插入,提示'APPEND'是否足夠?也是我目前的索引創建聲明正確 –

    +0

    將這項工作/ * +追加並行(aux_table,12)*/ –

    +0

    @NickDiv嗨,我添加了一些筆記如何提取結構。可以有一個選擇的提示或插入的另一個提示。但我現在必須離開。稍後我會添加一些註釋。 – miracle173

    相關問題