我有一个数据库基础设施,我们定期(至少每天一次)将表的全部内容从源数据库复制到大约20个目标数据库。由于正在使用的复制代码(我们必须使用常规的oracle查询,无法控制或直接访问源数据库)-这将导致源表的20个全表排序。
有没有办法在查询中对此进行优化?我正在寻找一些可以告诉oracle“我将重复对整个表进行排序”的东西?MySQL在myisamchk中有一个选项,你可以告诉它对表进行排序并保持排序顺序,但很明显,由于多种原因,这在这里是不适用的。
目前还涉及到一些中间表(从A同步到B,然后从B同步到C)。我们确实可以控制中间表,所以如果有调优选项,这也会很有用。
通常,查询几乎都是非常简单的形式:
select a, b, c, d, e, ... z from tbl1 order by a, b, c, d, e, ... z;我知道streams,但如上所述,主源表不在我们的控制范围内,因此我们无法在那里使用streams。(此外,这些源表每天都是从快照完全重建的,所以流无论如何都不会真正工作。)
发布于 2009-07-08 07:00:26
您可以研究一下multi-table INSERT特性。它应该执行一次完整扫描,并插入到多个表中。考虑(10gR2):
SQL> CREATE TABLE t1 (ID NUMBER);
Table created
SQL> CREATE TABLE t2 (ID NUMBER);
Table created
SQL> INSERT ALL
2 INTO t1 VALUES (d_id)
3 INTO t2 VALUES (d_id)
4 /* your select goes here */
5 SELECT ROWNUM d_id FROM dual d CONNECT BY LEVEL <= 5;
10 rows inserted
SQL> SELECT COUNT(*) FROM t1;
COUNT(*)
----------
5
SQL> SELECT COUNT(*) FROM t2;
COUNT(*)
----------
5您必须检查它是否在数据库链接上工作。
发布于 2009-07-07 23:50:02
对排序问题有帮助的一些事情是,在排序的列上建立索引(如果表还没有的话,还要连接这些表)。您还可以创建已排序的实体化视图,Oracle将缓存排序的结果。
发布于 2009-07-08 00:46:02
您没有确切地说明复制是如何完成的,也没有说明涉及的数据卷(或者为什么要对数据进行排序)。
如果目标是最小化对源数据库的影响,最好的方法可能是提取到一个中间文件中,然后将该文件加载到目标数据库中。可以对中间文件(如果是纯文本)进行排序,也可以将其作为导出或导入到目标数据库的一部分。
In source database :
create table export_emp_info
organization external
( type oracle_datapump
default directory DATA_PUMP_DIR
location ('emp.dmp')
) as select emp_id, emp_name, dept_id from emp order by dept_id
/
Copy file then, import in dest database:
create table import_emp_info
(EMP_ID NUMBER(12),
EMP_NAME VARCHAR2(100),
DEPT_ID NUMBER)
organization external
( type oracle_datapump
default directory DATA_PUMP_DIR
location ('emp.dmp')
)
/
insert into emp_info select * from import_emp_info;如果您不想或不能在源数据库上拥有外部表,则可以使用emp表的直接expdp (如果对源数据库目录结构的访问权限有限,则可以使用NETWORK_LINK )和QUERY进行排序。
https://stackoverflow.com/questions/1095396
复制相似问题