2015-05-10 2 views
0

У меня есть настольное приложение с использованием MSSQL CE. Я использую версию CE, потому что позже мне понадобится передача файла в мобильном устройстве.Ускорение запроса SQLite

Используя MSSQL CE, я мог бы передавать данные из файла CSV на свой SDF Databse через 10-15 секунд с 32000 записями.

Проблема заключается в том, что я использую базу данных SDF на своем мобильном устройстве, так как занимает около 24 секунд только для простого заявления SELECT sku,upc,description,price FROM items WHERE upc='111'.

Я хотел бы попробовать и проверить SQLite, поскольку он легче и, возможно, быстрее, но на первом этапе передайте данные из CSV в SQLite Databse, это заняло очень много времени, через 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 взял, может быть в 10 раз медленнее, перемещая данные из CSV в базу данных ,

ответ

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?

+0

Параметр 'Другой Improvement' значительно повышает скорость, без него, это было около 10 секунд, но с' prepare' она занимает около 3 -4 сек для завершения 32 тыс. Строк. – jaa2013

+0

@Jens почему бы не просто 'InsertCommand.Parameters.add (новый SQLite.SQLiteParameter (« @ Sku », 12341))' – pnizzle

+0

@Jens Очевидно, если я использую описанный выше подход, мне не нужно делать команду подготовки() по команде. Поэтому мой вопрос заключается в том, задает ли ключ параметра и тип данных, а затем делает make() имеет разницу в производительности, просто добавляя параметры в качестве экземпляров 'SQLiteParameter'? – pnizzle

Смежные вопросы