2012-01-18 10 views
0

sqliteの使用には制限があると理解していますが、このシナリオを処理できるかどうかを知りたいと思います。多くの行(3億+)のテーブルでcount(*)を使用するクエリのパフォーマンス

私のテーブルには3億以上のレコードがあり、dbは約12ギガバイトです。 sqliteのデータインポートユーティリティはすばらしく高速です。しかし、この表の文字列にインデックスを追加し、この操作を完了するために一晩中実行しました。私はこれを他のデータベースと比較していませんが、私にとってはかなり遅いようです。

インデックスが追加されたので、データの重複を探したいと思っています。だから私は "0>クエリを持っている"を実行しようとしているし、それも時間がかかるようです。私のクエリは次のようになります。

select col1, count(*) 
from table1 
group by col1 
having count(*) > 1 

私はこのクエリは、col1の上で私のインデックスを使用すると仮定しますが、スロークエリの実行は、それがない場合、私は思ってしまいますか?

おそらくSQL Serverはこのようなことをよりうまく処理できますか?

+0

あなたがチェックしようとしたが、[計画を説明](http://www.sqlite.org/ eqp.html)を使ってインデックスが使用されているかどうかを確認します。とにかく、12GIGはデータだけであり、インデックスはGIGを追加する必要があります。私は理論的な限界(http://www.sqlite.org/limits.html)は140のTERAsですが、SQLiteが他の選択肢と比較してうまく機能することはあまりにも多いかもしれないと思います。 – bpgergo

+0

実際に私は言及するのを忘れていた、ファイルは基本的にインデックスの後にサイズが倍増 - 12GBから24GBへ –

+0

私は説明を実行して、お礼を参照してください –

答えて

1

しかし、私は、この表の文字列にインデックスを追加し、それがこの 操作を完了するために、すべての夜走りました。私はこれを他のデータベースと比較していませんが、私にとってはかなり遅いようです。

私はyuoに嫌いですが、あなたのサーバーはどのように見えますか?議論はしていないが、大量のIOが必要な大量の集中的な操作であり、通常のコンピュータや遅いハードディスクのあるChehap Webサーバーは、重要なデータベース作業には適していない。私は何百ギガバイトのDBプロジェクト作業を行い、私の最小の「大規模データ」サーバは2つのSSDと8つのVelociraptorsを持っています。最大のものは3つのストレージノードを持ち、合計1000ギガバイトのSSDディスクを持っています.IOはDBサーバーが息づいているためです。

だから私は「持っ回数> 0」クエリを実行しようとしている、それがどのくらいのRAM

にも時間を取っているように見えますか?それをすべてメモリに収めることができますか、メモリが不足しているためにメモリが不足していて不良IOに陥ることはありませんか? SqlLiteはどのくらいのメモリを使用できますか? tempはどのように設定されていますか?記憶に? SQL Serverは、このタイプのチェックに多量のメモリ/ tempdb領域を使用する可能性があります。

+0

それは私が(私は8ギグを持っている)多くのことをしているように見える。それはちょうどプロセッサを消費するようです...これは奇妙です。 –

+0

完全にはありません。 1つのコアだけを使用して、遅いランゲージで大量の操作を行うことを計画しています。あなたは何を期待していますか? – TomTom

+0

クワッドコアですが、それは重要ですか? しかし、私の本当の疑問は、私は他のデータベースとのこのようなパフォーマンスの低下を見たことがありませんでした。歴史的に私がインデックスを使用したとき、データセットの大きさにかかわらず、これはちょうど何かのような右の仕事、またはsqliteはあまりにも軽量です。 –

0

PRAGMA cache_size=<number of pages>でsqliteキャッシュを増やしてください。使用されるメモリは<number of pages><size of page>です。これらの値をそれぞれ16000と32768(または約512MB)に設定することにより、この1つのプログラムのバルクロードを20分から2分に短縮することができました。 (ただし、そのシステム上のディスクがそれほど遅くない場合、これはあまり効果がなかったかもしれません)。

このような余分なメモリは、より小さい組み込みプラットフォームでは利用できないかもしれませんが、それは私がやったものと同じくらいですが、デスクトップやラップトップレベルのシステムでは、大いに役立ちます。

+0

バルクロードは十分に速かったですが、実際には –

3

SQLiteのcount()は最適化されていません - フルテーブルスキャンインデックスされています。ここにはrecommended approach to speed things upがあります。確認するために、あなたが表示されますEXPLAIN QUERY PLANを実行します。

EXPLAIN QUERY PLAN SELECT COUNT(FIELD_NAME) FROM TABLE_NAME; 

私はこのような何かを得る:

0|0|0|SCAN TABLE TABLE_NAME (~1000000 rows) 
+0

という問題が発生しているインデックス作成と重複排除のクエリです。カウント(*)> 1の場合は、一致するサブセットは、インデックスが付いています...私はそれがすべての行のためのテーブル全体をスキャンwouldntと思いますか? –

+0

私はあなたのテーブルが巨大だと知っていますが、クエリで 'EXPLAIN QUERY PLAN'を実行しましたか?私は 'INTEGER PRIMARY KEY'と' TEXT'という2つのカラム(テキストフィールド 'col1'のインデックス)を持つテストテーブル(SQLite 3.7.7)を作成しました。しかし、結果は '0 | 0 | 0 | SCAN TABLE TEST_TABLE_NAME USING COVERING INDEX data_values(〜1000000 rows)' 'であり、インデックスは**使用されていないことを示します。 – kuujinbo

関連する問題