如何提高SQLite中SELECT查询的性能?
本文关键字:性能 查询 SELECT 何提高 SQLite | 更新日期: 2023-09-27 18:16:08
我有一个大的SQLite DB文件~ 3 GB。其中有5个表(表1-5),定义如下:
CREATE TABLE IF NOT EXISTS [TableOne] (
[EntryDate_Epoch_Utc] INTEGER DEFAULT (strftime('%s','now')),
[Key] TEXT PRIMARY KEY,
[Count] INTEGER NOT NULL
)
我有下面的SELECT查询,我需要每1分钟运行一次:
using (Db)
{
using (Db.OpenTransaction())
{
foreach (var table in _tables)
{
var query = StringExtensions.FormatWith("SELECT Key, Count FROM {0} ORDER BY Count DESC LIMIT 100", table);
var result = Db.Select<Result>(query);
// do something with the result
}
}
}
在我的程序开始时,当DB的大小很小时,查询运行得相当快~ 400毫秒,但是随着DB文件变大(接近一天结束),它需要大约30秒来运行上述查询。
是否有改进查询的方法?下面是我打开SQLite DB文件时使用的连接字符串:
var conStr = new SQLiteConnectionStringBuilder
{
DataSource = dbFilePath,
FailIfMissing = false,
Pooling = true,
DateTimeKind = DateTimeKind.Utc,
DateTimeFormat = SQLiteDateFormats.UnixEpoch,
JournalMode = SQLiteJournalModeEnum.Memory,
SyncMode = SynchronizationModes.Off,
UseUTF16Encoding = true,
PageSize = 4096,
CacheSize = 5000,
Version = 3
}.ToString();
要找到Count
值最大的100行,数据库必须遍历表的所有行。
在此列上创建索引时:
CREATE INDEX whatever ON TableOne(Count);
数据库只能从索引中获取最后100个条目