2011-05-11 2 views
0

나는 주어진 값의 2 가까운 ID를 원하는 가능한 경우 간단한 SQLite 쿼리를 최적화하십시오!

SELECT id FROM Table WHERE value = (SELECT max(value) FROM Table WHERE value < myvalue) 
    UNION 
SELECT id FROM Table WHERE value = (SELECT min(value) FROM Table WHERE value > myvalue); 

SQLite는 3

사용하여이 쿼리를 최적화하고 싶습니다. 예 : id 20, value 50. 가장 가까운 ID는 값 48 (최대 값 열등)이고 값 4 (값 최소 값)가 상위 인 값 3 인 3 일 수 있습니다.

SQLite 3은 실제 데이터베이스의 모든 기능을 가지고 있지 않습니다. 사용하는 것이 더 좋다면, 고맙습니다!

답변

0
SELECT 
(SELECT id FROM test WHERE value < myvalue ORDER BY value DESC LIMIT 1) as below, 
(SELECT id FROM test WHERE value > myvalue ORDER BY value ASC LIMIT 1) as above; 

한다면 이론적으로는 네 개의 테이블 스캔의 intead를 사용 becase이 더 빠르게 처리 될 수 말하기. 어쨌든 나는 몇 밀론 레코드가있는 테이블을 만들고 타이머를 사용하여 다른 쿼리를 테스트합니다. (sqlite 콘솔에서 .timer ON).

또한 인덱스 값을 지정하거나 지정하지 않고 테스트하십시오. 때로는 특별히 때 색인 크기가 귀하의 메모리보다 큰 경우 색인은 쓸모가 없습니다.

교토와 같은 대체 가벼운 저장을 고려하면 속도가 진정한 문제입니다. 캐비닛.

+0

조금 더 빨리 실행되는 것 같지만 실제로 차이를 확인하기에 충분한 행이 없습니다. 감사 ! – Kikohs

0

다른 방법이 있습니다. 비록 그것이 sqlite에서 더 빠를 지 모르겠다. 언제나 시도해 볼 수 있습니다.

select id 
from table 
where value - myvalue > 0 
order by abs(value - myvalue) asc 
limit 1 
union all 
select id 
from table 
where value - myvalue < 0 
order by abs(value - myvalue) desc 
limit 1 
+0

각 개별 쿼리가 함께 있지만, 모든 작동 실패 예외 이름 [용어 BY 1 차 결과 집합의 모든 열을 일치하지 않습니다] : NS_ERROR_FAILURE – Kikohs

+0

어쩌면 내 쿼리에 두 하위 쿼리를 구분하는 괄호가 부족할 수도 있습니다. – Joel

+0

나는이 오류가 2 단계에 더 있다고 생각한다. SQLite는 그 (것)들을 좋아하지 않는 것처럼 보입니다. – Kikohs

0
SELECT id FROM Table WHERE value > myvalue ORDER BY value LIMIT 1 
SELECT id FROM Table WHERE value < myvalue ORDER BY value DESC LIMIT 1 

이 솔루션에는 하위 선택, 테이블 스캔 및 관련없는 그룹 또는 수학 기능이 없습니다. 하지만 필요 두 개의 쿼리

당신이해야 인덱스 Table.value

관련 문제