Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как увеличить скорость вставки большого числа INSERT в SQLite / 8 сообщений из 8, страница 1 из 1
17.08.2009, 10:41
    #36147096
lisiserg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
Имеется от 500 до 1000.
...
Рейтинг: 0 / 0
17.08.2009, 12:29
    #36147358
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
lisisergИмеется от 500 до 1000.

1. а что - медленно?
2. в чем вы делаете вставку и собираетесь увеличить скорость?

В частности, в приложении на шарпе надо делать так:

откомпилировать запрос, открыть транзакцию, объявить параметры,
и потом в цикле подставлять параметры и делать инсерты.
после цикла закрыть транзакцию.
...
Рейтинг: 0 / 0
25.08.2009, 16:11
    #36162153
lisiserg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
Сейчас это делается так:

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 делаются транзакции, не знаю пока
...
Рейтинг: 0 / 0
25.08.2009, 23:53
    #36162833
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
lisiserg
а как в sqlite делаются транзакции, не знаю пока

Ровно так, как определено в стандарте. Прочитайте _хоть что-нибудь_ про SQL, все равно, какой версии.
...
Рейтинг: 0 / 0
26.08.2009, 10:33
    #36163226
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
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 это вообще не должно быть проблемой..
...
Рейтинг: 0 / 0
23.09.2009, 16:36
    #36213087
Oleg Zhovtanyuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
Тоже столкнулся - 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
BEGIN TRANSACTION;

в начале и

Код: plaintext
COMMIT;

в конце. После этого скрипт стал выполняться за 2-3 секунды.

В Вашем случае, нужно создать транзакцию не в виде SQL-команд, а средствами интерфейса к БД: отключить автокоммит и запихать все INSERT'ы в батч. На Яве (JDBC) это

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Connection conn = null;
PreparedStatement stat = null;
try {
  conn = getConnection();
  conn.setAutoCommit(false);
  stat = getStatement(conn);
  for (...) {
    ...
    stat.addBatch();
  }
  int[] rowCounters = stat.executeBatch();
  conn.commit();
} catch (SQLException ex) {
   conn.rollback();
} finally {
  if (stat != null) { stat.close(); }
  if (conn != null) { conn.close(); }
}

То есть компиляция SQL-выражения до цикла, выполнение - после, а внутри - только подстановка параметров и добавление в батч. Как Вам собсно и написали. Подозреваю, на Шарпе примерно также. Читайте доку по .NET.

p.s. Можно еще выставить SQLite'у PRAGMA synchronous = OFF;
Но это не заменяет, а дополняет правильную работу с транзакциями.
...
Рейтинг: 0 / 0
24.09.2009, 00:05
    #36213825
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
Oleg Zhovtanyuk
То есть по умолчанию SQLite настроен на синхронный доступ к диску. А каждый INSERT неявно оборачивается в транзакцию (в отличие от psql, которому хватает мозгов сделать одну транзакцию на скрипт), что и дает большой оверхед.

Ерунда. Шелл psql точно также выполняет каждый отдельный insert в режиме autocommit, ровно так, как это определено стандартом. Вот в pgadmin набор инструкций по щучьему веленью заворачивается в транзакцию, но это личное дело упомянутого клиента.
...
Рейтинг: 0 / 0
25.09.2009, 18:14
    #36218152
Oleg Zhovtanyuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увеличить скорость вставки большого числа INSERT в SQLite
MBGOleg Zhovtanyuk
То есть по умолчанию SQLite настроен на синхронный доступ к диску. А каждый INSERT неявно оборачивается в транзакцию (в отличие от psql, которому хватает мозгов сделать одну транзакцию на скрипт), что и дает большой оверхед.

Ерунда. Шелл psql точно также выполняет каждый отдельный insert в режиме autocommit, ровно так, как это определено стандартом. Вот в pgadmin набор инструкций по щучьему веленью заворачивается в транзакцию, но это личное дело упомянутого клиента.

Возможно. В любом случае, после упомянутого оборачивания набора инструкций в транзакцию (в коде скрипта через BEGIN TRAN...COMMIT, как показано выше) скорость прогона этого скрипта в psql не изменяется, а в sqlite3 вырастает минимум на два порядка.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как увеличить скорость вставки большого числа INSERT в SQLite / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]