Оптимизация запросов SQLite (подзапрос и объединение) - PullRequest
3 голосов
/ 28 июня 2009

У меня есть таблица для статистического проекта.

Структура выглядит так:

CREATE TABLE NewStatHistory (
    StatHistoryID uniqueidentifier PRIMARY KEY NOT NULL,
    DateEntered dateTime NOT NULL,
    DateApplies dateTime NOT NULL,
    WhoEnteredID uniqueIdentifier NOT NULL,
    PostingID uniqueIdentifier NULL,
    EnteredValue decimal(19,5) NOT NULL,
    StatID uniqueIdentifier NOT NULL,
    StatStatus int NOT NULL,
    Notes varchar(500) NULL,
    CampusID uniqueidentifier NOT NULL,
    IsTarget bit NOT NULL DEFAULT 0
)

Мне нужно получить последнее введенное значение для каждого «DateApplies».

Этот запрос почти мгновенно выполняется в SqlServer, но в SQLite он просто истекает, и я не могу понять, как оптимизировать его, чтобы он заработал.

SELECT NewStatHistory.* 
FROM NewStatHistory
INNER JOIN (
  SELECT MAX(DateEntered) entered, statID, DateApplies
  FROM NewStatHistory
  WHERE StatID = @statID 
    AND campusID = @campusID
    AND IsTarget = 0
  GROUP BY DateApplies, statID
) summary 
ON summary.entered = newstathistory.dateEntered AND
  summary.statID = newStatHistory.statID AND 
  summary.DateApplies = newStatHistory.DateApplies
WHERE NewStatHistory.StatID = @statID AND
  IsTarget = 0 AND
  campusID = @campusID
ORDER BY NewStatHistory.DateApplies DESC

У кого-нибудь есть идеи о том, как заставить его работать. В противном случае мне нужно будет найти другую встроенную базу данных для использования. Кроме этого запроса, SQLite выполнил все, о чем я его просил.

Что касается индексов, на SqlServer у меня индексирован только первичный ключ. На SQLite я попытался использовать только первичный ключ, но затем добавил несколько других столбцов, но безрезультатно.

Подзапрос также быстро выполняется на SQLite, так что, похоже, именно соединение вызывает медленную работу.

Ответы [ 2 ]

4 голосов
/ 28 июня 2009

Выполнение EXPLAIN QUERY PLAN по вашему запросу предполагает, что он выполняет 2 сканирования таблицы для этого запроса.

Возможно, вы захотите прочитать Страница "Обзор оптимизатора запросов SQLite" для получения дополнительной информации о работе оптимизатора

может помочь что-то похожее на это (непроверенное, кроме того, что оно используется):

CREATE INDEX foo ON NewStatHistory(statID, campusID, IsTarget, DateApplies);
2 голосов
/ 25 июля 2009

Я обнаружил, что в документации действительно указано, что этот тип соединения не поддерживается. Чтобы обойти это, используйте другую таблицу вместо подзапроса. Тогда он снова стал невероятно быстрым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...