2014-04-25 111 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] 

只是一些隨機的想法...