performance - 谁能解释一下oracle "hash group"是如何工作的?

标签 performance oracle

我最近遇到了一个在 Oracle 中进行大型查询的功能,其中更改一件事导致原来需要 10 分钟的查询变成了 3 个小时。

简单总结一下,我在数据库中存储了很多坐标,每个坐标都有一个概率。然后,我想将这些坐标“分箱”到 50 米的箱中(基本上将坐标四舍五入到最近的 50 米)并对概率求和。

为此,查询的一部分是“select x,y,sum(probability) from .... group by x,y”

最初,我存储了大量概率为 0.1 的点,查询运行得相当不错,每个点大约需要 10 分钟。

然后我请求更改概率的计算方式以调整分布,因此它们不是全部为 0.1,而是不同的值(例如 0.03、0.06、0.12、0.3、0.12、0.06、0.03)。运行完全相同的查询导致查询时间约为 3 小时。

全部改回 0.1 会使查询时间恢复到 10 分钟。

查看系统的查询计划和性能,问题似乎出在旨在加速 Oracle 中分组速度的“哈希组”功能上。我猜测它是为每个唯一的 x,y, 概率值创建哈希条目,然后对每个唯一的 x,y 值的概率求和。

谁能更好地解释这种行为?

其他信息

感谢各位的解答。他们让我核实发生了什么事。我当前正在运行查询,v$sql_workarea_active 中的 tempseg_size 目前为 7502561280,并且正在快速增长。

鉴于我运行的开发服务器只有 8GB 内存,看起来查询需要使用临时表。

我现在已经设法通过更改查询类型并预先计算一些信息来解决此问题。

最佳答案

哈希组(和哈希连接,以及其他操作,例如排序等)可以使用最佳(即内存中)、单遍或多遍方法。最后两种方法使用 TEMP 存储,因此速度要慢得多。

通过增加可能的项目数量,您可能会超出为此类操作保留的内存中容纳的项目数量。

尝试在查询运行时查看 v$sql_workarea_active,看看是否是这种情况。或者查看 v$sql_workarea 以获取历史信息。它还会告诉您操作需要多少内存和/或临时空间。

如果事实证明是实际问题 - 如果可能,请尝试增加 pga_aggregate_target 初始化参数。可用于最佳散列/排序操作的内存量通常约为 pga_aggregate_target 的 5%。

请参阅Performance Tuning Guide了解更多详情。

关于performance - 谁能解释一下oracle "hash group"是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/154722/

相关文章:

python - 优化匹配算法运行时

linux - 如何在 shell 脚本中运行 SQL 查询时获得类似 SQLPLUS 的输出

PHP News Feed 数据库和设计

oracle - Oracle 的备用模式中的外键?

java - JPA 条件生成器 : How to pass ArrayList to Oracle function?

oracle - SQLPlus - 数据泵(expdp 和 impdp)

sql - 如何理解前 2 行和当前行之间的行的结果?

java - 再次在字符串追加 vs concat vs +

Java 数学运算符的相对性能

performance - 1000 万个输入的合并排序