加快 SQLite 的查询速度

Speeding up query of SQLite

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

基本上从这里复制粘贴我自己的答案:

一个接一个执行很多insert很慢。它将极大地帮助您将所有插入包装到一个事务中。

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      

你基本上收集了所有你想做的插入,当你完成时,它们都在一个大的 swoosh 中执行。这大大加快了速度。

这里有一个关于交易的教程:

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?