(Oracleでは)select count(*) from any_table
とselect count(any_non_null_column) from any_table
を発声することには違いがあることを覚えているようです。
もしあれば、これら2つのステートメントの違いは何ですか?
これは、違いを引き起こす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(*)と同じです。
最近のバージョンでは、count(*)とcount(any not null column)の間に実際の違いはなく、not nullが強調されています:-)偶然にブログ投稿でそのトピックをカバーしています: count(col)はcount(*)よりも優れていますか?
本 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に関係なく、同じレベルのプレイフィールドで動作します。