私は開始位置と停止位置のデータベースを作成しようとしています。基本的に1D軸上の行です。私は効率的に任意の間隔をオーバーラップするすべての位置を照会したいです。伝統的な表では、問合せには2つの不等式が必要なため、索引付けすることはできません。また、R-Treeインデックスを使用することもできますが、多次元範囲クエリ用に設計されているようです。軸に線を保存する効率的な方法はありますか?SQLite - 軸の行のインデックスを作成するためのrtreeの代替方法はありますか?
好奇心が強い人は、データベースはゲノムの間隔を保存することです。ここでは例のテーブルです:
CREATE TABLE lines (id INTEGER PRIMARY KEY, start INTEGER, stop INTEGER);
これを行うための基本的な方法は次のとおりです。
SELECT * FROM lines WHERE start <= <end of interval> AND stop >= <start of interval>;
は再び、それは本当に遅いですし、インデックスを作成することはできません。 R-ツリーは次のように動作します:
CREATE VIRTUAL TABLE lines_index USING RTREE (id, start, stop);
SELECT * from lines_index WHERE start <= <end of interval> AND stop >= <start of interval>;
R-木は私たちの実装のために理想的ではないので、いずれかの選択肢がある場合、私は思ったんだけど...すべての
なぜR-Treesが実装に最適ではないとお考えですか?彼らは多次元データを扱うことができますが、1次元データにも使用できます。 – btilly
申し訳ありませんが、そこに展開してください。私はrtree対伝統的なインデックスのいくつかのテストを書いて、rtreeは貧弱に実行しました。私たちのユースケースは、いくつかの理由から非常にユニークです。1)ほとんどの(〜90%)バリアントはシングルポイントです。開始と停止は同じです。 2)テーブルは実際には数千万行もあります。 3)位置は浮動小数点ではなく整数です。 4)バリアントは実際に染色体ANDの位置に格納されるため、多くの事後処理が行われます。 私は、インターバルツリーのような他のオプションがあるかどうかを調べていました。 –
これは2年以上前のことですが、floatではなくintとして値を格納するsqliteのrtree_i32 R * Treeバリアントを試してみましたか? – infogulch