APPROX_COUNT_DISTINCT()
はSQLServer2019で導入された新しい関数の1つです。この関数は、グループ内のnull以外の一意の値のおおよその数を返します。
基本的に、これを使用して、大きなテーブルまたは結果セット内の重複しない行の数の概算を取得できます。 COUNT_BIG()
と同様に機能します およびCOUNT()
関数(DISTINCT
を使用する場合 句)、ただし、正確な数値ではなくおおよその数値を返します。
APPROX_COUNT_DISTINCT()
主にビッグデータのシナリオを対象としています。これは、100万行を超える大規模なデータセットにアクセスし、多くの異なる値を持つ1つまたは複数の列を集約するために設計されています。絶対的な精度よりも応答性が重要なシナリオを対象としています。
Microsoftは、関数の実装により、97%の確率で最大2%のエラー率が保証されると述べています。
執筆時点では、APPROX_COUNT_DISTINCT()
パブリックプレビュー機能です。これはSQLServer2019で導入され、現在もプレビューステータスになっています。
Microsoftは、プレビュー機能は実稼働での使用を目的としていないと述べていることに注意してください。
構文
構文は次のようになります:
APPROX_COUNT_DISTINCT ( expression )
式は、画像を除く任意のタイプにすることができます 、 sql_variant 、 ntext 、またはテキスト 。
例1-COUNT()とAPPROX_COUNT_DISTINCT
COUNT()
を比較する基本的な例を次に示します。 APPROX_COUNT_DISTINCT()
を使用 :
USE WideWorldImporters; SELECT COUNT(OrderLineId) 'Actual Count', COUNT(DISTINCT OrderLineId) 'Actual Distinct Count', APPROX_COUNT_DISTINCT(OrderLineId) 'Approx Distinct Count' FROM Sales.OrderLines;
結果:
+----------------+-------------------------+-------------------------+ | Actual Count | Actual Distinct Count | Approx Distinct Count | |----------------+-------------------------+-------------------------| | 231412 | 231412 | 238493 | +----------------+-------------------------+-------------------------+
この場合、実際のカウントと実際の個別のカウントは同じです(これは、 OrderLineId に重複がなかったことを意味します。 列)。
ただし、APPROX_COUNT_DISTINCT()
別の値を返しました。概算を返すだけなので、これは予想されることです。
例2–小さい数
この例では、別の列( Description )を指定します )カウントする:
SELECT COUNT(Description) 'Actual Count', COUNT(DISTINCT Description) 'Actual Distinct Count', APPROX_COUNT_DISTINCT(Description) 'Approx Distinct Count' FROM Sales.OrderLines;
結果:
+----------------+-------------------------+-------------------------+ | Actual Count | Actual Distinct Count | Approx Distinct Count | |----------------+-------------------------+-------------------------| | 231412 | 227 | 226 | +----------------+-------------------------+-------------------------+
この場合、実際のカウントと実際の個別のカウントは異なります。これは、 説明 が原因です。 列に重複する値が多数含まれています。
APPROX_COUNT_DISTINCT()
であることがわかります それでも別の値を返しましたが、かなり近いです。
前述のように、APPROX_COUNT_DISTINCT()
主に、より大きな結果セットを対象としています。ここにあるような小さな結果セットは、使用する関数に関係なくすばやく実行されます。
データ型を確認してください
APPROX_COUNT_DISTINCT()
結果をbigintとして返します 、その点では、COUNT_BIG()
に似ています COUNT()
よりも (これは intを返します )。ただし、次のことを確認しましょう:
EXEC sp_describe_first_result_set N'SELECT APPROX_COUNT_DISTINCT(OrderLineId) FROM Sales.OrderLines', null, 0;
結果(垂直出力を使用):
is_hidden | 0 column_ordinal | 1 name | NULL is_nullable | 1 system_type_id | 127 system_type_name | bigint max_length | 8 precision | 19 scale | 0 collation_name | NULL user_type_id | NULL user_type_database | NULL user_type_schema | NULL user_type_name | NULL assembly_qualified_type_name | NULL xml_collection_id | NULL xml_collection_database | NULL xml_collection_schema | NULL xml_collection_name | NULL is_xml_document | 0 is_case_sensitive | 0 is_fixed_length_clr_type | 0 source_server | NULL source_database | NULL source_schema | NULL source_table | NULL source_column | NULL is_identity_column | 0 is_part_of_unique_key | NULL is_updateable | 0 is_computed_column | 0 is_sparse_column_set | 0 ordinal_in_order_by_list | NULL order_by_is_descending | NULL order_by_list_length | NULL tds_type_id | 38 tds_length | 8 tds_collation_id | NULL tds_collation_sort_id | NULL
system_type_name bigint です 。これは、クエリが結果を bigintとして返すことを示しています。 予想どおり、データ型。 max_length および 精度 値もbigintと一致しています データ型。