如何在SQLite中提高SELECT查询的性能?

时间:2014-08-03 23:42:20

标签: c# sqlite system.data.sqlite

我有一个大的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();

1 个答案:

答案 0 :(得分:3)

要查找具有最大Count值的100行,数据库必须遍历表的所有行。

在此列上创建索引时:

CREATE INDEX whatever ON TableOne(Count);

数据库只能从索引中获取最后100个条目。