2011-02-02 6 views
1

저는 start와 stop으로 위치 데이터베이스를 만들려고합니다. 기본적으로 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-나무는 다음과 같이 작동합니다 :

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-Trees가 구현에 적합하지 않은 이유는 무엇입니까? 그들은 다차원 데이터를 처리 할 수 ​​있지만 1 차원 데이터에도 사용할 수 있습니다. – btilly

+0

죄송합니다. 거기서 확장해야합니다. rtree v. traditional indices의 일부 테스트를 작성했으며 rtree는 제대로 수행되지 않았습니다. 우리의 유스 케이스는 몇 가지 이유로 매우 독특합니다 : 1) 변형의 대부분 (~ 90 %)이 단일 포인트입니다. 시작과 중단이 동일합니다. 2) 테이블은 실제로 수 천만 줄에 이릅니다. 3) 위치는 부동 소수점이 아닌 정수입니다. 4) 변이체는 실제로 염색체 AND 위치에 의해 저장되므로 많은 후 처리 작업을 수행합니다. 그래서 간격 트리와 같은 다른 옵션이 있는지 살펴 보려고했습니다. –

+0

이것이 2 년 이상 된 것을 알고 있지만, float 대신 int 값을 저장하는 sqlite의 rtree_i32 R * Tree 변형을 시도한 적이 있는지 궁금합니다. – infogulch

답변

0

첫째, 당신 allthough 시작 간격만으로 색인을 생성 할 수있는 색인을 완전히 색인화 할 수 없습니다. 간격의 90 %가 시작 = 정지이면 큰 개선이 이루어져야합니다. 유일한 감속은 매우 긴 간격으로 일어날 것입니다.

+0

문제는 start = 100 및 stop = 200으로 간격을두고 150-160이 겹치는 간격을 쿼리하려는 경우에 발생합니다. 그것은 두 가지 불평등이 필요합니다. 이것은 매우 느립니다. –