С помощью следующего кода:
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL);
for (int i=0; (row=rows[i]).id != NULL; i ++) {
if (i == 100000) break;
asprintf(&query, "insert into Sales1M (id, date, instance_id, territory_id, code, price, currency_code_id, price_in_usd)"
"values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');",
row.id, row.date, row.instance_id, row.territory_id, row.code, row.price, row.currency_code_id, row.price_in_usd);
rc = sqlite3_exec(db, query, NULL, NULL, &error_msg);
}
sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, NULL);
InsertSQL: 0.384135s для выполнения вставки 100K.
Однако, если я удаляю BEGIN TRANSACTION...
,вставки почти в 100 раз медленнее:
InsertSQL: 4.592789 для выполнения вставок 100K.
Почему это так?
Автоматически ли SQLite выполняет BEGIN...COMMIT
как оболочка для команды sqlite3_exec
, если ожидающий TRANSACTION
еще не установлен?Или, почему это занимает так много времени без явного начала / принятия в транзакции?