oracle sql Developer花时间获取所有记录

Posted

技术标签:

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

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

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

非常感谢, 阿西特

【问题讨论】:

请分享sql "如果有任何优化空间,您能建议我吗?" - 更快的网络、更快的磁盘、更快和更多的 RAM,... 【参考方案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 行。如果做很多记录,最好稍微增加数组大小..您正在为更大的有效负载交易往返次数

以上是关于oracle sql Developer花时间获取所有记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?

在 Oracle SQL Developer 连接窗口中选择表时如何避免默认获取表定义

使用 Sql Developer Oracle 的动态数据透视查询

Oracle 启动SQL Developer提示无法从套接字读取更多的数据

Oracle sql developer 日期/月份数据提取查询和语法

在 sql developer 窗口中获取结果行