count
行数またはNULL以外の値を数えます。
ClickHouseはcount
に対して以下の構文をサポートしています:
count(expr)
またはCOUNT(DISTINCT expr)
。count()
またはCOUNT(*)
。count()
構文はClickHouse固有のものです。
引数
この関数は以下を受け取れます:
- パラメータを一つも取らない。
- 一つの式。
戻り値
- 関数がパラメータなしで呼び出された場合、行数を数えます。
- 式が渡された場合、その式がNULL以外を返した回数を数えます。式がNullable型の値を返す場合でも、
count
の結果はNullable
にはなりません。式がすべての行でNULL
を返した場合、関数は0を返します。
いずれの場合も、戻り値の型はUInt64です。
詳細
ClickHouseはCOUNT(DISTINCT …)
構文をサポートします。この構文の動作は、count_distinct_implementation設定によって決まります。これは、操作を実行するために使用されるuniq*関数を定義します。デフォルトはuniqExact関数です。
SELECT count() FROM table
クエリは、デフォルトでMergeTreeのメタデータを使用して最適化されます。行レベルのセキュリティを使用する必要がある場合、optimize_trivial_count_query設定を使用して最適化を無効にします。
ただし、SELECT count(nullable_column) FROM table
クエリは、optimize_functions_to_subcolumns設定を有効にすることで最適化できます。optimize_functions_to_subcolumns = 1
の設定では、全体のカラムデータを読み込んで処理するのではなく、nullサブカラムのみを読み取ります。このクエリはSELECT count(n) FROM table
からSELECT sum(NOT n.null) FROM table
に変換されます。
COUNT(DISTINCT expr)のパフォーマンス向上
COUNT(DISTINCT expr)
クエリが遅い場合、並列化を改善するためにGROUP BY
句を追加することを検討してください。また、projectionを使用して、COUNT(DISTINCT target_col)
と一緒に使用する対象カラムにインデックスを作成することもできます。
例
例1:
SELECT count() FROM t
┌─count()─┐
│ 5 │
└─────────┘
例2:
SELECT name, value FROM system.settings WHERE name = 'count_distinct_implementation'
┌─name──────────────────────────┬─value─────┐
│ count_distinct_implementation │ uniqExact │
└───────────────────────────────┴───────────┘
SELECT count(DISTINCT num) FROM t
┌─uniqExact(num)─┐
│ 3 │
└────────────────┘
この例は、count(DISTINCT num)
がcount_distinct_implementation
設定の値に従ってuniqExact
関数によって実行されることを示しています。