【问题标题】:SQL*Net message from dblink wait event in Oracle来自 Oracle 中 dblink 等待事件的 SQL*Net 消息
【发布时间】:2012-06-20 19:28:34
【问题描述】:

我在 Oracle 10g 中有一个 INSERT 查询卡在“来自 dblink 的 SQL*Net 消息”事件上。它看起来像:

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

我没有看到my_table 上的任何锁,除了我正在尝试执行的 INSERT 中的锁。 link_table@other_system 上的 SELECT 查询在单独运行时可以顺利完成。我只有在尝试进行 INSERT 时才会遇到这个问题。

有人知道这里会发生什么吗?

更新 单独运行时,SELECT 在约 1.5 分钟内返回 4857 行。在我决定杀死它之前,INSERT 运行了一个多小时并显示此等待消息。

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

【问题讨论】:

  • SELECT 真的只命中一张没有谓词的表吗?还是在做连接和过滤?独立的SELECTINSERT ... SELECT 的查询计划是否相同?
  • 你抓住了我。有几个连接,但都在同一个 dblink 上。如何查看查询计划?

标签: sql oracle insert oracle10g


【解决方案1】:

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

如果是这样,该提示将与 DML 一起使用,正如 Jonathan Lewis 在 this page 上所解释的那样。

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

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

【讨论】:

  • 根据我的第二次更新,添加 driving_site 提示修复了 SELECT 上的问题。
【解决方案2】:

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

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

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

【讨论】:

  • 查看有问题的更新。它很小,应该不会花很长时间。
猜你喜欢
  • 2015-10-14
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多