加快SQLite的查询速度

时间:2015-05-10 09:13:10

标签: vb.net sqlite csv sql-server-ce

我有一个使用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倍。

1 个答案:

答案 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()

插入速度的更详细比较:Improve INSERT-per-second performance of SQLite?