parserALT
Страницы форума: ← Назад | 1 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 600 | Дальше →

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

#1Maxx
15.06.09 22:49 / 23:02
www.parser.ru → | ответить → | в избранное →

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

@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 сделать по умолчанию?
#2Misha v.3
→ Maxx [#1] | 16.06.09 01:34
www.parser.ru → | ответить → | в избранное →

делать, чтобы поведение одного драйвера отличалось от остальных...

...и меняло стандартное поведение сервера мне не кажется разумным.
Страницы форума: ← Назад | 1 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 600 | Дальше →