parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Особенности sqlite

Maxx 15.06.2009 22:49 / 15.06.2009 23:02

@main[]
^connect[sqlite://:temporary:?autocommit=1]{
  ^void:sql{
    DROP TABLE IF EXISTS mss
  }
  ^void:sql{
    CREATE TABLE IF NOT EXISTS mss (id int,mess text)
  }
	
  ^for[i](1;200){
    ^void:sql{
      INSERT INTO mss (id,mess) VALUES
     ('^math:random(2000000)','^math:md5[^math:random(2000000)]')
    }
  }
}
Этот код выполняется на моем компе (ms vista,c2d e8400, 2gb) примерно 4 секунды, аналогичный код для mysql - 0,03. Происходит так потому, что sqlite после каждого COMMIT закрывает файл, а перед следующим запросом (BEGIN) открывает, что на винде сказывается на производительности фатальным образом (слышал, что на *nix по-другому, но неначем проверить). Если количество итераций сделать 20000, то всё совсем печально - парсер ведет себя загадочно, несколько минут (~8-10) пишет в базу, а потом самоликвидируется без каких-либо ошибок и результатов, т.е. браузер продолжает ждать еще, пока сам не отвалится по таймауту.

Лечится это просто - указываем в строке подключения autocommit=0, после чего вышеуказанный запрос выполняется за 0.05 сек, а в случае с 20000 строк - за 0.75 сек, кстати, примерно 4 раза быстрее, чем mysql-аналог (но там можно оптимизнуть просто поменяв на multi-insert, а не циклом перебирать).

Написал это, на случай, если кому-нибудь потом придется с этим столкнуться (ну и с "самоликвидацией" парсера бы разобраться).

Может для sqlite драйвера autocommit=0 сделать по умолчанию?