2017-06-14 100 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

    相关问题