加快 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?
我有一个使用 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?