如何提高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();

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

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

在此列上创建索引时:

CREATE INDEX whatever ON TableOne(Count);

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