2017-05-22 3 views
0

私は地理空間データと座標を持つ名前をSQLiteテーブルに持っており、その場所のrtreeと名前カラムの通常のインデックスを作成しました。rtreeと通常のインデックススローを使用したSQLiteクエリ

RTREEは、このドキュメントに応じて使用されている:私は特定のエリア内のレコードを照会すると http://www.sqlite.org/rtree.html

、RTREEが使用され、それが高速で動作します:

SELECT demo_data.* FROM demo_data, demo_index 
WHERE demo_data.id=demo_index.id 
    AND minX>=-81.0 AND maxX<=-79.6 
    AND minY>=35.0 AND maxY>=36.2; 

私は名前だけのために照会すると、

SELECT demo_data.* FROM demo_data 
WHERE objname="Test" 

をしかし、私はその非常に遅い2を組み合わせると、テーブル全体のように思える:それはまた、名前、インデックスが使用されているため、高速で行きますスキャンされます:

SELECT demo_data.* FROM demo_data, demo_index 
WHERE demo_data.id=demo_index.id 
    AND objname="Test" 
    AND minX>=-81.0 AND maxX<=-79.6 
    AND minY>=35.0 AND maxY>=36.2; 

2つのインデックスを使用するこの組み合わせのクエリはなぜ遅いですか?

更新:クエリプランをEXPLAINでより多くの調査の後、それはインデックスが実際に個々の条件によって使用されていること、判明

。しかし、複合クエリの実行時間は、最初の条件のレコード数に依存します。この表demo_dataには10mioのレコードがあります。最初の条件が大量のレコードを返す場合、組み合わせは遅くなります。この場合、objname = "Test"の1000レコードがあり、組み合わせたクエリは4秒かかります。一度しか存在しないobjname = "Test12345"の組み合わせクエリは非常に速く、わずか10msです

答えて

1

複数のインデックスを含むクエリは高速化が困難で、統計情報が必要な場合もあります。

データベースは、(私はSQLiteのが実装かわからない)などでした:

  1. 保釈アウト、常に低速走査
  2. が一致する行
  3. をスキャンし、最初のインデックスを使用しません交差し、その後、すべての行

それを」再構築、

  • は両方のインデックスからIDを取得し、一致する行をスキャンし、唯一の2番目のインデックスを使用します最適化戦略を選択するための問合せオプティマイザのタスク。どちらの指標がより小さな結果をもたらすか予測できる場合は、2または3が最も良い場合があります。 ANALYZEを呼び出すときに得られた統計が必要です。

    使用EXPLAIN QUERY PLAN SELECT ...のSQLiteが行うことを決めたかを確認するには:https://sqlite.org/eqp.html

    あなたはまた、より良い計画に向けて、オプティマイザを微調整するために、ネストされたクエリを試すことができ、あなたは、クエリオプティマイザのドキュメントを読んでください:用 https://www.sqlite.org/optoverview.html

  • +0

    感謝EXPLAIN QUERY PLANについて言及する。これは、インデックスが実際に使用されていることを示しています。遅い実行の理由はデータの量です。質問を更新しました – Tom

    関連する問題