2012-08-23 4 views
1

수백만 개의 데이터가있는 SQLite 테이블이 있습니다. 약 1 초마다 행이 삽입됩니다.SQLite에서 범위 쿼리하기

행에는 만든 날짜에 대한 열이 있습니다.이 날짜는 Epoch 이후로 밀리 초로 변환되고 숫자로 저장됩니다 (예 : 1343224574667). 각 행에도 컨테이너 ID에 대한 열이 있습니다. 이는 단지 문자열 필드입니다.

특정 컨테이너 ID에 대해 특정 시간 범위 내에서 만들어진 항목을 가져 오기 위해 쿼리를 실행하려고합니다. 그래서 쿼리는

Select * from Item where Created > [number] and Created < [number] and ContainerId=[string] 

예쁜 기본 쿼리처럼 보일 것입니다.

테이블에 색인이 몇 개 있습니다. [Created]에는 하나가 있고 [Created, ContainerId]에는 하나가 있습니다. 작은 시간 범위에서이 쿼리를 실행하면 수백 밀리 초와 같이 쿼리가 매우 빠릅니다. 그러나 시간 범위가 1 주 이상으로 확장되도록이 쿼리를 확장하면이 쿼리는 평균 75 초가 넘는 잔인한 속도입니다. 이 속도를 높이는 방법이 있습니까? 이것은 결과를 기다리는 미친 긴 시간처럼 보입니다. 하지만 나는 DBA가 아니므로 어쩌면 내가 뭔가 잘못하고있는 것일 수 있습니다.

감사합니다.

+0

범위가 넓을수록 별개의 ContainerId가있을 수 있습니다. 색인의 열 순서를 바꾸면 어떻게됩니까? '[ContainerID, Created]'? –

+0

아직 느리지 만,이 경우가 그럴 수도 있습니다. 두 경우 모두를 다루기 위해 양방향으로 인덱스를 사용해야합니까? 아니면 너무 많이 ... – KevinGreen24

+0

너무 많이 될 것 같아요. Sqlite가 유사한 인덱스 중에서 선택할 수있는 통계를 얼마나 많이 사용하는지 확신 할 수 없습니다. 특히 행 조회가 문제가되는 것처럼 보입니다 (많은 항목 테이블에서 읽음). –

답변

0

클러스터 된 인덱스은 범위에 대해 쿼리 속도를 높일 수 있습니다. 아마도 기본 키를 사용한다는 것을 의미하는 SQLite의 경우. 가능한 경우 (Created, ContainerId) 테이블의 PRIMARY KEY를 사용해보십시오.

+0

불행히도, 그건 옵션이 아닙니다. 각 행에는 고유 한 식별자가 있습니다. – KevinGreen24