查询调优帮助

Sre*_*ree 5 query oracle-11g-r2

编辑- drachenstern:有关此问题的更多信息以及以下查询来源,请参阅此问题:

按不同的时间范围按非唯一键对数据进行分组

有人可以为以下查询建议一些调整选项吗?为一个项目运行时速度很快,但对于所有记录,完成运行需要数小时。PA 表中的 NUM_ROWS:2,101,528

我想按不同的时间范围按非唯一键对数据进行分组

SELECT project_nbr, status, MIN(aud_timestamp) start_dt, end_dt 
FROM (
    SELECT a.project_nbr
         , status
         , aud_timestamp
         , ( SELECT MAX(p.aud_timestamp) 
             FROM pa p 
             WHERE p.project_nbr = a.project_nbr 
               AND p.status = a.status 
               AND p.aud_timestamp >= a.aud_timestamp
               AND NOT EXISTS (
                            SELECT NULL 
                            FROM pa q
                            WHERE q.project_nbr = p.project_nbr 
                              AND q.status <> p.status 
                              AND q.aud_timestamp < p.aud_timestamp 
                              AND q.aud_timestamp > a.aud_timestamp
                               )
            ) end_dt
     FROM pa a
     )
GROUP BY project_nbr, status, end_dt
Run Code Online (Sandbox Code Playgroud)

jco*_*and 7

这是导致您的查询需要数小时才能返回结果的违规代码:

           and not exists (
                        select null 
                        from pa q
                        where q.PROJect_NBR = p.project_nbr 
                          and q.status <> p.status 
                          and q.aud_timestamp < p.aud_timestamp 
                          and q.aud_timestamp > a.aud_timestamp
                           )
Run Code Online (Sandbox Code Playgroud)

您应该真正将其转换为连接,因为就目前而言,您正在为 200 万条源行中的每条记录生成一个新查找。

  • 注意:这不能保证是唯一的原因,但这是一个主要的原因。我们仍然希望看到 EXPLAIN 和您设置的任何索引。通过使用临时表和一些索引,如果您不能改变基础表来添加索引,我们可能会做更多的事情。 (2认同)