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
句を追加することを検討してください。これにより並列化が改善されます。また、プロジェクションを使用して、COUNT(DISTINCT target_col)
で使用されるターゲットカラムにインデックスを作成することもできます。
例
例1:
例2:
この例は、count(DISTINCT num)
がcount_distinct_implementation
設定値に従ってuniqExact
関数によって実行されることを示しています。