|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
Имеется от 500 до 1000. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2009, 10:41 |
|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
lisisergИмеется от 500 до 1000. 1. а что - медленно? 2. в чем вы делаете вставку и собираетесь увеличить скорость? В частности, в приложении на шарпе надо делать так: откомпилировать запрос, открыть транзакцию, объявить параметры, и потом в цикле подставлять параметры и делать инсерты. после цикла закрыть транзакцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2009, 12:29 |
|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
Сейчас это делается так: for (int j = 0; j < (int)FI.GetMAXPnumGlyphs(); j++) { sql = String.Format("INSERT INTO tb_unicode(id, idx) VALUES({0:D},{1:D})", id, FI.glyfhead[j].usUnicode); iResult = sqlite3_prepare(database, StrToPtr(sql), -1, out statement, out excessData); iResult = sqlite3_step(statement); iResult = sqlite3_finalize(statement); } а как в sqlite делаются транзакции, не знаю пока ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2009, 16:11 |
|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
lisiserg а как в sqlite делаются транзакции, не знаю пока Ровно так, как определено в стандарте. Прочитайте _хоть что-нибудь_ про SQL, все равно, какой версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2009, 23:53 |
|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
lisisergСейчас это делается так: for (int j = 0; j < (int)FI.GetMAXPnumGlyphs(); j++) { sql = String.Format("INSERT INTO tb_unicode(id, idx) VALUES({0:D},{1:D})", id, FI.glyfhead[j].usUnicode); iResult = sqlite3_prepare(database, StrToPtr(sql), -1, out statement, out excessData); iResult = sqlite3_step(statement); iResult = sqlite3_finalize(statement); } а как в sqlite делаются транзакции, не знаю пока судя по всему вы пишете на шарпе, если да, то почему тогда не пользуетесь sqlite NET провайдером? кроме того, вынесите за цикл подготовку sql утверждения, а в цикле подставляйте только параметры и выполняйте. 500-1000 это вообще не должно быть проблемой.. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2009, 10:33 |
|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
Тоже столкнулся - SQL-скрипт на ~17000 INSERT'ов выполнялся минут 5. При этом на Постгресе он же выполняется мгновенно. Объяснение нашлось в доке по Google Gears : PRAGMA synchronous = NORMAL; Synchronous controls whether data is synchronized to disk before COMMIT commands return (commands not in transactions are implicitly wrapped in one). Setting synchronous to OFF can provide a significant performance boost, at the expense of potential data corruption. Much of the benefit of turning synchronous off can generally be achieved by using a combination of large transactions and WorkerPool. То есть по умолчанию SQLite настроен на синхронный доступ к диску. А каждый INSERT неявно оборачивается в транзакцию (в отличие от psql, которому хватает мозгов сделать одну транзакцию на скрипт), что и дает большой оверхед. В скрипте транзакции делаются стандартно: Код: plaintext
в начале и Код: plaintext
в конце. После этого скрипт стал выполняться за 2-3 секунды. В Вашем случае, нужно создать транзакцию не в виде SQL-команд, а средствами интерфейса к БД: отключить автокоммит и запихать все INSERT'ы в батч. На Яве (JDBC) это Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
То есть компиляция SQL-выражения до цикла, выполнение - после, а внутри - только подстановка параметров и добавление в батч. Как Вам собсно и написали. Подозреваю, на Шарпе примерно также. Читайте доку по .NET. p.s. Можно еще выставить SQLite'у PRAGMA synchronous = OFF; Но это не заменяет, а дополняет правильную работу с транзакциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2009, 16:36 |
|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
Oleg Zhovtanyuk То есть по умолчанию SQLite настроен на синхронный доступ к диску. А каждый INSERT неявно оборачивается в транзакцию (в отличие от psql, которому хватает мозгов сделать одну транзакцию на скрипт), что и дает большой оверхед. Ерунда. Шелл psql точно также выполняет каждый отдельный insert в режиме autocommit, ровно так, как это определено стандартом. Вот в pgadmin набор инструкций по щучьему веленью заворачивается в транзакцию, но это личное дело упомянутого клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2009, 00:05 |
|
Как увеличить скорость вставки большого числа INSERT в SQLite
|
|||
---|---|---|---|
#18+
MBGOleg Zhovtanyuk То есть по умолчанию SQLite настроен на синхронный доступ к диску. А каждый INSERT неявно оборачивается в транзакцию (в отличие от psql, которому хватает мозгов сделать одну транзакцию на скрипт), что и дает большой оверхед. Ерунда. Шелл psql точно также выполняет каждый отдельный insert в режиме autocommit, ровно так, как это определено стандартом. Вот в pgadmin набор инструкций по щучьему веленью заворачивается в транзакцию, но это личное дело упомянутого клиента. Возможно. В любом случае, после упомянутого оборачивания набора инструкций в транзакцию (в коде скрипта через BEGIN TRAN...COMMIT, как показано выше) скорость прогона этого скрипта в psql не изменяется, а в sqlite3 вырастает минимум на два порядка. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2009, 18:14 |
|
|
start [/forum/topic.php?fid=54&msg=36163226&tid=2009426]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
83ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 321ms |
total: | 496ms |
0 / 0 |