Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
31.10.2014, 21:13
|
|||
---|---|---|---|
Тормоза SQLite (DISQLite3) |
|||
#18+
Здравствуйте. Есть следующая ситуация: Delphi, DISQLite3 5.5 (SQLite 3.7.2 вроде), размер БД около 150мб. Внутри БД несколько таблиц, одна из которых наибольшая и имеет следующий формат: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В таблице около 2 000 000 записей. С БД работает только один процесс(приложение). БД лежит локально на диске, проц не загружен, ОЗУ хватает и тд... Размер страницы 4096 байт, кеш 50 000 страниц. Синхронизация отключена (PRAGMA synchronize = OFF). БД не повреждена. Запрос Код: sql 1.
возвращает до 1600 записей и выполняется не более 10мс. Всё вроде супер. Но... В один прекрасный момент эти же запросы начинают выполнятся за 300мс. Можно параллельно открыть БД админкой и выполнить этот же запрос, 300+ мс. Помогает рестарт приложения, один раз без рестарта самого приложения админкой сделал REINDEX . Тоже помогло. Проблема точно не в приложении. Что-то случается с БД, не знаю, может сам модуль работы с БД изменяет режим работы, блокировок хз... Может индексы повреждаются, хотя не понятно почему. Тупить начинает всегда с утра. Единственное на что грешу, ночью файл БД копируется дополнительным потоком. Но поток точно завершается удачно и файл закрывает. Тоесть файл на момент тормозов открыть только одним процессом. У кого много опыта, может есть какие идеи куда копнуть? :) Большое спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2014, 21:56
|
|||
---|---|---|---|
Тормоза SQLite (DISQLite3) |
|||
#18+
Во первых, типы данных integer(11), integer(20) это что-то совершенно новое и никому не известное. Ни одна СУБД, включая SQLite не знает такой тип данных. Во вторых, PRAGMA synchronize = OFF не существует. Первое в общем-то ни на что не влияет, так что можно пропустить. Хотя глаз царапает и вводит в сомнения относительно качества всего остального кода. Второе означает что полный synchronous режим у тебя остался включенным, но он тоже не влияет на скорость чтения из базы. Он влияет только на скорость записи в базу. Вывод: проблема в приложении. Если у тебя запрос возвращает 1600 записей, эти 1600 попадают в какую-то память, как-то обрабатываются, куда-то пересылаются, память под них выделяется и убивается... Мест для тормозов просто миллиарды. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2014, 22:29
|
|||
---|---|---|---|
Тормоза SQLite (DISQLite3) |
|||
#18+
White OwlВо первых, типы данных integer(11), integer(20) это что-то совершенно новое и никому не известное. Ни одна СУБД, включая SQLite не знает такой тип данных. Во вторых, PRAGMA synchronize = OFF не существует. Опечатался. Synchronous . Типы данных такие создал Navicat, но они всё равно игнорятся и сути это не меняет. White OwlВывод: проблема в приложении. Если у тебя запрос возвращает 1600 записей, эти 1600 попадают в какую-то память, как-то обрабатываются, куда-то пересылаются, память под них выделяется и убивается... Мест для тормозов просто миллиарды. Нет, не в приложении. Замеряю время именно запроса, без излишнего кода. Да и параллельный запрос админкой даёт такое же время. Я предполагаю следующий сценарий: Второй поток открывает файл БД для копирования (в каком режиме не знаю, но предполагаю что только для чтения), в момент копирования приложение продолжает работать с БД включая запись. Никаких ошибок не возникает. Вот этот момент мне не совсем понятен. Как его разруливает ОС? Тоесть они не поочереди блочат файл, как это делает модуль SQLite, а именно используют его одновременно. И вот тут, возможно, что-то меняется... Отключил копирование, если завтра с утра глюк не воспроизведётся, возможно, подозрения оправданы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2015, 11:30
|
|||
---|---|---|---|
|
|||
Тормоза SQLite (DISQLite3) |
|||
#18+
Привет всем проблема с запросом , иногда переменные бывают нуль , не 0 а вобще нечего. Тогда база игнорирует запрос . _________________ lab gaya ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2015, 11:41
|
|||
---|---|---|---|
|
|||
Тормоза SQLite (DISQLite3) |
|||
#18+
в каком смысле - игнорирует? но в целом, сравнение с NULL-ом должно делаться только через IS [NOT] NULL. в противном случае результат сравнения всегда будет N/A, соответственно, запрос может не возвращать данных, либо возвращать не совсем ожидаемый результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=54&mobile=1&tid=2008718]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 175ms |
0 / 0 |