2011-02-02 5 views
1

Я пытаюсь создать базу данных позиций с началом и остановкой: в основном линии на оси 1D. Я хочу эффективно запросить все позиции, которые перекрывают данный интервал. В традиционной таблице запрос потребует двух неравенств, поэтому он не может быть проиндексирован. Вы также можете использовать индекс 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-Tree будет работать следующим образом:

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-дерева не являются идеальными для нашей реализации, так что мне интересно, если есть какая-либо альтернатива ...

+3

Почему вы говорите, что R-деревья не оптимальны для вашей реализации? Хотя они могут обрабатывать многомерные данные, вы можете использовать их и для одномерных данных. – btilly

+0

Извините, должен был быть расширен. Я написал несколько тестов традиционных индексов rtree v, а rtree - плохо. Наш прецедент очень уникален по нескольким причинам: 1) Большинство (~ 90%) вариантов - это одиночные точки - запуск и остановка одинаковы. 2) Таблицы действительно большие - десятки миллионов строк. 3) Позиции являются целыми числами, а не плавают. 4) варианты фактически хранятся по положению хромосомы И, поэтому мы делаем много обработки после запроса. Итак, я искал, есть ли другие варианты, такие как дерево интервалов. –

+0

Я понимаю, что это больше двух лет, но мне было интересно, если вы пробовали вариант rtree_i32 R * Tree в sqlite, который хранит значения как int, а не float. – infogulch

ответ

0

Прежде всего, Allthough вас не может полностью проиндексировать его, вы можете индексировать только начальный интервал. Если 90% интервалов имеют start = stop, это должно значительно улучшить. Единственное замедление было бы с очень длинными интервалами.

+0

Проблема в том, что если у вас есть интервал с start = 100 и stop = 200, и вы хотите запросить интервалы, перекрывающиеся с 150-160. Для этого потребуются два неравенства, которые очень медленные –

 Смежные вопросы

  • Нет связанных вопросов^_^