Select 1がSelect count(*)より速いのはなぜですか?
-
05-07-2019 - |
質問
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(*)が適切に最適化されていなかった場合は驚かされます。列に関連する処理がないため、すべての列に読み込む必要はありません。
http://www.dbasupport.com/forums /archive/index.php/t-28741.html
少なくともOracleの場合。
星はすべての列をカウントに含めるため、「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整数)、より高速になります。表内)。