首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何针对重复的全表排序优化oracle查询?

如何针对重复的全表排序优化oracle查询?
EN

Stack Overflow用户
提问于 2009-07-07 23:38:21
回答 5查看 1.2K关注 0票数 2

我有一个数据库基础设施,我们定期(至少每天一次)将表的全部内容从源数据库复制到大约20个目标数据库。由于正在使用的复制代码(我们必须使用常规的oracle查询,无法控制或直接访问源数据库)-这将导致源表的20个全表排序。

有没有办法在查询中对此进行优化?我正在寻找一些可以告诉oracle“我将重复对整个表进行排序”的东西?MySQL在myisamchk中有一个选项,你可以告诉它对表进行排序并保持排序顺序,但很明显,由于多种原因,这在这里是不适用的。

目前还涉及到一些中间表(从A同步到B,然后从B同步到C)。我们确实可以控制中间表,所以如果有调优选项,这也会很有用。

通常,查询几乎都是非常简单的形式:

代码语言:javascript
复制
select a, b, c, d, e, ... z from tbl1 order by a, b, c, d, e, ... z;

我知道streams,但如上所述,主源表不在我们的控制范围内,因此我们无法在那里使用streams。(此外,这些源表每天都是从快照完全重建的,所以流无论如何都不会真正工作。)

EN

回答 5

Stack Overflow用户

发布于 2009-07-08 07:00:26

您可以研究一下multi-table INSERT特性。它应该执行一次完整扫描,并插入到多个表中。考虑(10gR2):

代码语言:javascript
复制
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

您必须检查它是否在数据库链接上工作。

票数 2
EN

Stack Overflow用户

发布于 2009-07-07 23:50:02

对排序问题有帮助的一些事情是,在排序的列上建立索引(如果表还没有的话,还要连接这些表)。您还可以创建已排序的实体化视图,Oracle将缓存排序的结果。

票数 0
EN

Stack Overflow用户

发布于 2009-07-08 00:46:02

您没有确切地说明复制是如何完成的,也没有说明涉及的数据卷(或者为什么要对数据进行排序)。

如果目标是最小化对源数据库的影响,最好的方法可能是提取到一个中间文件中,然后将该文件加载到目标数据库中。可以对中间文件(如果是纯文本)进行排序,也可以将其作为导出或导入到目标数据库的一部分。

代码语言:javascript
复制
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进行排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1095396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档