2014-04-25 75 views
1

我有与表SQLite数据库的程序:CREATE TABLE文件(路径文本,LAST_BACKUP DATETIME)C#SQLite的提高性能SELECT

总数据库大小为33MB,在这约25万条记录。

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

当我最初运行我的程序时,数据库是空的,所以它每次都会返回最短日期。现在有很多记录来检查程序运行速度慢得多。

查询表我的代码块:

internal DateTime lastBackupDate(String file) 
{ 
    DateTime date = DateTime.MinValue; 
    string sql = "SELECT * FROM files WHERE [email protected]"; 
    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; 
} 

我的问题是,有什么可以做,以加快这?

+0

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

回答

3

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

SELECT max(last_backup) FROM files WHERE [email protected] 

如果这仍然很慢,哟你应该能够通过在​​列上添加index来加速它。索引可以让你在数据库中加速这样的查询。 (比如保留一个HashSet<T>Dictionary<,>这个东西你正在查找,所以可以做一个快速的二进制搜索)

+0

改变查询来选择一条记录(就像其他一些建议一样)做出了改变,但是索引做出了非常大的改变。谢谢。 –

2

如果你需要的是一个单一的领域,你可以返回刚才的那一个,而不是所有列:

SELECT last_backup FROM files WHERE [email protected] 

而且,您的查询看起来它可能返回多行,但您只能使用从最后一个备份日期。如果这是故意的,你可以尝试返回一个单行:

SELECT last_backup FROM files WHERE [email protected] LIMIT 1 

或者:

SELECT DISTINCT last_backup FROM files WHERE [email protected] 

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