SQLServerのselectcount(*)とcount(1)の違いを教えてもらえますか?


ベストアンサー

ここにはすでにいくつかの良い答えがありますが、残念ながら、一部が間違っています。

COUNT(1)の1は単なるリテラル定数式であり、テーブルの列1とは関係ありません。 COUNT(*)と同じ答えが返され、同じ実行プランがあります。クエリは、必要なI / Oを最小限に抑えるために、最小の非クラスター化インデックスの行をカウントします。

COUNT(Col)(null可能な列の場合)は、Colを含む最小のインデックスの行をカウントすることによって検出されます。インデックスにない場合は、テーブルスキャンが必要です。 Colがクラスター化キーまたはインデックスにある場合、それは他のすべてのインデックスの一部でもあるため、クラスター化テーブルスキャンではなく、最小の非クラスター化インデックスがスキャンされます。

対象の列がNULLでない場合、COUNT (Col)はCOUNT(*)と同じであり、Colがどのインデックスにも含まれていない場合でも、最小の非クラスター化インデックスをスキャンすることで検出されます。

これらのステートメントは、のさまざまなクエリの推定実行プランに基づいています。 SQL 2014サーバーの場合、古いバージョンまたは新しいバージョンのクエリオプティマイザの動作が異なる場合があります。実行プランを読むことを学ぶことで、ここに投稿されたどの回答がより正確であるかを理解しようとするよりも、クエリの実行方法について多くのことを学ぶことができるかもしれません。

回答

パラメータCOUNT関数は、各行に対して評価される式です。 COUNT関数は、式がnull以外の値に評価される行数を返します。 (*は評価されない特別な式であり、単に行数を返します。)

式には、ALLとDISTINCTの2つの追加の修飾子があります。これらは、重複を破棄するかどうかを決定します。 ALLがデフォルトであるため、例はcount(ALL 1)と同じです。これは、重複が保持されることを意味します。

式「1」はすべての行でnull以外と評価されるため、重複を削除していない場合、COUNT(1)は常にCOUNT(*)と同じ番号を返す必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です