【问题标题】:Real query execution time without network transfer in OracleOracle中没有网络传输的真实查询执行时间
【发布时间】:2013-12-15 13:18:16
【问题描述】:

是否可以确定 SELECT 执行时间没有跨网络数据传输?

我正在尝试优化我们在远程服务器上的查询,该服务器实际上距离我大约 1000 英里,即使获取少量数据也需要几分钟才能到达这里。

SQL Developer 告诉我执行时间,包括网络传输时间。 'set timing on'的情况相同。

我真的很困惑SELECT * FROM v$sql(area) 的结果。 即使更改已执行的查询,此结果仍然相同。 Oracle 文档中提到 ELAPSED_TIME 列,它包括解析/执行/获取时间,并且这些结果以某种方式累积。

那么问题来了:有没有什么直接的方法可以在服务器上获取查询的实际执行时间?没有网络传输时间,无论查询是否被缓存。没有平均值,没有估计。 具体执行一次查询的时间。

提前谢谢

【问题讨论】:

  • 我的意思不是来自 EXPLAIN PLAN 的计划成本
  • 连接数据库服务器(SSH),打开sqlplus并执行查询。
  • 或者,创建一个 PL/SQL 过程,将您的选择放入其中并执行该过程。您将以这种方式通过网络传输最少的数据。您甚至可以调用作业来运行该过程。
  • 尝试autotrace 使用sqlplus psoug.org/reference/autotrace.html

标签: sql oracle select oracle-sqldeveloper


【解决方案1】:

Oracle 查询执行作为生产者-消费者设计模式工作。如果网络连接“卡住” ,则 Oracle 会话进程被操作系统阻止。为了避免网络延迟的影响,您必须直接在数据库服务器上执行 SQL 查询(从 sqlplus 或通过 PL/SQL)。

建议: 忘记将时间作为优化指标 - 查看缓冲区获取和磁盘读取,这将告诉您在评估查询时必须处理多少内存页面。此指标是不变的 (独立于)当前数据库服务器负载。

如果网络往返开销很大,请尝试更改接口。通过使用集合、嵌套表或复杂类型,您可以减少网络等待。

【讨论】:

  • 谢谢,但我试图解决这个问题的实际原因更深一些。它只是对具有多个层的整个服务器端应用程序进行分析的一部分,因此我们现在正在消除导致性能问题的可能原因。
【解决方案2】:

你可以使用

SELECT COUNT(*) FROM (SELECT * FROM MY_LARGE_TABLE WHERE ...)

好吧,您仍然可以通过网络传输一个号码,但这应该可以忽略不计。

【讨论】:

  • 我认为这种方法是值得怀疑的,因为我们不知道服务器将使用什么优化,因为在这种情况下它实际上不需要访问表。它只能通过访问索引或统计信息或 Oracle 所做的任何魔术来计算。
  • 你说得对,Oracle 可能会优化查询。然后我还建议在上面建议的过程中执行查询。
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 2011-11-15
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多