2011-09-25 1 views
1

내 테이블에 인덱스가없는 일부 열이 있는데 SQLite가 전체 테이블 검색을 수행하기 때문에 이러한 열의 값을 검색하는 데 시간이 오래 걸릴 수 있습니다.SQLite : 테이블 스캔 최적화

내 특정 경우에는 내가 찾고있는 행 (값이 고유함)은 거의 항상 최근에 삽입 된 것입니다.

SQLite가 스캔을 수행 할 때 가장 오래된 (첫 번째) 행부터 시작한다고 의심합니다. SQLite가 역순으로 테이블 스캔을 수행하도록 지시하는 방법이 있습니까?

UPDATE

:이 나는 ​​변경 내역이 발견 : 이렇게하면 BY ... DESC 절 주문을 만족하는 경우 옵티마이 저는 이제 역으로 테이블을 스캔

.

어쩌면 이것은 내가 속도를 올리기 위해 ORDER BY 절을 추가 할 수 있음을 의미합니다.

+0

거의 항상 그렇습니까? '내가 찾는 행은 가장 최근에 삽입 된 행의 대부분이다. ' – Tim

+0

고마워, 나는 그것을 고쳤다. – Muis

+0

DESC에 의한 정렬은 SQLite가 일치하는 것을 찾으면 행 검색을 중단시키지 않습니다. 해당 열에서 값이 고유하면 첫 번째 일치 항목을 찾은 후에 추가 일치 항목이 없는지 계속해서 검색합니다. 아래 내 제안 사항을 참조하십시오. – Tim

답변

2

솔루션이었다 :

ORDER BY rowid DESC LIMIT 1 

그것은이 조회 번개 빠른했다!

1

FULL 테이블 스캔이 필요하기 때문에 스캔 순서 (가장 오래된 것으로부터 가장 젊거나 가장 오래된 것부터 가장 오래된 것까지)는 부적합합니다. 모든 행을 방문해야합니다. 하나 개의 행을 반환 할 수 있습니다 조건

    .... where col = 'a' 

'는 행이 내가 찾고 ', 또는 10 행, 500 개 행을 반환 할 수 있습니다 당신은 언급하지만. SQLite는 LIMIT 지시어를 사용하지 않는 한 첫 번째로 일치하는 행을 만날 때 간단히 멈추고 호출 할 수 없습니다.

는 편집 :

   select * from 
       (
       select * from T 
       where datecreated > {somerecentdate} 
      ) as myView 
       where myView.someColumn = 'a' 

하거나

  select * from T where datecreated > {some date} and somecolumn = 'a' 
: 당신이 할 수있는 무엇, 그러나, 타임 스탬프 열, 인덱스를 사용하고 비교적 최근 행을 얻기 위해 인라인 뷰를 사용하다

이러한 접근 방식은 반복적 인 프로세스 일 수 있습니다. 행이 반환되지 않으면 더 넓은 시간 창으로 다시 쿼리해야 할 수도 있습니다. 그러나 인덱스를 만들려면 [someColumn]을 색인화해야합니다.

+0

열의 값이 고유하기 때문에 항상 한 행을 반환합니다. 나는 INSI를 너무 느리게하기 때문에 UNIQUE 나 INDEX를 사용하지 않는다. 처음 생각한 것은 위에서 설명한 것과 동일한 반복 프로세스를 사용하는 것이었고 추가 'datecreated'열에 대한 필요성조차 없었습니다. 항상 증가하기 때문에 행의 ID에서 수행 할 수 있습니다. 그러나 나는 직접 스마트 알고리즘을 구현하지 않고 빌드 인 솔루션이 있기를 바랬다. – Muis

+0

열이 항상 하나의 행을 반환한다는 것은 SQLite가 열을 인덱싱하지 않으면 알 수 없다는 사실입니다. 전체 테이블 스캔이 항상 필요합니다. LIMIT() 최적화가있는 경우 LIMIT 1을 사용할 수 있습니다. – Tim

+0

검색어에 이미 LIMIT 1이 포함되어 있지만 어쨌든 감사드립니다. – Muis