【问题标题】:How can I improve the performance of SELECT query in SQLite?如何提高 SQLite 中 SELECT 查询的性能?
【发布时间】: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


【解决方案1】:

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

在此列上创建索引时:

CREATE INDEX whatever ON TableOne(Count);

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

【讨论】:

  • tnx 进行解释,将排序显式添加到索引是否有帮助?即在 TableOne(Count DESC) 上创建任何索引?
  • 我明白了,所以添加 DESC 或 ASC 将是多余的,还是意味着完全不同的东西?我正在尝试了解这 2 个如何与 INDEX 一起使用,但找不到有关该主题的任何文档。
  • 索引排序顺序在使用带有多列索引的 ORDER BY 时很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2014-03-23
  • 2020-10-18
  • 2020-02-08
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多