2011-10-11 2 views
1
(start_date, end_date, description) (start_date, end_date, description) 테이블을 가지고 있습니다 - 주어진 기간 내에 발생하는 이벤트를 찾기 위해

SQLite에서 2 열 범위를 효율적으로 사용

SELECT * 
FROM table 
WHERE start_date < $view_end AND end_date > $view_start 

이 작업은 올바르게 작동하며 많은 데이터베이스 제품은 두 컬럼 모두에서 인덱스를 사용할 수 있습니다. 효율적으로 결과를 찾을 수 있지만 SQLite는 한 번에 하나의 범위 인덱스 만 사용할 수 있습니다 (색인 된 같음 비교를 많이 수행 할 수 있지만 더 큰 것보다 작은 것 또는 작은 것만 인덱싱 할 수 있음). 결과적으로 백만 개의 테이블에서 중간 10 개의 이벤트를보고 싶다면 하나의 인덱스 만 사용하여 그 중 절반을 제거하고 나머지는 50 만 개의 전체 테이블 스캔을 수행해야합니다.

SQLite의 제한 사항을 고려할 때 효율적인 방식으로이 쿼리를 다시 작성할 수있는 멋진 트릭이 있습니까?

답변

0

이 늘 수 빨리 당신이 두 개의 인덱스를 사용할 수 있지만, 단지 두 번째 열에서 테이블 스캔을 사용하는 것보다 훨씬 빠른 것처럼 : 레코드 만에

SELECT * 
FROM table 
WHERE start_date BETWEEN $view_start AND $view_end AND end_date > $view_start 

그것은 아래 테이블 스캔 잘라 버릴 꺼야 찾고있는 데이터 범위 사이에서 시작된 데이터 (종료일 이전에 시작한 모든 레코드가 아님)

+0

원래 쿼리에는 $ view_start 이전에 시작하는 레코드가 포함되어 있지만 쿼리에는 포함되지 않습니다. – Jeff

+0

@Jeff, 필자의 쿼리가 포스터와 다르다는 것을 잘 알고있다.'$ view_start'가'$ view_end'보다 작고'start_date'가'end_date'보다 작다는 가정에 기반하고있다. 그렇지 않다면 전적으로 합리적인 가정이라고 생각합니다. 이제 대신 OP 쿼리에 없었던'start_date = $ view_end' 레코드를 포함시킬 수 있었지만 가독성을 위해 방금 완료 했으므로 쉽게 start_date> $ view_start가되고 start_date <$ view_end가됩니다. '대신 원하는 경우 올바르게 색인을 사용합니다. – Seph

+0

이것은 더 빠르지 만,보기 시작과보기 끝 사이에/어떤/자신의 일부가있는 이벤트가 필요합니다. ( – Shish

관련 문제