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

I got this query for tuning from production team, I dont have access to production and other things, I have to give query to production guys to execute and they are expecting a miracle. Problem is TEST_TABLE contains 98 million records and this query is used in informatica and creating a huge cache. Is there any way query can be written in better way, just at looking at query. I know lot of things require and information is needed for tuning but this is all I got. :) Database is oracle 10 g.

4

2 に答える 2

0

Podiluskaが言うように、クエリプランを表示したり、インデックスを追加したりせずにクエリを最適化するのは少し精神的です。

ただし、冗長な「順序付け」アクションが実行されているように見えます。非常に内側のクエリには次のものがあります。

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

そして、その外部のクエリは次のとおりです。

ORDER BY P.ID DESC

クエリオプティマイザが内部の順序を無視している可能性がありますが、特に一致するインデックスがない場合は、ステートメントごとにその順序を削除できると、改善される可能性があります。

于 2012-10-31T10:12:27.487 に答える
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 に答える