1

クエリは、完全なテーブルをスキャンする、5millionレコードがあり、それは約60sです。これを最適化する方法は? 私はsqliteのメモリモードを使用しようとしましたが、データベース全体がmemroyに格納されるため、理論的にはこれが高速になります。しかし、ほとんど同じ時間です。このような テーブルスキーマ:なぜメモリモードでdonot加速sqlite

CREATE TABLE tbl0(estimateid int, seq int, field1 int NULL, field2 int NULL, field3 int NULL, field4 int NULL); 
CREATE INDEX tbl0_idx on tbl0(estimateid); 
CREATE TABLE tbl1(seq int, companyid int, field1 int NULL, field2 int NULL, field3 int NULL, field4 int NULL, field5 int NULL); 
CREATE INDEX tbl1_idx on tbl1(seq); 
CREATE TABLE tbl2(symbolid int, relatedcompanyid int, value char(64), field1 int NULL, field2 int NULL, field3 int NULL, field4 int NULL, field5 int NULL); 
CREATE INDEX tbl2_idx on tbl2(relatedcompanyid); 

と、これは、クエリで、3つのテーブルに参加必要クエリ:このクエリを加速する方法

>explain query plan select tbl0.estimateid, tbl1.seq, tbl1.companyid, tbl2.value from tbl0, tbl1, tbl2 where tbl0.seq = tbl1.seq and tbl1.companyid = tbl2.relatedcompanyid; 
0|0|1|SCAN TABLE tbl1 
0|1|2|SEARCH TABLE tbl2 USING INDEX tbl2_idx (relatedcompanyid=?) 
0|2|0|SEARCH TABLE tbl0 USING AUTOMATIC COVERING INDEX (seq=?) 

を? 1つのテーブルが完全にスキャンされることは避けられないようです。各テーブルには約500万レコードが含まれており、このクエリには非常に長い時間がかかります(数分間)。 私はdbをメモリに入れて、この#sqlite3:memory:を使用します。速度に違いはありません。 ヘルプは非常に高く評価されています。

+0

これを最適化するには、500万レコードをスキャンしないでください。 –

答えて

1

全索引スキャン:マニュアルに従ってさ(タイプインデックス)は、あなたが選択し全表スキャン、後の第二最悪の実行計画です。

フルテーブルスキャンは、データベースのリソース集約型操作であり、メモリ、CPU速度を向上させたり、テーブルをインデックス化したり、レコード数を減らしたりしない限り、舞台裏で魔法はありません。すべてをメモリに移したときには、急激なスピードアップに気づいた。

これを避け、より良いクエリを作成したり、DBとテーブル構造を最適化するようにしてください。 SQLの実行とその最適化方法の詳細については、EXPLAIN QUERY PLANQuery Planningを参照してください。

それはより多くを語るために、あなたが

+0

上記の結合クエリを高速化する方法を教えてください。 1つのテーブルが完全にスキャンされているように見えますが、どのテーブルをスキャンするのか、どうすればできますか?tbl2のレコードを減らし、sbliteを検索してtbl1とtbl0を検索します。このようにして、クエリはより速くなると思います。 – wushiqi

+0

@wushiqi、あなたのケースでは、テーブルのインデックスを適切に使用することをお勧めします。現在、値を見つけるためにテーブル全体をスキャンするだけで、データ全体を検索する必要があります。索引は、データベース検索エンジンがデータ検索のスピードアップに使用できる特別なルックアップ・テーブルです。要約すれば、テーブルジョインに使用されるカラムは通常、ルックアップ基準として頻繁に使用されるカラムだけでなく、完璧な候補です。 – Farside

+0

上記のようにインデックスを作成しました。これを最適化する方法を教えてください。各テーブルには5百万のレコードが含まれており、このクエリには300のコストがかかり、合計300,000,000のレコードが生成されます。私は非常に最適化のために憧れている。どうもありがとう!!! – wushiqi

0

あなたのデータベースをメモリにない、など、あなたのデータ、あなたのクエリの特性をDB構造を提供していない、あなたの元の質問のように、より具体的にするのは難しいです;あなたは何か間違ったことをした。私は別のインメモリ・データベース・システムに500万レコードをロードするプログラムを構築しました。フル・シーケンシャル・スキャンでは800ミリ秒以下でした。たとえSQLiteが私が使用したインメモリデータベースシステムの半分の速さであっても、それはわずか2〜2秒かかるでしょう。

別の可能性として、すべての行をフェッチした後、または他のロジックを実行して全体的な遅さを引き起こした後に、コンソールに書き込んでいる可能性があります。

関連する問題