我的「記錄」(3,500),我保存爲XML和壓縮的程序的退出名單。因爲:
- 的記錄數增加
- 只有約50記錄需要退出時進行更新
- 儲蓄持續3秒鐘
我需要另一種解決方案 - 嵌入式數據庫。我選擇SQL CE,因爲它與VS工作沒有任何問題,並且許可證是OK,我(我將它比作火鳥,SQLite的,EffiProz,db4o的和的BerkeleyDB)。
數據
的記錄結構:11個字段,其中2使主鍵(nvarchar的+字節)。其他記錄是字節,數據時間,雙精度和整數。
我不使用任何關係,連接,索引(主鍵除外),觸發器,視圖等。它實際上是扁平的字典 - 對鍵+值。我修改其中的一些,然後我必須在數據庫中更新它們。我不時添加一些新的「記錄」,我需要存儲(插入)它們。就這樣。
LINQ方法
我有空白的數據庫(文件),所以我做3500箇中插入一個循環(一個接一個)。我甚至不檢查記錄是否已經存在,因爲db是空白的。
執行時間? 4分52秒。我暈倒了(介意你:XML +壓縮= 3秒)。
SQL CE原始方法
我GOOGLE了一下,儘管這種要求如下: LINQ to SQL (CE) speed versus SqlCe 說明它是SQL CE本身的錯,我給它一個嘗試。
相同的循環,但這次插入是用SqlCeResultSet(DirectTable模式,請參閱:Bulk Insert In SQL Server CE)和SqlCeUpdatableRecord。
結果呢?你坐得舒服嗎?那麼...... 0.3秒(是的,秒數的一小部分!)。
問題
LINQ是非常可讀性和原始操作完全相反。我可以編寫一個將所有列索引轉換爲有意義名稱的映射器,但似乎重新發明了輪子 - 畢竟它已經在...... LINQ中完成了。
所以也許這是一種告訴LINQ加快速度的方法嗎? 問題 - 怎麼做?
代碼
LINQ
foreach (var entry in dict.Entries.Where(it => it.AlteredByLearning))
{
PrimLibrary.Database.Progress record = null;
record = new PrimLibrary.Database.Progress();
record.Text = entry.Text;
record.Direction = (byte)entry.dir;
db.Progress.InsertOnSubmit(record);
record.Status = (byte)entry.LastLearningInfo.status.Value;
// ... and so on
db.SubmitChanges();
}
原始操作
SqlCeCommand CMD = conn.CreateCommand();
cmd.CommandText =「Progress」; cmd.CommandType = System.Data.CommandType.TableDirect; SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);
foreach (var entry in dict.Entries.Where(it => it.AlteredByLearning))
{
SqlCeUpdatableRecord record = null;
record = rs.CreateRecord();
int col = 0;
record.SetString(col++, entry.Text);
record.SetByte(col++,(byte)entry.dir);
record.SetByte(col++,(byte)entry.LastLearningInfo.status.Value);
// ... and so on
rs.Insert(record);
}
你能展示一些代碼示例嗎? – 2011-05-01 18:07:41
@Kevin Pullin,當然,我添加了必要的部分來理解我在兩種情況下如何插入。 – greenoldman 2011-05-01 19:06:47
你有沒有試過['BinaryFormatter'](http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx)? – svick 2011-05-01 20:03:20