我有一个使用MSSQL CE的桌面应用程序。我使用的是CE版本,因为我稍后需要在移动设备中进行文件传输。
使用MSSQL CE我可以在10-15秒内将数据从CSV文件传输到我的SDF数据库,并拥有32000条记录。
问题在于我在移动设备中使用SDF数据库,因为只需要一个简单的SELECT sku,upc,description,price FROM items WHERE upc='111'
语句大约需要24秒。
我想尝试测试SQLite,因为它更轻,也许更快但是在第一阶段,将数据从CSV传输到SQLite数据库,花了很长时间,在30分钟内从CSV传输的数据只是1000多条记录。
我应该如何更快地查询?
我的MSSQL代码: `FileReader = New StreamReader(StringFileName)
Do While FileReader.Peek() >= 0
TempReaderString = FileReader.ReadLine
TempArraySplitString = TempReaderString.Split("`")
UpdateAppSqlCommand.CommandText = "INSERT INTO Items(Sku, Upc, Description, Price) VALUES('" & TempArraySplitString(0) & "','" & TempArraySplitString(1) & "','" & TempArraySplitString(2) & "','" & TempArraySplitString(3) & "')"
UpdateAppSqlCommand.ExecuteNonQuery()
Loop
FileReader.Close()`
我的SQLite代码:
FileReader = New StreamReader(StringFileName)
Do While FileReader.Peek() >= 0
TempReaderString = FileReader.ReadLine
TempArraySplitString = TempReaderString.Split("`")
TempArraySplitString(2) = TempArraySplitString(2).Replace("'", " ")
TempArraySplitString(2) = TempArraySplitString(2).Replace("""", " ")
UpdateAppSqlCommand.CommandText = "INSERT INTO Items(Sku, Upc, Description, Price) VALUES('" & TempArraySplitString(0) & "','" & TempArraySplitString(1) & "','" & TempArraySplitString(2) & "','" & TempArraySplitString(3) & "')"
UpdateAppSqlCommand.ExecuteNonQuery()
Loop
FileReader.Close()
SQLite将数据从CSV移动到数据库的速度可能慢了10倍。
答案 0 :(得分:2)
基本上从这里复制粘贴我自己的答案:VB.Net write large amounts of data to SQLite-DB
一个接一个地执行大量插入非常慢。它将极大地帮助您将所有插入包装到事务中。
Using t As SQLiteTransaction = sqlcon.BeginTransaction 'sqlcon being the SQLiteConnection
Do While FileReader.Peek() >= 0
'Your other code
UpdateAppSqlCommand.CommandText = "INSERT INTO Items(Sku, Upc, Description, Price) VALUES('" & TempArraySplitString(0) & "','" & TempArraySplitString(1) & "','" & TempArraySplitString(2) & "','" & TempArraySplitString(3) & "')"
UpdateAppSqlCommand.ExecuteNonQuery()
Loop
t.Commit()
End Using
你基本上收集了你想要做的所有插入,当你完成它们时,它们都是在一个大的旋风中执行的。这会加速很多事情。
这是关于交易的教程:
http://www.tutorialspoint.com/sqlite/sqlite_transactions.htm
另一项改进是在SQLiteCommand中使用参数并准备命令。然后只需更改每个插入的参数。像这样:
'Before loop
UpdateAppSqlCommand.CommandText = "INSERT INTO Items (Sku, Upc, Description, Price) VALUES(@Sku, @Upc, @Description, @Price)"
UpdateAppSqlCommand.Parameters.Add("@Sku", DbType.Int32)
'Repeat for other parameters with respective type...
UpdateAppSqlCommand.Prepare()
'In loop
UpdateAppSqlCommand.Parameters("@Sku").Value = 12341
'update other parameters...
UpdateAppSqlCommand.ExecuteNonQuery()