3

透明なテーブルから最大値を選択する最も効率的でエレガントな方法は何ですか? たとえば、 T100, Messagesなどの単純なテーブルを選択してみましょう。あるアプリケーション領域内で最大メッセージ数を選択する必要があると想像してください。これは複数の方法で行うことができます。
最も明白なのは、MAX集計関数を使用することです

select MAX(msgnr)
from t100
where arbgb = '/ASU/GENERAL'

そしてもう1つはUP TO 1 ROWS節を使用しています

select msgnr
from t100
where arbgb = '/ASU/GENERAL'
and ROWNUM = 1
order by msgnr DESC

上記では、すべての SQL ステートメントがネイティブの Oracle SQL で提供されています。これは、これが必須である DBACOCKPIT でテストを行っていたためです。

組み込みのコックピット ツールは、両方の要求に対してほぼ同じ結果を示しました。

  • 両方の推定コストは 3 ですが、最初のクエリには 3 つのステップがあるのに対し、2 つ目のクエリには 2 つのステップしかありません。
  • 最初のクエリの推定 CPU コストはステップあたり21.564 ですが、2 番目のクエリの合計コストは 21.964 です。

したがって、ここでは 2 番目のバリアントの方が効率的であると結論付けることができます。
しかし、これは一般的な場合のポイントでしょうか? この結果は DB によって異なるのでしょうか、それとも経験則として扱うことができますか?

4

1 に答える 1

4

パフォーマンスの測定値は、かなり大きなパラメータ セットに応じて常に変化します。DBMS もその中の 1 つです。たとえば、インデックスを使用してMAX(...)ステートメントを効率的に判断できる DBMS もあれば、より非効率的な形式に頼らなければならない DBMS もあります。また、オプティマイザの予測を信用しないでください。実際のパフォーマンスを測定してください。オプティマイザーはさまざまな理由で間違っている可能性があります (私が見た限りでは、古い統計と破損したインデックスが最も一般的なものです)。実際コストが987.654 になります。したがって、私の推奨事項は

  • 必要なものだけを選択する (を避け、賢明SELECT *に使用する)WHERE
  • 測る、測る、測る
  • 証明されておらず、主張されているパフォーマンスの経験則のほとんどに注意してください。
于 2016-04-22T14:43:03.080 に答える