2011-09-16 7 views
1

あなたは素晴らしい一日を過ごしていることを祈っています。 問題が発生しました。効率的なOracle/PL_SQLのクエリのヘルプの作成

データベースでは、distinctの使用は効率的ではなく、タイムアウトの問題が数多く発生します。私が持っている単純なケースでそう

...

select distinct first_value(e.error_message) over (order by create_date desc) 
        from database e 

エラーメッセージが最新で注文し、それは、その種の最初の値である正確に一つの結果、私はそれを実行したときに、今ではおよそ取ります.8秒は悪いことではありませんが、問題は、このクエリに参加してより大きなものを作成し、単にエラーを取得するだけでは問題になりません。

私は次のクエリを実行するのであれば...

select first_value(e.error_message) over (order by create_date desc) 
        from database e 

このクエリを約0.4秒かかりますが、問題は与えられた最初のアイテムが欲しいです。どのようにこれを行うのですか、私はそれに特有の行番号を知らないのです。

ありがとうございました。

* EDIT

だけで、誰もが知っているロブのソリューションを使用するためには、可能な場合はDISTINCT使用しないようにしてください私の巨大なクエリは、より効率的になりました!!!!

答えて

5
select max(e.error_message) keep (dense_rank last order by create_date) 
    from database e 

編集:ここではそれが最後のエラーメッセージを選択しLAST function

のドキュメントへのリンクがありますcreate_dateでソートされたとき。

+0

はもっとうまく機能します。私はまだ使用しているか、または高密度ランクを使用していません – Kevin

+0

私はドキュメントと説明へのリンクを追加しました。 –

+0

何をしていますか? – Kevin

2

あなたは選択をラップすることができます:

SELECT * 
    FROM (
     select first_value(e.error_message) over (order by create_date desc)    from database e 
     ) 
WHERE rownum < 2; 

OR

SELECT UNIQUE 
     val 
    FROM (
     select first_value(e.error_message) over (order by create_date desc) as val 
      from database e 
     ); 
+0

ああ、私は最初のものについて考えなかった。最初のものは.2-.3秒しかかかりませんが、次のものは約0.8となります。なぜなら、私はUNIQUE関数を信じているからです。答えは素晴らしいですね、ありがとう。 – Kevin

+0

@ケビン、心配する必要はありません。 – Ollie

+2

これは良い答えですが、通常の 'order by'節を使用する方が解析関数を使う方が効率的です:' SELECT * FROM(データベースからe.error_messageを選択し、create_dateでorderを選択する)WHERE rownum = 1; '。 – Allan

関連する問題