我有一个大的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 ms但是随着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();
答案 0 :(得分:3)
要查找具有最大Count
值的100行,数据库必须遍历表的所有行。
在此列上创建索引时:
CREATE INDEX whatever ON TableOne(Count);
数据库只能从索引中获取最后100个条目。