大きな (1,500 万行以上) テーブルにある行数を数える最良の方法を探しています。select count(*) from table;
私がこの問題について見つけたいくつかの古い投稿によると、単純な方法は明らかに O(n) です。
この情報を取得するための一定時間のメカニズムはありますか、それとも単純なselect count(*)
クエリに代わる優先的な方法があることに失敗していますか?
SQLite には、節がCOUNT(*)
ない場合の特別な最適化があり、テーブルの B ツリー ページを調べて、実際にレコードをロードせずにエントリをカウントします。WHERE
ただし、この場合でも、テーブルのすべてのデータ (大きなレコードのオーバーフロー ページを除く) にアクセスする必要があるため、実行時間は O(n) のままです。
SQLite はデータベースに個別のレコード数を保存しません。これは、すべての変更が遅くなるためです。
いいえ、一定時間ではありません。
sqlite> CREATE TABLE test ( a );
sqlite> EXPLAIN QUERY PLAN SELECT COUNT(*) FROM test;
0|0|0|SCAN TABLE test (~1000000 rows)
sqlite> EXPLAIN QUERY PLAN SELECT COUNT(1) FROM test;
0|0|0|SCAN TABLE test (~1000000 rows)
EXPLAIN QUERY PLAN SELECT ...
クエリのパフォーマンスを把握するために使用できます。
sqlite_stat1
を実行した後、テーブルを使用してテーブル内の行数を取得できると思いますANALYZE table
。
このリストの最初の整数は、インデックスとテーブルの行数です。
この表の統計はデータとともに更新されないため、表が変更されると精度が低下します。これがどれほど役立つかは、ユースケースによって異なります。
ANALYZE
と同じくらいの時間がかかる可能性がありますがCOUNT(*)
、結果 (およびその他の統計) をキャッシュする作業は自動的に行われます。