【问题标题】:Direct path insert via db link通过 db 链接直接插入路径
【发布时间】:2018-11-22 20:56:06
【问题描述】:

我有两个数据库,分别称为 LOCAL 和 REMOTE。我了解并已确认从 LOCAL 运行以下命令不会导致直接路径插入:

INSERT /*+ APPEND */ INTO REMOTE_TABLE@REMOTEDB
SELECT * FROM LOCAL_TABLE;

但从 REMOTE 运行以下命令会导致直接路径插入:

INSERT /*+ APPEND */ INTO REMOTE_TABLE
SELECT * FROM LOCAL_TABLE@LOCALDB;

我的问题是我需要从我的本地数据库运行该进程。所以我在远程数据库上创建了一个过程如下:

CREATE OR REPLACE PROCEDURE MY_LOAD AS
BEGIN
  INSERT /*+ APPEND */ INTO REMOTE_TABLE
  SELECT * FROM LOCAL_TABLE@LOCALDB;
END;

我从 LOCAL 数据库运行程序:

BEGIN
  MY_LOAD@REMOTEDB;
END;

但它不做直接路径插入。

任何人都可以确认是的,这不会进行直接路径插入吗?任何人都可以提供另一种方法来进行直接路径插入吗?

全局要求是将所有行或部分行从 LOCAL 数据库中的分区复制到 REMOTE 数据库中的分区。目标表处于 LOGGING 模式,因此计划是将 INSERT 直接加载到 REMOTE 数据库上的 NOLOGGING 暂存表中,然后将该表与目标分区交换。

【问题讨论】:

  • 你所说的直接加载是什么意思,你写来调用过程的查询本身就是直接加载,除了它在内部处理从(从表中选择*)到作为追加操作插入的事实。跨度>
  • @HimanshuAhuja,直接加载我的意思是:docs.oracle.com/cd/A58617_01/server.804/a58227/ch_dlins.htm 当它不执行直接加载时,它会执行“常规加载”。
  • 实际上,您可以将视图创建为 (select * from table ) 以在先前的情况下直接加载 insert 是追加模式加载。只有从选择中创建才能作为直接加载
  • 我不明白你在这篇文章中有这么多,为什么不首先从这篇文章中了解并行插入加载在你的情况下可能很方便,因为你想要直接加载,你也可以尝试 nologging删除日志

标签: sql oracle insert append dblink


【解决方案1】:

你的意思是Direct-Path INSERT,这个功能有很多限制,其中之一是

包含直接路径 INSERT 语句的事务不能或变为分布式。

它准确地描述了您的观察。您必须从到远程站点的连接启动事务,因此您将在本地表中直接路径 INSERT 通过 DB 链接获取数据。

您的远程过程调用方法不起作用,因为这会打开分布式事务。

【讨论】:

  • 谢谢,是的,我想我愚蠢地认为这是一种解决方法。您对另一种解决方法有什么建议吗?问题是代码在本地数据库上。它在本地数据库上进行直接路径插入和分区交换,然后想将数据发送到远程数据库来做同样的事情。如果我在远程数据库上有代码,则无法在本地进行直接路径插入和分区交换。我想一种方法是向远程数据库发送一条消息,让它开始计划的作业。
  • 是的,这行得通。在远程数据库上定义调度程序作业并在需要时运行它。
【解决方案2】:
CREATE OR REPLACE PROCEDURE MY_LOAD
AS
BEGIN
  INSERT /*+ APPEND */
  INTO REMOTE_TABLE
    (COLUM1,COULMN2
    )
  SELECT COLUMN1,COULMN2 FROM LOCAL_TABLE@LOCALDB;
END;
---OR---------
CREATE OR REPLACE PROCEDURE MY_LOAD
AS
TYPE T_BULK_COLLECT
IS
  TABLE OF REMOTE_TABLE%ROWTYPE;
  L_BULK T_BULK_COLLECT;
  CURSOR C1
  IS
    SELECT * FROM LOCAL_TABLE@LOCALDB;
BEGIN
  OPEN C1;
  LOOP
    FETCH C1 BULK COLLECT INTO L_BULK LIMIT 1000;
    FORALL I IN 1 .. L_BULK.COUNT
    INSERT INTO REMOTE_TABLE VALUES L_BULK;
    (I );
    EXIT
  WHEN C1%NOTFOUND;
  END LOOP;
  CLOSE C1;
END;

【讨论】:

    猜你喜欢
    • 2013-06-18
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2019-12-14
    • 2014-11-07
    相关资源
    最近更新 更多