0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OracleのSQL文でwhere句の 条件にrownumを入れると、パフォーマンスは下がりますか?

Posted at

OracleのSQL文でwhere句の条件にrownumを入れると、パフォーマンスに悪影響を与える可能性があります。

rownumは、Oracleで特別な意味を持つ擬似列であり、結果セットの行番号を示します。rownumは、該当する条件を満たす行のみを取得する場合に使用されます。ただし、rownumは、where句の条件で他の演算や関数と組み合わせて使用すると、パフォーマンスに悪影響を与えることがあります。

厳密に言えば、where句とrownumを組み合わせると、Oracleのクエリーの最適化が失敗する可能性があります。これは、Oracleがクエリーの実行計画を作成する際に、where句の条件を最上位の条件として評価するためです。つまり、rownumを使用して最初のn行のみを取得しようとする場合、Oracleはテーブル全体をスキャンして、rownumが指定したn行に到達するまで、結果セットを作成し続けます。

このような場合、インデックスが効果的に使用されず、クエリーにかかる時間が長くなります。特に、大きなテーブルに対してrownumを使用する場合は、パフォーマンスの問題が顕著に現れます。

したがって、where句の条件にrownumを入れる場合は、クエリーの最適化方法に注意する必要があります。代替手段として、インデックスを使用したり、一時的なテーブルにデータを抽出したりすることができます。

SQLのwhere句でrownumを使用する場合、最適な構文は、rownumを条件に含めたサブクエリを使用することです。具体的には、以下のようになります。

例:

SELECT * FROM (
  SELECT * FROM mytable WHERE <条件> ORDER BY <列名> ASC
) WHERE rownum <= <取得する行数>;

このクエリーは、mytableテーブルから条件に一致する行を抽出し、指定した列で昇順にソートした結果セットから、rownumが指定した数以下の行を取得します。

このように、rownumを条件に含めたサブクエリを使用することで、where句の条件にrownumを組み合わせる場合に起こる問題を回避できます。ただし、サブクエリーを使用した場合でも、rownumは結果セットの行番号を示すため、取得する行数が制限されてしまいます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?