2013-03-07 3 views
0

У меня есть этот запрос:Почему 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. Мне действительно нужен этот запрос быстрее. Любая помощь?

+0

Второй план запроса выглядит быстрее. Насколько хуже вы оцениваете? –

+0

Это занимает около одной секунды для первой и около трех секунд для второй. – Brannon

ответ

0
  • Указанный индекс включен ([TelemetryId], [TimestampTicks]), а не ([TimestampTicks]), и нет никакого фильтра criterai на [TelemetryId].
  • Если тестовая БД не имеет полных рабочих данных volumne, планы выполнения в тесте могут не отражать планы исполнения на производстве.
  • Двигатели DB пытаются моделировать использование индекса, более эффективное, чем сканирование таблицы, прежде чем выбирать индекс. Часто индекс, который выглядит полезным, может игнорироваться, если ожидаемый объем данных> ~ 10% от таблицы. (В этом случае, вероятно, не так.)
  • Преодоление мнимых проблем с производительностью - это отличное время. Есть ли реальная проблема с производительностью в этом случае?
+0

На TelemetryId есть критерии фильтрации. Это в ПРИСОЕДИНЕНИИ, которое, как я понимаю, переводится в ГДЕ на земле Шклит. – Brannon

+0

@Brannon: Я думаю, что в этом утверждении ясно, что индекс используется, просто не совсем, как и где вы думаете: «Если я отменим индекс, я на самом деле получаю худшую производительность». –

+0

Фраза «USE TEMP B-TREE» означает, что она не использует индекс для предложения ORDER BY. – Brannon

Смежные вопросы