我有一个名为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小时。
我在几个论坛上在线阅读,在这种情况下你应该
插入临时表而不记录日志 - >关于第一步,我有两个问题:
a)如果我选择插入新表
,我需要知道如何进行无记录部分b)我是否必须编写两个单独的插入:一个用于插入符合条件的记录,另一个用于插入其余记录?
在新表上并行创建索引和约束 - >根据我读过的内容,这是并行创建索引的命令
CREATE INDEX {new_index} ON employee({column_name}) PARALLEL 35 NOLOGGING;
- 如果我错了,请在此纠正我
就像我已经提到的,我只需要更新符合条件的某些行,而不是所有行。如何使用上面推荐的解决方案来实现这一目标。
答案 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