7

SQLite テーブルに 100,000 行を超える行があるかどうかを確認する最速の方法は何ですか?


テスト テーブルには 26 列と 200,000,000 行があります。

SELECT COUNT(*) FROM ( SELECT * FROM table LIMIT 100001 )

0.27秒かかりました。

次の3つは12分半かかりました

SELECT COUNT(*) FROM table
SELECT COUNT(*) FROM table LIMIT 100001
SELECT CASE WHEN COUNT(Id) >= 100000 THEN 1 ELSE 0 END FROM table
4

8 に答える 8

3
select count(*) from (
 select top 100001 ID from T
) x

クエリに答えるには、インデックスをスキャンする必要があります。これにより、少なくともインデックス スキャンが最初の 100001 行に制限されます。テーブルに 100 万行ある場合、これにより作業の 90% が節約されます。

(ここでは SQL Server 構文を使用しています - 私にはできないので、自分で翻訳してください)。

ID の代わりに、インデックス付きの列を選択できます。オプティマイザ自体がそれを実行できるかどうかはわかりません。

ID 列や ID 列の値を確認するような巧妙なトリックは、通常は機能しないことに注意してください。

上記のクエリをサポートするには、型のダミー列を作成してbitインデックスを作成します。インデックスは非常にコンパクトで、スキャンが最も高速です。

于 2013-08-05T09:00:57.177 に答える
1

インデックス付きの列がない場合、最速の方法は(N = 100000の場合)だと思います

select 1 from test1 limit 1 offset 100000;

これは、N + 1 行しか取得できないためです。カウントなし、最大なし。

ここで試すことができます

于 2013-08-05T08:27:21.907 に答える
1

SELECT COUNT行がたくさんあるとき、あなたを噛むでしょう。動作しますが、sqlite で最速の方法を求めています。

使用する:

SELECT max(rowid) AS rowcount

NoLifeKing が指摘したように、これは削除がない場合にのみ正しく機能します。そうしないと、一貫性がなくなり、実際にテーブルにあるように行数が多くなります。

Sqlite が行 ID を作成する方法については、 http: //www.sqlite.org/autoinc.html を参照してください。

于 2013-08-05T08:14:40.010 に答える
1
SELECT COUNT(indexed_column) FROM TableName

ここで、インデックス付きの列部分が重要です。* をカウントするようなことはしたくありません。SQL がそのテーブルの各行に存在するインデックスを使用するように強制するために、できるだけ具体的にする必要があります。

于 2013-08-05T08:06:55.550 に答える
0
SELECT COUNT (Column) FROM TABLE

選択された列にインデックスが付けられていることを確認します。できれば INT です。

于 2013-08-05T08:06:53.500 に答える
0
SELECT CASE WHEN COUNT(indexed_column) >= 100000 THEN 1 ELSE 0 END FROM table

それでいいのではないですか?100.000 を超える場合は 1、それ以外の場合は 0 を報告します

于 2013-08-05T08:07:19.947 に答える