0
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 万条记录,此查询用于 informatica 并创建巨大的缓存。有什么方法可以用更好的方式编写查询,只需查看查询。我知道调整需要很多东西和信息,但这就是我所得到的。:) 数据库是 oracle 10 g。

4

2 回答 2

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
于 2012-10-31T12:26:53.833 回答
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

查询优化器可能会忽略内部 order by,但如果您可以删除该 order by 语句,您可能会得到一些改进,尤其是在没有匹配的索引时。

于 2012-10-31T10:12:27.487 回答