调整长时间运行的查询

时间:2012-10-31 08:50:22

标签: sql oracle informatica

SELECT a AS a,
   b AS b,
   c AS c,
   d AS d,
   e AS e,
   f AS f,
   g AS g,
   h AS h
FROM ( 
   SELECT P.*,
      ROW_NUMBER() OVER (PARTITION BY p.a, RANK_NM 
      ORDER BY P.ID DESC) RW_NUM 
   FROM ( 
      SELECT T.a,
         T.b,
         T.c,
         T.d,
         T.e,
         T.f,
         T.g,
         T.h,
         T.ID
         DENSE_RANK() over (PARTITION BY T.a 
         ORDER BY T.b, T.c, T.d
         , T.e, T.f, T.g, T.h
         DESC) RANK_NM 
      FROM TEST_TABLE T ) p) Y 
WHERE RW_NUM = 1

我从生产团队调整了这个查询,我没有生产和其他东西的访问权限,我必须向生产人员提供执行查询,他们期待奇迹。问题是TEST_TABLE包含9800万条记录,这个查询用于信息并创建一个巨大的缓存。有没有什么方法可以用更好的方式编写查询,只需查看查询。我知道很多东西需要和调整所需的信息,但这就是我得到的。 :)数据库是oracle 10 g。

2 个答案:

答案 0 :(得分:0)

正如Podiluska所说,优化查询而无法查看查询计划或添加索引有点精神错误。

但是,似乎确实存在一些冗余的“order by”操作:内部查询具有:

ORDER BY T.b, T.c, T.d
         , T.e, T.f, T.g, T.h
         DESC)

以外的查询有:

ORDER BY P.ID DESC

查询优化器可能会忽略内部顺序,但如果您可以通过语句删除该顺序,则可能会得到一些改进,尤其是在没有匹配的索引的情况下。

答案 1 :(得分:0)

除非你隐藏了其他字段,否则这个查询真正做的是

SELECT DISTINCT a, b, c, d, e, f, g, h FROM TEST_TABLE

如果有更多的领域,内部分析功能是多余的,正如内维尔指出的那样。你可以像这样重写它:

SELECT
  a, b, c, d, e, f, g, h, extra1, extra2
FROM
(
  SELECT
    a, b, c, d, e, f, g, h, extra1, extra2,
    ROW_NUMBER() OVER(PARTITION BY a, b, c, d, e, f, g, h ORDER BY ID DESC) RW_NUM
  FROM TEST_TABLE
)
WHERE RW_NUM = 1