나는이 쿼리가 :Sqlite가이 ORDER BY에 대한 색인을 사용하지 않는 이유는 무엇입니까?
SELECT * FROM Events e
INNER JOIN Telemetry ss ON ss.Id = e.TelemetryId
INNER JOIN Services s ON s.Id = ss.ServiceId
WHERE s.AssetId = @AssetId AND e.TimestampTicks >= @StartTime
ORDER BY e.TimestampTicks LIMIT 1000
을 나는이 인덱스가 :
CREATE INDEX [IX_Events_TelemetryId_TimestampTicks] ON [Events] ([TelemetryId],[TimestampTicks])
그러나 인덱스가 ORDER BY 절에 사용되지 않습니다. 나는이 질의 설명을 얻는다 :
0|0|2|SCAN TABLE Services AS s (~44 rows)
0|1|1|SEARCH TABLE Telemetry AS ss USING AUTOMATIC COVERING INDEX (ServiceId=?) (~5 rows)
0|2|0|SEARCH TABLE Events AS e USING INDEX IX_Events_TelemetryId_TimestampTicks (TelemetryId=? AND TimestampTicks>?) (~1816 rows)
0|0|0|USE TEMP B-TREE FOR ORDER BY
왜 B-TREE인가? 인덱스를 뒤집 으면 실제로 성능이 떨어집니다. 그 쿼리 계획은 다음과 같습니다.
0|0|0|SEARCH TABLE Events AS e USING INDEX IX_Events_TimestampTicks_TelemetryId (TimestampTicks>?) (~4031303 rows)
0|1|1|SEARCH TABLE Telemetry AS ss USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
0|2|2|SEARCH TABLE Services AS s USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
왜 이러한 순서로 TelemetryId를 사용할 수 없는지 모르겠습니다. 정말이 쿼리가 더 빨리 필요합니다. 어떤 도움이 필요합니까?
두 번째 쿼리 계획이 빠릅니다. 얼마나 더 나쁜 성능을 측정 했습니까? –
처음에는 약 1 초가 걸리고 두 번째 시간에는 약 3 초가 걸립니다. – Brannon