代码之家  ›  专栏  ›  技术社区  ›  Nick Randell

谁能解释一下oracle“哈希组”是如何工作的?

  •  2
  • Nick Randell  · 技术社区  · 17 年前

    我最近遇到了一个在oracle中执行大型查询的功能,在这个功能中,更改一件事情会导致一个查询,过去需要10分钟,需要3小时。

    简而言之,我在数据库中存储了很多坐标,每个坐标都有一个概率。然后我想把这些坐标“装箱”到50米的箱子里(基本上把坐标四舍五入到最接近的50米处),并求出概率之和。

    为此,查询的一部分是“从……中选择x,y,和(概率)…”。。。。按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_大小目前为7502561280,并且正在快速增长。

    我已经通过改变查询类型和预先计算一些信息来解决这个问题。

    3 回复  |  直到 17 年前
        1
  •  3
  •   CaptainPicard    17 年前

    通过增加可能的项目数,您可能已经超过了为此类操作保留的内存中适合的项目数。

    在查询运行时,尝试查看v$sql\u workarea\u active,看看是否是这种情况。或者查看v$sql_工作区以获取历史信息。它还将指示操作需要多少内存和/或临时空间。

    如果是实际问题-如果可能,尝试增加pga_aggregate_target初始化参数。可用于最佳哈希/排序操作的内存量通常约为pga_aggregate_目标的5%。

    Performance Tuning Guide 更多细节。

        2
  •  3
  •   David Aldridge    17 年前

    “我猜它是为每个唯一的x,y,概率值创建散列项,然后为每个唯一的x,y值求和概率”——几乎可以肯定是这样,因为这是查询所需要的。

    explain plan for
    select x,y,sum(probability) from .... group by x,y
    /
    
    select * from table(dbms_xplan.display)
    /
    

    如果优化器能够从统计数据中正确推断出x和y组合的近似唯一数量,那么很有可能在第二个查询输出的TempSpc列中显示完成查询所需的磁盘空间(如果有)(无列=无磁盘空间要求)。

    http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_xplan.htm#i999234

    如果临时空间使用率很高,那么正如CaptP所说,可能是时候进行一些内存调整了。在执行大量排序和聚合的数据库上,通常指定比SGA目标更高的PGA目标。

        3
  •  0
  •   Andrew not the Saint    17 年前

    是你的 有没有可能设置为零?不太可能是散列GROUPBY本身导致了问题,可能是它之前或之后的问题。降低你的信用等级 优化器\u功能\u启用 到10.1.0.4并重新运行查询-您将看到,现在您将得到一个排序GROUPBY,该排序GROUPBY的性能应该总是优于哈希GROUPBY,除非您的PGA大小设置为手动,并且您的哈希工作区大小过小。