Я создал SQL для создания и заполнения таблицы в большой существующей базе данных SQLite:
CREATE TABLE ...;
INSERT INTO ...;
INSERT INTO ...;
...
Затем отправили его в sqlite3. Независимо от того, каким образом я читаю команды (например, “sqlite3 db <create.sql” или “.read create.sql” в приглашении SQLite), выполнение каждой строки приближалось к секунде, хотя каждая строка состояла только из двух строки.
Что заставляет SQLite работать так медленно? Как я могу ускорить его?
Вы должны поместить список операторов INSERT в транзакцию:
BEGIN TRANSACTION;
CREATE TABLE ...;
INSERT INTO ...;
INSERT INTO ...;
...
COMMIT;
Это значительно сократит время выполнения.
inserts
могут быть медленными по целому ряду причин, таких как:
- индексы таблицы должны быть обновлены
- триггеры находятся на столе (маловероятно, если вы просто создаете таблицу)
- другая деятельность на сервере
- количество строк, передаваемых на сервер
Я бы рекомендовал объединить вставки в один запрос. Вы можете сделать это, используя insert... select
insert... select
insert... select
:
insert into table(col1, . . . coln)
select . . . union all
select . . . union all
. . .;
Если вы просто объявляете столбцы в таблице, вы можете объединить все это в один оператор:
create table xxx as
select . . . union all
select . . . union all
. . .;