質問

Oracleでは、行の存在を照会するときに、なぜSelect 1がSelect count(*)よりも速いのですか?

役に立ちましたか?

解決

OracleはPL / SQLでIF EXISTSをサポートしていないため、EXISTSを使用するというCodeByMidnightの提案は通常、次のようなもので行われます

SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 

Oracleは、1つの行が見つかるとすぐにWHERE EXISTS句の処理を停止できることを知っているため、基準に一致する多数の行をカウントする必要はありません。もちろん、特定のキーを持つ行が存在するかどうかを確認する場合は、インデックス付けされていない列を含む条件を確認する場合や、多数の行が返される可能性がある条件を確認する場合よりも、これは問題になりません。

(注:CodeByMidnightの投稿にコメントとして投稿できればいいのですが、コメントにフォーマットされたコードを含めることはできません)。

更新:元の投稿者がコメントで明確にしたことを考えると、簡潔で決定的な答えは、 SELECT 1 または SELECT COUNT(1) SELECT COUNT(*)。コーディングのガイドラインに反して、すべての行をカウントするには、 COUNT(*)をお勧めします。 COUNT(1)の方が速いという古い神話がありました。少なくとも、過去10年間にリリースされたOracleのどのバージョンにも当てはまらず、かつては当てはまりませんでした。しかし、それは広く信じられていました。今日、 COUNT(*)ではなく COUNT(1)を実行するコードは、一般的に著者がさまざまなOracleの神話を信じる傾向があるのではないかと疑っています。 COUNT(*)を使用することをお勧めします。

他のヒント

RDBMSがサポートしているEXISTSまたは同等のものを使用すると、一致が見つかるとすぐに行の処理が停止するため、EXISTSを使用することをお勧めします。

select count(*)が適切に最適化されていなかった場合は驚かされます。列に関連する処理がないため、すべての列に読み込む必要はありません。

星はすべての列をカウントに含めるため、「1」ネイティブのデータ型です。

MySQLで" SELECT COUNT(name_of_the_primary_key)" SELECT 1と同じ速さである必要があります。 カウントするインデックス。インデックスのcount()は非常に高速でなければなりません;)

これはOracleには当てはまらないと思います。 http://justoracle.blogspot.com/2006/12/count- vs-count1.html

しかし、一部のデータベースでは、「*」がテーブルのメタデータにアクセスする必要があるためです。これにより、不要なオーバーヘッドが追加される傾向があります。ここで、1は単なるリテラルです。

他のすべてが等しい場合、" select 1 from my_table" は、" select count(*)from my_table"よりも first の結果を早く返します。 が、クエリからすべての結果を取得する場合、 count(*)の方がデータがはるかに少ないため(1行ごとに1整数ではなく1整数)、より高速になります。表内)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top