【问题标题】:Sql query with group by takes too long使用 group by 的 Sql 查询耗时太长
【发布时间】:2021-10-26 09:42:59
【问题描述】:

我有一个非常简单的查询,但是当我使用 Max 和 group by 时加载时间太长。你能提出一个替代方案吗?我使用 Oracle 18g 来运行这个查询。 a_num_ver, id, site_id 是主键。

SELECT id
       , site_id
       , sub_id
       , max(a_num_ver) as a_num_ver
       , ae_no
       , max(aer_ver) AS aer_ver
FROM table_1
GROUP BY id
         , site_id
         , sub_id
         , ae_no

【问题讨论】:

  • (id, site_id, sub_id, ae_no)上创建索引。
  • 谢谢,这是一个好方法,但我无法创建索引,因为我只是在使用这个表。索引必须设置在我目前不允许的 oracle 表中。请提出另一种方式?。
  • 您可能没有太多选择。如果您编辑您的问题以包含存在的索引、查询计划、执行统计信息和有关表的信息(即您是否汇总了 100,000 行?100 万行?10 亿行?),我们可能会提供帮助。但是,如果您没有正确的索引并且无法创建正确的索引,那么您认为“太长”的可能只是 Oracle 需要多长时间才能产生您想要的结果。
  • 我会补充: 1. 执行alter session set statistics_level=all; 2. 运行您的查询并获取所有结果; 3. 运行此查询select * from table(dbms_xplan.display_cursor('','','allstats last')); 并显示其结果
  • 啊!数据库管理员认为有害! @GordonLinoff 说得对:您需要一个索引来支持此查询。如果创建索引不是一个选项,您的替代方法是告诉您的用户这很慢,因为您的 DBA 不合作。在大多数 Oracle 商店中,他们以前都听说过。几次。您也可以尝试在dba.stackexchange.com 上提问。请务必提及您不允许创建索引;也许有人有某种解决方法。

标签: sql oracle query-optimization


【解决方案1】:

如果 DBA 允许,请尝试使用并行提示 4 或 8。我在大约 296,292,720 行的表中尝试了类似的查询。没有提示,执行大约需要 2 分钟。使用 PARALLEL 8 可以缩短到 20 秒。

SELECT /*+ PARALLEL(8) */ 
id
       , site_id
       , sub_id
       , max(a_num_ver) as a_num_ver
       , ae_no
       , max(aer_ver) AS aer_ver
FROM table_1
GROUP BY id
         , site_id
         , sub_id
         , ae_no

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 2020-01-31
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多