C#改进SQLite SELECT性能

时间:2014-04-25 19:51:44

标签: c# sql performance sqlite datetime

我有一个程序,其中包含一个带有表的SQLite数据库:CREATE TABLE文件(路径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;
}

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

2 个答案:

答案 0 :(得分:3)

您应该构建SQL查询,以便只选择所需的记录,而不是从每一行读取数据:

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

如果仍然很慢,您应该可以通过在path, last_backup列上添加index来加快速度。使用索引可以加快数据库中的查询速度。 (就像保持你正在查找的东西HashSet<T>Dictionary<,>的想法一样,这样就可以进行快速二进制搜索)

答案 1 :(得分: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

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