У меня есть этот запрос:Почему 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])
Однако индекс не используется для заказа по п. Я получаю этот запрос:
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. Мне действительно нужен этот запрос быстрее. Любая помощь?
Второй план запроса выглядит быстрее. Насколько хуже вы оцениваете? –
Это занимает около одной секунды для первой и около трех секунд для второй. – Brannon