来自 Oracle 中 dblink 等待事件的 SQL*Net 消息



我在Oracle 10g中有一个插入查询,该查询卡在"来自dblink的SQL*Net消息"事件上。 它看起来像:

INSERT INTO my_table (A, B, C, ...) 
  SELECT A, B, C, ... FROM link_table@other_system;

除了我正在尝试做的插入之外,我没有看到my_table上有任何锁。link_table@other_system上的 SELECT 查询在自行运行时完成时没有任何问题。 我只有在尝试插入时才遇到此问题。

有谁知道这里会发生什么?

更新单独运行时,SELECT 在 ~1.5 分钟内返回 4857 行。 在我决定杀死它之前,插入运行了一个多小时的等待消息。

更新我发现我的方法有错误。 我使用日期范围来限制结果。 我在测试 SELECT 时使用的日期范围仅在link_table上最后一次运行 OraStats 之前,但我在测试 INSERT 时使用的日期范围是在link_table上运行的最后一次 OraStats 之后。 因此,这误导我相信插入有问题。我这样做不是很科学;我的错误。

SQL*Net message from dblink通常意味着您的本地系统正在等待网络通过网络传输数据。 对于此类查询,这是一个非常正常的等待事件。

SELECT语句返回多少行? 这代表多少数据(以 MB/GB 为单位)?

当您说它"自行完成没有任何麻烦"时,您实际上是在获取所有数据吗? 如果您使用的是TOAD或SQL Developer之类的东西,GUI通常会获取前N行并返回给您。 这可能非常快,但这并不意味着数据库已完成执行查询 - 可能需要更多时间才能完成生成查询将返回的所有行。 人们测量获取前 N 行所需的时间而不是获取最后一行所需的时间是很常见的——显然,您的 INSERT 语句在从远程表中获取所有行之前无法返回。

您是否使用/*+ driving_site(link_table) */提示使 Oracle 在远程服务器上执行联接?

如果是这样,该提示将不适用于DML,正如Jonathan Lewis在此页面上所解释的那样。

这可能是一种罕见的情况,即仅作为SELECT运行查询使用与将查询作为INSERT的一部分运行非常不同的计划。 (您肯定希望了解如何在您的环境中生成解释计划。 大多数工具都有一个按钮来执行此操作。

正如Andras Gabor在链接中建议的那样,您可能希望使用PL/SQL BULK COLLECT来提高性能。 这可能是PL/SQL比SQL工作得更快的罕见情况。

最新更新