sql >> データベース >  >> RDS >> Sqlserver

APPROX_COUNT_DISTINCT()がSQLServerでどのように機能するか

    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と一致しています データ型。


    1. さまざまなSQLServerインスタンスのSSMSでステータスバーの色を設定する方法-SQLServer/TSQLチュートリアルパート6

    2. 初心者のためのSQLLIKE演算子

    3. postgresqlコンソールでは正常に見えるのにクエリがcsvファイルに保存されない理由

    4. sqlite:合計時間を追加する方法hh:mm:ssここで、列のデータ型はDATETIMEですか?