メインコンテンツへスキップ
メインコンテンツへスキップ

count

行数または NULL ではない値の数をカウントします。

ClickHouse は count に対して次の構文をサポートしています:

  • count(expr) または COUNT(DISTINCT expr)
  • count() または COUNT(*)count() 構文は ClickHouse 固有です。

引数

この関数は次を受け取ることができます:

  • パラメータなし。
  • 1 つの

返される値

  • 関数がパラメータなしで呼び出された場合、行数をカウントします。
  • が渡された場合、その式が 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 tableSELECT sum(NOT n.null) FROM table に変換されます。

COUNT(DISTINCT expr) のパフォーマンス改善

COUNT(DISTINCT expr) クエリが遅い場合は、並列化が向上するため GROUP BY 句の追加を検討してください。また、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_implementation の設定値に応じて、count(DISTINCT num)uniqExact 関数によって実行されることを示しています。