C#改进SQLite SELECT性能



我有一个程序,它有一个带有表的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;
}

我的问题是,有什么办法可以加快这一进程吗?

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

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

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

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

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

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

最新更新