【问题标题】:C# Improving SQLite SELECT performanceC# 提高 SQLite SELECT 性能
【发布时间】:2014-06-11 16:19:48
【问题描述】:

我有一个程序,它有一个带有表的 SQLite 数据库:CREATE TABLE files(path TEXT, last_backup DATETIME)

总数据库大小为 33Mb,其中大约有 250000 条记录。

我正在运行一段代码,它将选择路径字段与字符串匹配的任何记录并返回 last_backup DATETIME 值。如果没有找到记录,则返回 DateTime.MinValue。

当我最初运行我的程序时,数据库是空的,所以它每次都会返回最小日期。现在有很多记录可以检查程序运行同一个进程要慢很多。

我查询表的代码块是:

internal DateTime lastBackupDate(String file)
{
    DateTime date = DateTime.MinValue;
    string sql = "SELECT * FROM files WHERE path=@param1";
    SQLiteCommand command = new SQLiteCommand(sql, _connection);
    command.Parameters.AddWithValue("@param1", file);
    SQLiteDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        date = (DateTime)reader["last_backup"];
    }
    return date;
}

我的问题是,有什么办法可以加快速度吗?

【问题讨论】:

  • 也许 SQLite 不是适合这项工作的工具,也许尝试切换到 MS SQL?

标签: c# sql performance sqlite datetime


【解决方案1】:

您应该形成 SQL 查询,以便它只选择您想要的记录,而不是从每一行读取数据:

SELECT max(last_backup) FROM files WHERE path=@param1

如果这仍然很慢,您应该可以通过在 path, last_backup 列上添加 index 来加快速度。索引可让您加快数据库中的此类查询。 (例如保留您正在查找的内容的HashSet<T>Dictionary<,> 以便进行快速二分搜索的想法)

【讨论】:

  • 将查询更改为仅选择一条记录(也像其他一些建议一样)有所作为,但索引产生了很大的不同。谢谢。
【解决方案2】:

如果您只需要一个字段,您可以只返回那个字段而不是所有列:

SELECT last_backup FROM files WHERE path=@param1

此外,您的查询似乎可能会返回多行,但您只使用最后一行的备份日期。如果这是故意的,您可以尝试返回单行:

SELECT last_backup FROM files WHERE path=@param1 LIMIT 1

或者:

SELECT DISTINCT last_backup FROM files WHERE path=@param1

只是一些随机的想法......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多