C# C改进SQLite选择性能

C# C改进SQLite选择性能,c#,sql,performance,sqlite,datetime,C#,Sql,Performance,Sqlite,Datetime,我有一个程序,它有一个SQLite数据库和表:createtablefilespath TEXT,last_backup DATETIME 数据库总大小为33Mb,其中包含约250000条记录 我正在运行一段代码,它将选择路径字段与字符串匹配的任何记录,并返回last_backup DATETIME值。如果未找到任何记录,则返回DateTime.MinValue 当我最初运行我的程序时,数据库是空的,所以每次都会返回最小日期。现在有很多记录要检查程序是否运行相同的进程,速度要慢得多 我查询表的代

我有一个程序,它有一个SQLite数据库和表:createtablefilespath 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;
}

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

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

SELECT last_backup FROM files WHERE path=@param1
此外,您的查询似乎可能返回多行,但您只使用上一行的备份日期。如果是有意的,可以尝试返回一行:

SELECT last_backup FROM files WHERE path=@param1 LIMIT 1
或:


只是一些随机想法…

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

SELECT last_backup FROM files WHERE path=@param1
此外,您的查询似乎可能返回多行,但您只使用上一行的备份日期。如果是有意的,可以尝试返回一行:

SELECT last_backup FROM files WHERE path=@param1 LIMIT 1
或:


只是一些随机的想法…

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

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

如果这仍然很慢,您应该能够通过在路径上添加一个“last_backup”列来加快速度。索引可以让您在数据库中加速这样的查询。与保留所查找内容的哈希集或字典的想法类似,这样可以进行快速二进制搜索,而不是从每一行读取数据,您应该形成SQL查询,以便它只选择您想要的记录:

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

如果这仍然很慢,您应该能够通过在路径上添加一个“last_backup”列来加快速度。索引可以让您在数据库中加速这样的查询。比如保留一个你正在查找的东西的哈希集或字典,这样就可以进行快速的二进制搜索

也许SQLite不是适合这项工作的工具,也许尝试切换到MS SQL?也许SQLite不是适合这项工作的工具,也许可以尝试切换到MS SQL?将查询更改为仅选择一条记录,就像其他一些建议的记录一样,也会产生不同,但索引产生了很大的不同。谢谢。将查询更改为只选择一条记录,就像其他一些建议的一样,这也会产生影响,但是索引产生了很大的影响。谢谢