2010-12-17 6 views
11

私はいつも "SELECT COUNT(1)FROM X"を使用しましたが、おそらくこれは最も効率的ではありません。何かご意見は?他のオプションには、SELECT COUNT(*)が含まれているか、自動インクリメントされていて削除されていない場合は、最後に挿入されたIDを取得している可能性があります。SQLiteのテーブルで行を数える最も効率的な方法は何ですか?

テーブルに何かがあるかどうかだけ知りたいのですが? (例えば、> 0を数える?)

+0

カウント(*)とカウント(何か他のもの)については、こちらをご覧ください(こちら)[http://stackoverflow.com/questions/4437399/is-using-count-or-select-a-good-idea/ 4439459#4439459] – Ronnis

答えて

11

最良の方法は、あなたが(SELECT COUNT(*)が遅くなる)単一の列にSELECT COUNTを実行することを確認することです - しかし、SELECT COUNTは常に物事の数(データベースを取得するための最速の方法となりますクエリを内部的に最適化します)。

以下のコメントをご覧になると、おそらくSELECT COUNT(1)が最適な理由であると思われる理由がわかります。

+0

テーブルにインデックスされている列でcount(columnName)を選択すると、さらに優れています。 – DwB

+0

SELECT COUNT(1)ではなくSELECT COUNT(ID)ですか? – tofutim

+0

ええ、dwbのように、索引付けされた列でそれを行うのが最適です。 – girasquid

0

私はあなたがこれのための特別な方法を見つけるとは思わない。しかし、プライマリキーの選択カウントを少し速くすることができます。

0

行数を取得する最も速い方法は、テーブルのメタデータがあればそれを直接取得することです。残念ながら、私はSQLiteで利用可能なこの種のデータの参照を見つけることができません。それに失敗

、テーブル

からタイプ

SELECT COUNT(非NULL定数値)の任意のクエリは、テーブル、あるいはインデックスの必要性を回避するために最適化する必要があり、スキャン。理想的には、エンジンは、内部メタデータからテーブルにあると分かっている現在の行数を単純に返します。これに失敗すると、NULL以外の列のインデックスのエントリ数(最初に見える主キーインデックス)を知る必要があります。

SELECT COUNTに列を導入すると、インデックススキャンとテーブルスキャンの少なくとも1つを実行するようにエンジンに要求すると、処理が遅くなります。

-1

sp_spaceused 'table_name'(単一引用符を除外)

これは、これは私はまだ遭遇してきた最も効率的な方法で、上記の表の行数を返します。

それはselect Count(1) from 'table_name'よりも効率的だ(単一引用符を除外)

sp_spaceusedは、任意のテーブルのために使用することができるテーブルは、(数百万行の何百もの)非常に大きい場合、それは非常に有用ですが、正しい方法行の数を返します。 'select Count(1)'は10秒以上かかることがあります。さらに、考慮する列名/キーフィールドは必要ありません。

+0

質問は、SQLiteではなくSQLiteに関するものです – dsz

1

あなたがそのテーブルから任意の行を削除したことがありませんし、あなたのテーブルには、ROWIDの最適化なしで定義されていないこと(実際に確認してください)確信している場合は、呼び出すことにより、行数を持つことができます。

select max(RowId) from table; 

またはあなたのテーブルには、

select MaxRowId - MinRowId + 1 from 
    (select max(RowId) as MaxRowId from table) JOIN 
    (select min(RowId) as MinRowId from table); 

のようなものを使用することができ、円形のキューこれは本当に速い(ミリ秒)ではありますが、sqliteのは、行IDは同じ内のすべての行の中で一意であることを言うので、あなたは注意を払う必要がある場合表。 SQLiteは行IDが常に連続した番号であることを宣言しません。

+0

ここでは、ROWID [link](http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something-あなたは本当に必要なことを知っている/) – Teolazza

0

girasquidの回答をフォローアップするには、データポイントとして、230万行のsqliteテーブルがあります。 select count(*) from tableを使用すると、行数をカウントするのに3秒以上かかりました。私もSELECT rowid FROM tableを使ってみました(rowidはデフォルトの一次索引キーだと思っていますが)。次に、データベースのフィールドの1つ(任意のフィールドですが、私は整数フィールドを選択しました。これは、過去の経験から、短いフィールドのインデックスは非常に高速になる可能性があることを知っていたからです。インデックス自体の値の)。 SELECT my_short_field FROM tableは時間を1秒未満に短縮しました。

関連する問題