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


58

(オラクルでは)発声select count(*) from any_tableとの間に違いがあることを覚えているようですselect count(any_non_null_column) from any_table

これら2つのステートメントの違いはありますか?

回答:


72
  • COUNT(*)にはNULLが含まれます
  • COUNT(column_or_expression)はしません。

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

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

ANSI-92から(「Scalar expressions 125」を探す)

場合:

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

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

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

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


4
完全を期すために、Oracleは、使用されている場合、インデックス付きの非NULL列でインデックススキャンをcount(*)使用します。
-a_horse_with_no_name

考えられる3つのオプションはCOUNT(*)COUNT(<constant>)ありCOUNT(<column name>)、3つすべての前にALLorを付けることができると考えましたDISTINCTALL省略した場合はデフォルトになります)。私はあなたが言うところにどんな表現を使うことができるのだろうか_or_expression
いつか

2
@onedaywhen COUNT(1)は、役に立たない例として、と同じCOUNT(*)です。COUNT(CASE WHEN a>b THEN 1 END)a> bの行をカウントする例として。
ypercubeᵀᴹ

16

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

要するに、使用count(*)



1

Oracle8i Certified Professional DBA認定試験ガイド(ISBN 0072130601)の書籍の78ページには、COUNT(1)が実際にCOUNT(*)よりも速く実行されると書かれています。COUNT(*)を使用する場合は、少なくとも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;

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


8
試験ガイドが間違っています。Oracleではcount(*)= count(1)(少なくともバージョン7以降)。参照してくださいasktom.oracle.com/pls/asktom/...(すでに@JackPDouglasによって参照)
リーRiffel

3
面白い。ANSI仕様に従って、COUNT(*)は列をまったくチェックしません。しばらく前にもSQL ServerのSOで尋ねられましたstackoverflow.com/questions/1221559/count-vs-count1/…–
gbn

@ gbn、@ Leigh Riffel、@ bernd_k特にOracleをしばらく使っていないので、読んでもっと学ぶようにと言ってくれてありがとう。
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.