Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Тормоза SQLite (DISQLite3) / 5 сообщений из 5, страница 1 из 1
31.10.2014, 21:13
    #38793403
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза SQLite (DISQLite3)
Здравствуйте. Есть следующая ситуация:
Delphi, DISQLite3 5.5 (SQLite 3.7.2 вроде), размер БД около 150мб. Внутри БД несколько таблиц, одна из которых наибольшая и имеет следующий формат:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE "client_graphs" (
"client_id"  INTEGER(11) NOT NULL,
"graph_type"  INTEGER(11) NOT NULL,
"start_time"  INTEGER(11) NOT NULL,
"received"  INTEGER(20) NOT NULL,
"sended"  INTEGER(20) NOT NULL,
PRIMARY KEY ("client_id", "graph_type", "start_time")
);

CREATE INDEX "client_graphtype"
ON "client_graphs" ("client_id", "graph_type");



В таблице около 2 000 000 записей. С БД работает только один процесс(приложение). БД лежит локально на диске, проц не загружен, ОЗУ хватает и тд...
Размер страницы 4096 байт, кеш 50 000 страниц. Синхронизация отключена (PRAGMA synchronize = OFF). БД не повреждена.

Запрос
Код: sql
1.
SELECT * FROM client_graphs WHERE client_id = xxx AND graph_type = yyy;

возвращает до 1600 записей и выполняется не более 10мс. Всё вроде супер. Но...
В один прекрасный момент эти же запросы начинают выполнятся за 300мс. Можно параллельно открыть БД админкой и выполнить этот же запрос, 300+ мс. Помогает рестарт приложения, один раз без рестарта самого приложения админкой сделал REINDEX . Тоже помогло.

Проблема точно не в приложении. Что-то случается с БД, не знаю, может сам модуль работы с БД изменяет режим работы, блокировок хз... Может индексы повреждаются, хотя не понятно почему.
Тупить начинает всегда с утра. Единственное на что грешу, ночью файл БД копируется дополнительным потоком. Но поток точно завершается удачно и файл закрывает. Тоесть файл на момент тормозов открыть только одним процессом.

У кого много опыта, может есть какие идеи куда копнуть? :) Большое спасибо.
...
Рейтинг: 0 / 0
31.10.2014, 21:56
    #38793420
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза SQLite (DISQLite3)
Во первых, типы данных integer(11), integer(20) это что-то совершенно новое и никому не известное. Ни одна СУБД, включая SQLite не знает такой тип данных.
Во вторых, PRAGMA synchronize = OFF не существует.

Первое в общем-то ни на что не влияет, так что можно пропустить. Хотя глаз царапает и вводит в сомнения относительно качества всего остального кода.
Второе означает что полный synchronous режим у тебя остался включенным, но он тоже не влияет на скорость чтения из базы. Он влияет только на скорость записи в базу.

Вывод: проблема в приложении.
Если у тебя запрос возвращает 1600 записей, эти 1600 попадают в какую-то память, как-то обрабатываются, куда-то пересылаются, память под них выделяется и убивается... Мест для тормозов просто миллиарды.
...
Рейтинг: 0 / 0
31.10.2014, 22:29
    #38793439
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза SQLite (DISQLite3)
White OwlВо первых, типы данных integer(11), integer(20) это что-то совершенно новое и никому не известное. Ни одна СУБД, включая SQLite не знает такой тип данных.
Во вторых, PRAGMA synchronize = OFF не существует.
Опечатался. Synchronous . Типы данных такие создал Navicat, но они всё равно игнорятся и сути это не меняет.

White OwlВывод: проблема в приложении.
Если у тебя запрос возвращает 1600 записей, эти 1600 попадают в какую-то память, как-то обрабатываются, куда-то пересылаются, память под них выделяется и убивается... Мест для тормозов просто миллиарды.
Нет, не в приложении. Замеряю время именно запроса, без излишнего кода. Да и параллельный запрос админкой даёт такое же время.

Я предполагаю следующий сценарий:
Второй поток открывает файл БД для копирования (в каком режиме не знаю, но предполагаю что только для чтения), в момент копирования приложение продолжает работать с БД включая запись. Никаких ошибок не возникает. Вот этот момент мне не совсем понятен. Как его разруливает ОС? Тоесть они не поочереди блочат файл, как это делает модуль SQLite, а именно используют его одновременно. И вот тут, возможно, что-то меняется...

Отключил копирование, если завтра с утра глюк не воспроизведётся, возможно, подозрения оправданы :)
...
Рейтинг: 0 / 0
14.01.2015, 11:30
    #38853911
Kahanho0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза SQLite (DISQLite3)
Привет всем
проблема с запросом , иногда переменные бывают нуль , не 0 а вобще нечего. Тогда база игнорирует запрос .

_________________
lab gaya
...
Рейтинг: 0 / 0
14.01.2015, 11:41
    #38853925
Тормоза SQLite (DISQLite3)
в каком смысле - игнорирует?
но в целом, сравнение с NULL-ом должно делаться только через IS [NOT] NULL. в противном случае результат сравнения всегда будет N/A, соответственно, запрос может не возвращать данных, либо возвращать не совсем ожидаемый результат.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Тормоза SQLite (DISQLite3) / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]