Sqlite有一個限制,它將只使用每個查詢一個索引。目前這個限制讓我感到困擾,但我需要Sqlite,因爲我不知道任何其他可以競爭插入速度的本地數據庫引擎(儘管我願意接受建議)。必須有一些索引方案,使其工作
我有這個簡單的表(等等)一百萬上千萬行:
CREATE TABLE [Events] (
[Id] INTEGER PRIMARY KEY,
[TelemetryId] INTEGER NOT NULL,
[TimestampTicks] INTEGER NOT NULL,
[Value] TEXT NOT NULL)
看着我的數據我有大約2000獨特TelemetryId值和每個獨特TelemetryId約25000行。我一直在使用這個指數:
CREATE INDEX [IX_Events_TimestampTicks_TelemetryId]
ON [Events] ([TimestampTicks], [TelemetryId])
然而,指數未能我對我的查詢在這裏我就不在TimestampTicks約束(顯然)通過。那個索引是我在TimestampTicks和TelemetryId上嘗試過單個索引之後。在我的測試中,甚至在運行ANALYZE
之後,Sqlite只會在被引用時使用TelemetryId上的索引 - 在限制爲Timestamp範圍的查詢中這是錯誤的。如果我顛倒組合索引中列的順序,那麼以前快速查詢的速度變慢。
這是我的查詢的完整列表。你能看到一個適用於所有人的索引方案嗎?
INSERT INTO Events (TelemetryId, TimestampTicks, Value)
VALUES(@TelemetryId, @TimestampTicks, @Value); SELECT last_insert_rowid()
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 10000
SELECT * FROM Events e
WHERE e.TimestampTicks >= @StartTime
ORDER BY e.TimestampTicks LIMIT 10000
SELECT * FROM Events
WHERE TelemetryId = @TelemetryId AND TimestampTicks <= @TimestampTicks
ORDER BY TimestampTicks DESC LIMIT 1
SELECT MIN(TimestampTicks) FROM Events
SELECT MAX(TimestampTicks) FROM Events
SELECT COUNT(*) FROM Events
SELECT TimestampTicks, [Value] FROM Events
WHERE TelemetryId = @TelemetryId
SELECT Id FROM Events
WHERE TelemetryId = @TelemetryId LIMIT 2
SELECT MIN(e.TimestampTicks) 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
SELECT MAX(e.TimestampTicks) 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
SELECT * FROM Events
WHERE TimestampTicks <= @TimestampTicks AND TelemetryId = @TelemetryId
ORDER BY TimestampTicks DESC LIMIT 1
SELECT e.Id, e.TelemetryId, e.TimestampTicks, e.Value
FROM (SELECT e2.Id AS [Id], MIN(e2.TimestampTicks) as [TimestampTicks]
FROM Events e2 WHERE e2.TimestampTicks
BETWEEN @Min AND @Max AND e2.TelemetryId in @TelemetryIds
GROUP BY e2.TelemetryId) AS grp
INNER JOIN Events e ON grp.Id = e.Id
我會建議AssetID,TelemetryID和TimeStampTicks上的簡單非複合索引。 – Tim 2013-03-06 22:08:20