У меня есть следующая таблица:
CREATE TABLE Records (
RecordIndex INTEGER NOT NULL,
...
Some other fields
...
Status1 INTEGER NOT NULL,
Status2 INTEGER NOT NULL,
UpdateDate DATETIME NOT NULL,
CONSTRAINT PK_Records PRIMARY KEY (RecordIndex ASC))
И индекс:
CREATE INDEX IDX_Records_Status ON ClientRecords
(Status1 ASC, Status2 ASC, RecordIndex ASC)
Мне нужно получить записи определенного статуса одну за другой, поэтому я использовал это утверждение:
SELECT *
FROM RECORDS
WHERE RecordIndex > @PreviousIndex
AND Status1 = @Status1
AND Status2 = @Status2
LIMIT 1
Но теперь мне нужно выбрать записи, отсортированные по другому полю, но это поле не уникально для каждой записи, поэтому я не могу использовать его таким же образом. Поэтому я решил добавить новое поле SortIndex в мою таблицу.
Поскольку в SQLite нет курсоров, я делаю следующее для инициализации значений для SortIndex.
Сначала я создаю временную таблицу:
CREATE TEMP TABLE Sort (
SortIdx INTEGER PRIMARY KEY AUTOINCREMENT,
RecordIdx INTEGER )
Затем я заполняю эту таблицу в правильном порядке сортировки:
INSERT INTO Sort
SELECT NULL, RecordIndex
FROM Records
ORDER BY SomeField ASC, RecordIndex ASC
Затем я создаю индекс для временной таблицы:
CREATE INDEX IDX_Sort_RecordIdx ON Sort (RecordIdx ASC)
Затем я обновляю поле SortIndex в моей таблице записей:
UPDATE Records
SET SortIndex =
(SELECT SortIdx
FROM Sort
WHERE RecordIdx = RecordIndex)
Затем я сбрасываю временную таблицу:
DROP TABLE Sort
И наконец я создаю новый индекс в моей таблице записей
CREATE INDEX IDX_Records_Sort ON Records
(Status1 ASC, Status2 ASC, SortIndex ASC)
Это позволяет мне сделать следующий выбор
SELECT *
FROM Records
WHERE SortIndex > @PreviousSortIndex
AND Status1 = @Status1
AND Status2 = @Status2
LIMIT 1
Проблема в том, что в таблице содержится около 500 тыс. Записей, и все это занимает около 2 минут. Вероятно, было бы намного быстрее инициализировать SortIndex с помощью курсора, но SQLite не имеет этой возможности: (
Есть ли более быстрый способ сделать это?
Заранее спасибо!