【发布时间】:2011-05-10 12:39:06
【问题描述】:
我有下表:
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)
然后我更新 Records 表中的 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
问题是,由于该表包含大约 500K 条记录,因此整个过程大约需要 2 分钟。使用游标初始化 SortIndex 可能会快很多,但是 SQLite 缺少此功能:(
有更快的方法吗?
提前致谢!
【问题讨论】:
标签: sql performance sqlite