【问题标题】:oracle sql Developer taking time to fetch all recordsoracle sql Developer花时间获取所有记录
【发布时间】:2020-07-08 21:23:03
【问题描述】:

我的查询在不到一秒的时间内为 Oracle SQL Developer 中的前 50 条记录提供输出。当我在查询结果中选择全部(Ctrl + A)时,需要 120 秒才能获取所有记录(165k)。如果有任何优化的余地,您能否建议我?

您能否解释一下查询是如何处理前 50 条结果记录的,然后再处理其余记录的? SQL 引擎是从数据块中还是从结果缓存中获取其余记录?

非常感谢, 阿西特

【问题讨论】:

  • 请分享sql
  • "如果有任何优化空间,您能建议我吗?" - 更快的网络、更快的磁盘、更快和更多的 RAM,...

标签: sql oracle optimization oracle-sqldeveloper oracle12c


【解决方案1】:

这里有很多因素可能是一个因素,最明显的是记录是什么。 165,000 条记录并不是一个可笑的过大问题,但每条记录有多大?请记住,这些记录必须从 DB 中读取,通过网络,然后由 SQL Developer 自己处理。

当我遇到这个问题时,您通常可以看到 sql 开发者进程在尝试在其使用的任何内部进程中获取所有这些记录时,CPU 和 RAM 会出现峰值。

【讨论】:

  • 您有两件事要等待 - 获取所有这些行所需的额外提取,并且您必须等待 GRID 初始化并填充所有数据。如您所见,它是资源密集型的...我的问题通常是,为什么您真的需要同时使用这么多行来用肉眼浏览?使用 WHERE 子句并将结果保持在数百,而不是数千或数百万
  • @thatjeffsmith 你正在向合唱团讲道。我的猜测是他们可能正在尝试导出为 CSV 或其他内容。
  • 无需将所有记录提取到网格中即可进行简单导出
  • @thatjeffsmith 没有,但我以前见过人们使用这种工作流程。
【解决方案2】:

对于一个简单的查询(类似于select * from some_table),我认为今天的每个 GUI 都会这样做 - 获取前“n”(50、100、500)行快速。它返回一个无序集并说“给你,看看你得到了什么”。

但是,如果它稍微复杂一些,例如select count(*) from some_tableselect * From some_table order by col1,那么它必须获取 所有 行,而对于大表则需要时间。

此外,随着查询的狂野(联接、聚合、诸如此类),它也使其更加复杂和耗时。

那么 - 对于 165K 行,您会考虑在多长时间内满足? Ctrl + A 确实需要时间。

【讨论】:

    【解决方案3】:

    SQL 开发人员在获取前 50 条记录后立即停止执行。但是,您可以将其增加到 200。

    在 SQL Developer 中,转到 Preferences —> Database —> Advanced —> SQL Array Fetch Size (50 和 200 之间) --> 将值更改为 200

    【讨论】:

    • 我们不会停止执行,但会通过 fetch 抓取记录,默认为一次 50 行。如果做很多记录,最好稍微增加数组大小..您正在为更大的有效负载交易往返次数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2020-01-23
    • 2021-03-25
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多