SQL ServerのCOUNT(*)またはカウント(1)またはカウントで([コラム])おそらく最も一般的に使用される機能の重合です。実際には、この地域の多くの人々はである3を区別することはできません。この記事では、これらの3つの役割だけでなく、その背後にある原則との関係を説明します。
いつものように私は、多くの場合、いくつかの、いわゆる最適化(1)、パフォーマンスを向上させることができCOUNT(*)が、使用回数を使用することは推奨されません参照して、与えられた理由は、全表スキャンをもたらすでしょうCOUNT(*)です。カウントを書くためにどのように実際には違いはありません。
(1)数と実際には、式count(かどうかを評価することを意味します(*)カウント)でノーカウント数、カウントがNULLない場合はNULL、NULLです。たとえば、私たちはコード1を見て、NULLは(オプティマイザは、明示的にNULLを指定することはできませんので、指定できる変数に代入する必要があります)カウントで指定されています。
@xxのINTを宣言
XX = NULL @ SET
SELECT COUNT(@xx)[AdventureWorks2012] FROM [販売]。[SalesOrderHeader]
リスト1.Countは、NULLを指定しました
すべての行がNULLであるため、結果は、完全なカウントが0である図4に示す結果ではありません。
図1.明らかに、結果は0であります
ですから、COUNT(*)を指定するか、カウント時に(1)または図に示すように、これらの値は、NULLではないのでカウント(「何」)結果は、同じになりますか。
図2.限りカウントで指定された非NULL式として、結果は任意の違いはありませんでした
それCount列それ?
カウント値がNULLでない場合、各列は、NULLがカウントされていない場合、数(列)の場合、同じことが上記の規則に適用され、列の評価値がNULLです。従って列または列の組み合わせが空でカウントされない計算する(列)数。
それCOUNT(*)、具体的方法を実装するには?
前述の数()SQL ServerのNULL値は、特定のテーブルを見つける必要がなかった行の数のNULLでない場合であってもよい、すなわち、行がに等しい場合の値の全ての行(行は全てNULLでありますそれは)存在しません。そして、最も簡単な方法は、実行NOT NULL列1を見つけることです、カラムがインデックスを持っている場合は、インデックスが使用されている、もちろん、パフォーマンスのために、SQL Serverは、IOを減らすために最も狭いインデックスを選択します。
私たちは、[アドレス]はこのタイプのデータは、我々は図3に示した実施計画を参照してくださいModifyDateにDateTime列にインデックスを作成したすべての非クラスタ化インデックスの[人] Adventureworks2012サンプルデータベースのテーブルを、削除します。
CREATEDATEのインデックスを使用して、図3
私たちは、StateProvinceIDの列インデックス上に構築していき、列には、INT列が列の前の8バイトのDateTimeタイプが短いので、SQL ServerのStateProvinceIDインデックスを選んだに比べて、4つのバイトを占めています。図に示すように。
図4. [インデックス短くStateProvinceID
よって、COUNT(*)は、比較的長い時間と、最短の列に別のインデックスの確立を考慮した場合は、大幅にテーブルのパフォーマンスを強化します。