Более быстрый объем вставляет в sqlite3?

Ошибка анализа: синтаксическая ошибка, неожиданная '['

Эта ошибка возникает в двух вариантах:

Вариант 1

$arr = [1, 2, 3];

Синтаксис инициализатора этого массива был введен только в PHP 5.4; это приведет к возникновению ошибки парсера в версиях до этого. Если возможно, обновите свою установку или используйте старый синтаксис:

$arr = array(1, 2, 3);

См. Также этот пример из руководства.

Вариант 2

$suffix = explode(',', 'foo,bar')[1];

Результаты функции разыменования массива также были введены в PHP 5.4. Если обновление невозможно, вам нужно использовать временную переменную:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

См. Также этот пример из руководства.

40
задан Alexander Farber 27 August 2015 в 16:51
поделиться

8 ответов

Можно также попробовать тонкая настройка нескольких параметров для вытаскивания дополнительной скорости из него. Конкретно Вы, вероятно, хотите PRAGMA synchronous = OFF;.

20
ответ дан 27 November 2019 в 01:02
поделиться
  • обертка, которую все ВСТАВЛЯЕТ в транзакцию, даже если существует отдельный пользователь, это намного быстрее.
  • использование подготовило операторы.
57
ответ дан Javier 27 November 2019 в 01:02
поделиться
  • Увеличение PRAGMA default_cache_size к намного большему числу. Это увеличит число страниц, кэшируемых в памяти.

  • Обертка все вставляет в единственную транзакцию, а не одну транзакцию на строку.

  • Использование скомпилировало SQL-операторы, чтобы сделать вставки.
  • Наконец, как уже упомянуто, при необходимости воздерживаются от полного соответствия ACID, устанавливают PRAGMA synchronous = OFF;.
18
ответ дан paxos1977 27 November 2019 в 01:02
поделиться

В зависимости от размера данных и суммы доступной RAM, одно из лучшего увеличения производительности произойдет путем установки sqlite для использования базы данных все-в оперативной памяти вместо того, чтобы писать в диск.

Для баз данных в оперативной памяти, передайте ПУСТОЙ УКАЗАТЕЛЬ как аргумент имени файла sqlite3_open, и удостоверяются, что TEMP_STORE определяется соответственно

(Весь вышеупомянутый текст извлечен от моего собственного ответа до отдельный sqlite-связанный вопрос )

3
ответ дан Community 27 November 2019 в 01:02
поделиться

Вы хотите использовать .import команда. Например:

$ cat demotab.txt
44      92
35      94
43      94
195     49
66      28
135     93
135     91
67      84
135     94

$ echo "create table mytable (col1 int, col2 int);" | sqlite3 foo.sqlite
$ echo ".import demotab.txt mytable"  | sqlite3 foo.sqlite

$ sqlite3 foo.sqlite
-- Loading resources from /Users/ramanujan/.sqliterc
SQLite version 3.6.6.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from mytable;
col1    col2
44      92
35      94
43      94
195     49
66      28
135     93
135     91
67      84
135     94

Обратите внимание, что эта команда массовой загрузки не SQL, а пользовательская функция SQLite. Как таковой, он имеет странный синтаксис, потому что мы передаем его через echo интерактивному интерпретатору командной строки, sqlite3 .

В PostgreSQL эквивалентом является COPY FROM : http://www.postgresql.org/docs/8.1/static/sql-copy.html

В MySQL это ЛОКАЛЬНЫЙ ИНФИЛЬ ЗАГРУЗКИ ДАННЫХ : http://dev.mysql.com/doc/refman/5.1/ru/load-data.html

И последнее: не забывайте соблюдать осторожность со значением .separator . Это очень распространенная ошибка при массовых вставках.

sqlite> .show .separator
     echo: off
  explain: off
  headers: on
     mode: list
nullvalue: ""
   output: stdout
separator: "\t"
    width:

Вы должны явно установить разделитель в качестве пробела, табуляции или запятой перед выполнением .import .

35
ответ дан 27 November 2019 в 01:02
поделиться

Если вы просто вставляете один раз, у меня может быть грязный трюк для вас.

Идея проста: сначала вставить в базу данных памяти, затем сделать резервную копию и, наконец, восстановить исходный файл базы данных.

Я написал подробные шаги в моем блоге. :)

.
0
ответ дан 27 November 2019 в 01:02
поделиться

Нет возможности наборов вставки, но Есть способ написать большие куски в память, затем примите их к база данных. Для API C / C ++ просто делай:

SQLite3_Exec (DB, «Начать транзакцию», NULL, NULL, NULL);

... (Вставить утверждения)

SQLite3_Exec (DB, «Commit Transaction», NULL, NULL, NULL);

Предполагая, что DB - ваш указатель базы данных.

5
ответ дан 27 November 2019 в 01:02
поделиться

RE: «Есть ли более быстрый способ создания операторов вставки для каждой строки данных?»

Во-первых: сократите его до 2 операторов SQL, используя Sqlite3 API виртуальных таблиц , например.

create virtual table vtYourDataset using yourModule;
-- Bulk insert
insert into yourTargetTable (x, y, z)
select x, y, z from vtYourDataset;

Идея заключается в том, что вы реализуете интерфейс C, который считывает ваш исходный набор данных и представляет его в SQlite как виртуальную таблицу, а затем вы выполняете SQL-копию из исходной таблицы в целевую за один раз. Это звучит сложнее, чем есть на самом деле, и таким образом я измерил огромные улучшения скорости.

Во-вторых: воспользуйтесь другим советом, приведенным здесь, то есть настройками прагмы и использованием транзакции.

В-третьих: возможно, посмотрите, сможете ли вы избавиться от некоторых индексов целевой таблицы. Таким образом, sqlite будет иметь меньше индексов для обновления для каждой вставленной строки

10
ответ дан 27 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: