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

SQL ServerのCOUNT()とCOUNT_BIG():違いは何ですか?

    SQL Serverでは、COUNT_BIG() 関数とCOUNT() 基本的に同じことを行います。グループ内で見つかったアイテムの数を返します。基本的に、これらの関数を使用して、テーブルまたは結果セットに含まれる行数を確認できます。

    多くの場合、どちらかを選択できます。ただし、これら2つの機能には違いがあり、どちらか一方を使用する必要がある場合があります。

    違いは、COUNT() 結果をintとして返します 、一方、COUNT_BIG() 結果をbigintとして返します 。

    つまり、COUNT_BIG()を使用する必要があります 結果が2,147,483,647を超えると予想される場合(つまり、クエリが2,147,483,647行を超える場合)。

    例1-COUNT()がOKの場合

    これは、両方のCOUNT()がシナリオを示す基本的な例です。 およびCOUNT_BIG() 使用可能:

    USE WideWorldImportersDW;
    SELECT 
      COUNT(*) AS 'COUNT',
      COUNT_BIG(*) AS 'COUNT_BIG' 
    FROM Fact.[Order];
    

    結果:

    +---------+-------------+
    | COUNT   | COUNT_BIG   |
    |---------+-------------|
    | 231412  | 231412      |
    +---------+-------------+
    

    Fact。[Order] に231412行あることがわかります。 テーブル。

    この場合、行数が int に格納できるほど小さいため、両方の関数で処理できます。 bigint

    ただし、結果が非​​常に大きいために int 保存できなかった場合は、COUNT_BIG()しか使用できませんでした 。

    例2– COUNT_BIG()が必要な場合

    COUNT_BIG()を使用する必要がある場所の例を次に示します。 。

    SELECT COUNT_BIG(*) AS 'Row Count' 
    FROM ReallyBigTable;
    

    結果:

    +-----------------+
    | Row Count       |
    |-----------------|
    | 9147483648      |
    +-----------------+
    

    この場合、行数が非常に多いため、 int それを処理することはできません。幸い、COUNT_BIG()を使用できます 、結果を bigintとして返すため 。

    両方の関数のデータ型を確認する

    前の例を見ると、実際にはデータ型名を確認できません。 COUNT()としか想定できません 結果をintとして返します およびCOUNT_BIG() bigintを使用します これは、Microsoftのドキュメントに記載されていることです(ただし、2番目の例は intではあり得ないことはわかっています。 intには値が大きすぎるため )。

    sp_describe_first_result_setを使用できます これらの各関数の戻りデータ型を確認するためのストアドプロシージャ。

    COUNT()のデータ型を確認してください

    EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
    

    結果(垂直出力を使用):

    is_hidden                    | 0
    column_ordinal               | 1
    name                         | NULL
    is_nullable                  | 1
    system_type_id               | 56
    system_type_name             | int
    max_length                   | 4
    precision                    | 10
    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                   | 4
    tds_collation_id             | NULL
    tds_collation_sort_id        | NULL
    

    はい、必要のない情報はたくさんありますが、 system_type_name を見ると 列を見ると、その値が int であることがわかります。 。これは、クエリが結果を intとして返したことを示しています。 、 予想通り。 max_length および 精度 値はintと一致しています データ型。

    COUNT_BIG()のデータ型を確認してください

    この例では、COUNT(*)を置き換えるだけです。 COUNT_BIG(*)を使用 :

    EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', 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 です 。これは、COUNT_BIG() クエリは結果をbigintとして返しました 、 予想通り。 max_length および 精度 値もbigintと一致しています データ型。

    ちなみに、上記を行うより簡単な方法は、ストアドプロシージャを呼び出すときに、両方の関数をクエリに結合することです。

    このように:

    EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
    

    これにより、SELECTの関数ごとに1つずつ2行が出力されます。 ステートメント。


    1. PHPとMySQLのファイルをアップロードおよびダウンロードする方法

    2. SQL列の区切り値を複数の行に分割する

    3. MariaDBの日付から1か月を引く

    4. 分割された区切り文字列を列に挿入するいくつかの方法