1. ホーム
  2. sql

[解決済み】非常に大きなテーブルの正確な行数をカウントする最速の方法?

2022-04-03 14:17:46

質問

以下のような記事を目にしたことがあります。 SELECT COUNT(*) FROM TABLE_NAME は、テーブルが多くの行と多くの列を持つ場合、遅くなります。

数十億の行を含むかもしれないテーブルがあります(約15列あります)。を取得する良い方法はないでしょうか? EXACT テーブルの行数のカウントは?

以下を考慮の上、ご回答ください。

  • データベースベンダーを探しています。 独立したソリューションです。以下のようなものであればOKです。 カバーするもの MySQL , オラクル , MS SQLサーバー . しかし、もし 本当に データベースがない ベンダーに依存しないソリューション 異なるソリューションで解決する データベースベンダーごとに

  • 他の外部ツールは使えない を行うことができます。私は主に SQLベースのソリューションです。

  • データベースの設計を正規化できない これ以上 すでに3NFになっていますし、しかも 多くのコードがすでに書かれています。 を使用することができます。

解決方法は?

簡単な答えです。

  • データベースベンダーに依存しないソリューション=標準を使用する=。 COUNT(*)
  • があります。 おおよそ SQL Server のソリューションですが、COUNT(*) = アウトオブスコープを使用しないでください。

注意事項

COUNT(1) = COUNT(*) = COUNT(PrimaryKey)です。 念のため

編集する

SQL Serverの例(14億行、12カラム)

SELECT COUNT(*) FROM MyBigtable WITH (NOLOCK)
-- NOLOCK here is for me only to let me test for this answer: no more, no less

1本、5分46秒、カウント=1,401,659,700

--Note, sp_spaceused uses this DMV
SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
    object_name(object_id) = 'MyBigtable' AND (index_id < 2)

2回実行、いずれも1秒以下、カウント=1,401,659,670

2回目の方が行数が少ない=間違い。書き込みによっては同じかそれ以上になる(ここでは削除は時間外に行われる)。