如何从大表

时间:2017-06-14 05:03:21

标签: oracle11g updates large-data

我有一个名为Employee的表,为了保持问题简短,我没有粘贴所有列,但是例如为了说明,desc员工如下:

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)

该表包含超过5亿条记录,我需要根据以下where子句对其进行更新:

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

现在更新需要超过24小时。

我在几个论坛上在线阅读,在这种情况下你应该

  1. 插入临时表而不记录日志 - >关于第一步,我有两个问题:

    a)如果我选择插入新表

    ,我需要知道如何进行无记录部分

    b)我是否必须编写两个单独的插入:一个用于插入符合条件的记录,另一个用于插入其余记录?

  2. 在新表上并行创建索引和约束 - >根据我读过的内容,这是并行创建索引的命令

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

  3. - 如果我错了,请在此纠正我

    1. 删除旧表
    2. 重命名新表。
    3. 就像我已经提到的,我只需要更新符合条件的某些行,而不是所有行。如何使用上面推荐的解决方案来实现这一目标。

1 个答案:

答案 0 :(得分:1)

<强>更新

您的更新声明无效。正确的语法是

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

插入

临时表听起来很奇怪,因为Oracle有一些叫做临时表的东西,但是你可能不会使用临时表,因为在这种情况下你的数据会丢失登出。所以我们称之为辅助表

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提示建议Oracle在表格中启用插入NOLOGGING模式。

<强>索引

创建索引后,您应该使用索引的并行子句

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