Как заставить SQLite работать быстрее с PRAGMA синхронным = OFF по умолчанию - PullRequest
5 голосов
/ 18 ноября 2010

Я только что создал новую базу данных SQLite из командной строки, и у меня есть соединение ODBC с базой данных SQLite.
Если я запускаю запросы, по умолчанию синхронизация кажется включенной, что действительно сильно снижает производительность INSERT.

Как мне установить для базы данных SQLite значение по умолчанию PRAGMA synchronous = OFF без необходимости отправлять команду SQL для этого? Могу ли я создать файл .INI или что-то для его включения?

Ответы [ 4 ]

10 голосов
/ 25 ноября 2010

К сожалению для всех, после того, как этот вопрос оставался на 6 дней, я наконец-то нашел ответ. SQLite ODBC драйвер , кажется, ответ.Если вы создаете DSN, он позволяет установить синхронизацию на «OFF» в настройках DSN.Очень удобно.

4 голосов
/ 24 ноября 2010

SQLite по умолчанию работает в ПОЛНОМ синхронном режиме. Там нет INI, ничего не менять, кроме как при подключении. Однако это необходимо установить только один раз за сеанс, поэтому вы можете изменить функцию подключения вашего проекта, добавив команду «PRAGMA synchronous = OFF» после подключения. Это был бы самый чистый и быстрый подход.

Но если вы действительно хотите, чтобы SQLite открыл базу данных с отключенной синхронизацией по умолчанию, вы можете перекомпилировать SQLite с другим значением по умолчанию.

Для текущей версии (3.7.3) найдите переменную safety_level в файле sqlite.c источника объединения SQLlite :

Изменение:

safety_level = 3;

Кому:

safety_level = 1;

(Да, это один из параметров оболочки.) В функции openDatabaseattachFunc, если хотите).


Если вам действительно нужно ускорить этот процесс, как указано в комментариях, вы будете как минимум рассматривать транзакции. В будущем это предпочтительное решение. Это может быть не самым простым или самым возможным (время все-таки ограничено), но это самый чистый, разумный и самый простой в обслуживании в долгосрочной перспективе. (Мне просто нужно было снять это с груди. Готово!)

2 голосов
/ 12 сентября 2014

В Java я использую следующий фрагмент метода getConnection. Поэтому, когда я получаю новое соединение, синхронный будет отключен.

    Connection con = DriverManager.getConnection("jdbc:sqlite:lms.db");        
    Statement st = con.createStatement();        
    String sql="PRAGMA synchronous=OFF";
    st.execute(sql);
0 голосов
/ 18 декабря 2018

Прошло много времени с момента последнего ответа в этой теме, но если кто-то вроде меня искал способ установить PRAGMA синхронный = ВЫКЛ, но не мог поддерживать соединение с SQLite (у меня есть свои причины);то, что я сделал, установил «PRAGMA синхронный = ВЫКЛ» в начале запроса, а затем делал обычные вещи потом, разделяя их точкой с запятой (;), вот так:

PRAGMA synchronous = OFF; INSERT INTO [...]

Не знаю, является ли это лучшей практикой, но она сработала для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...