web-dev-qa-db-ja.com

select count(*)とselect count(any_non_null_column)の違いは何ですか?

(Oracleでは)select count(*) from any_tableselect count(any_non_null_column) from any_tableを発声することには違いがあることを覚えているようです。

もしあれば、これら2つのステートメントの違いは何ですか?

58
Martin
  • COUNT(*)にはNULLSが含まれます
  • COUNT(column_or_expression)はできません。

これは、違いを引き起こすNULL値がないため、COUNT(any_non_null_column)COUNT(*)と同じになることを意味します。

一般に、COUNT(*)はインデックス化されていないか、SARGableである可能性があるため、任意のインデックスを使用できるため、COUNT(column_or_expression)の方が良い

ANSI-92 から(「Scalar expressions 125 ")

場合:

a)COUNT(*)が指定されている場合、結果はTのカーディナリティーになります。

b)それ以外の場合は、Tの各行に<値式>を適用してnull値を削除した結果である単一列のテーブルをTXとします。 1つ以上のnull値が削除されると、完了条件が発生します。

同じルールがSQL ServerとSybaseにも適用されます少なくとも

注:1はNULL不可の式であるため、COUNT(1)はCOUNT(*)と同じです。

72
gbn

Oracleの最近の(つまり 8.x + )バージョンでは、それらは 同じことを行う です。つまり、唯一の違いはセマンティックです。

_select count(*) from any_table
_

読みやすく、あなたがやろうとしていることが明白である、そして

_select count(any_non_null_column) from any_table
_

読みにくいので

  1. それは長いです
  2. 認識されにくい
  3. _any_non_null_column_が本当に_not null_として強制されているかどうかを考える必要があります

つまり、use count(*)

最近のバージョンでは、count(*)とcount(any not null column)の間に実際の違いはなく、not nullが強調されています:-)偶然にブログ投稿でそのトピックをカバーしています: count(col)はcount(*)よりも優れていますか?

9
Uwe Hesse

Oracle8i Certified Professional DBA Certification Exam Guide(ISBN 0072130601) の78ページに、COUNT(1)は実際にCOUNT(*)COUNT(*)を使用すると、すべての列のnull可能性(または少なくともnull可能でない最初の列)のデータディクショナリをチェックするために特定のメカニズムが呼び出されるため。 COUNT(1)はこれらのメカニズムをバイパスします。

MySQLは 'tblname;のSELECT COUNT(1)'をだますMyISAMテーブルでは、テーブルカウントのテーブルヘッダーを読み取ります。 InnoDBは毎回カウントします。

データベースにとらわれない方法でCOUNT(1)がCOUNT(*)よりも速く実行されるかどうかをテストするには、次のコマンドを実行して、実行時間を自分で判断します。

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

これにより、COUNT関数は、ストレージエンジンまたはRDBMSに関係なく、同じレベルのプレイフィールドで動作します。

1
RolandoMySQLDBA