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

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

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

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

Ровно так, как определено в стандарте. Прочитайте _хоть что-нибудь_ про SQL, все равно, какой версии.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки большого числа INSERT в SQLite
    #36163226
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как увеличить скорость вставки большого числа INSERT в SQLite
    #36213087
Oleg Zhovtanyuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже столкнулся - 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
Как увеличить скорость вставки большого числа INSERT в SQLite
    #36213825
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Oleg Zhovtanyuk
То есть по умолчанию SQLite настроен на синхронный доступ к диску. А каждый INSERT неявно оборачивается в транзакцию (в отличие от psql, которому хватает мозгов сделать одну транзакцию на скрипт), что и дает большой оверхед.

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

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

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


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