10

大きな (1,500 万行以上) テーブルにある行数を数える最良の方法を探しています。select count(*) from table;私がこの問題について見つけたいくつかの古い投稿によると、単純な方法は明らかに O(n) です。

この情報を取得するための一定時間のメカニズムはありますか、それとも単純なselect count(*)クエリに代わる優先的な方法があることに失敗していますか?

4

6 に答える 6

5

SQLite には、節がCOUNT(*)ない場合の特別な最適化があり、テーブルの B ツリー ページを調べて、実際にレコードをロードせずにエントリをカウントします。WHEREただし、この場合でも、テーブルのすべてのデータ (大きなレコードのオーバーフロー ページを除く) にアクセスする必要があるため、実行時間は O(n) のままです。

SQLite はデータベースに個別のレコード数を保存しません。これは、すべての変更が遅くなるためです。

于 2013-09-15T08:34:31.037 に答える
3

いいえ、一定時間ではありません。

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 ...クエリのパフォーマンスを把握するために使用できます。

于 2013-09-15T01:57:50.500 に答える
0

sqlite_stat1を実行した後、テーブルを使用してテーブル内の行数を取得できると思いますANALYZE table

このリストの最初の整数は、インデックスとテーブルの行数です。

この表の統計はデータとともに更新されないため、表が変更されると精度が低下します。これがどれほど役立つかは、ユースケースによって異なります。

ANALYZEと同じくらいの時間がかかる可能性がありますがCOUNT(*)、結果 (およびその他の統計) をキャッシュする作業は自動的に行われます。

于 2013-09-15T05:24:42.733 に答える