【发布时间】:2014-08-03 23:42:19
【问题描述】:
我有一个大的 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
)
我需要每 1 分钟运行一次以下 SELECT 查询:
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
}
}
}
在我的程序开始时,当数据库的大小很小时,查询运行速度非常快~ 400 毫秒,但是随着数据库文件变大(接近一天结束),运行上述查询大约需要 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字段是否有索引? -
@ PM 77-1,不,我不知道,考虑到 [Count] 不能是唯一的,DDL 与上面完全相同,您是否建议我应该在 [Count] 上创建一个非唯一索引?
-
是的,我认为它允许仅通过索引搜索来计算 TOP 100。请参阅The SQLite Query Planner 中的第 8 节。我会说值得一试。
-
太好了,我会试一试并更新帖子。谢谢你。
标签: c# sqlite system.data.sqlite