2012-12-06 3 views
0

스키마 :SQLite는 더 나은 인덱스 사용을 거부합니까?

CREATE TABLE [Groups] ([Group] VARCHAR(50) NULL, [ArtNum] INTEGER NULL, [ID] VARCHAR(50) NULL, [Time] INTEGER); 
CREATE INDEX [GroupTime] ON [Groups] ([Group], [Time] DESC); 
CREATE INDEX [GroupArtNum] ON [Groups] ([Group], [ArtNum]); 

나는 다음과 같은 쿼리를 최적화하고자는 :

SELECT `ID` FROM `Groups` WHERE `Group`=? ORDER BY `Time` DESC LIMIT 1 

문제 SQLite는이 GroupTime 인덱스 대신 GroupArtNum 인덱스를 사용하여 주장이다. 다음 EXPLAIN QUERY PLAN 인쇄 :

SEARCH TABLE Groups USING INDEX GroupArtNum (Group=?) (~10 rows) 
USE TEMP B-TREE FOR ORDER BY 

흥미로운 것은 내가 ArtNum 대신 Time 기준으로 정렬하려고하면, 그것은 매우 빠르게 실행하는 것입니다.

ArtNum과 동일하게 Time 열에는 (64 비트) 정수만 있습니다.

+2

['ANALYZE'] (http://www.sqlite.org/lang_analyze.html)을 실행 해 보셨습니까? –

+0

'ANALYZE'가 이것을 고치지 않는다면'Time'을 질의 *에 넣으면이를 속여 야합니다. 이런 식으로 :'Where Group =? AND Time> = 0'입니다. 그러나보다 우아한 해결책이있을 수 있습니다. –

+0

ANALYZE가 작동했습니다. 감사합니다. 내가 그것을 받아 들일 수 있도록 답변으로 다시 게시하십시오 :) –

답변

1
  1. 실행 ANALYZE (특정 경우에 도움이되거나 도움이되지 않을 수도 있음); 쿼리 계획 최적화를 가지고 SQLite는 3.7.15 (출시 때)에

    SELECT ID FROM Groups INDEXED BY GroupTime WHERE ... 
    
  2. 또는 업데이트 : 또는
  3. 특정합니다 (documentation이 일에 대해 경고하지만) 인덱스를 사용하여 강제로 INDEXED 절을 사용 그 점을 인식하면 GroupTime을 사용하는 것이 더 효율적입니다.