powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite периодически виснет на выполнении запроса, почему?
7 сообщений из 7, страница 1 из 1
Sqlite периодически виснет на выполнении запроса, почему?
    #38356883
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток форумчанам!

Я на вашем форуме новичек и с sqlite работаю не так давно.

Есть запрос, который по непонятным мне причинам работает то быстро, то очень тормозит, причем такое поведение наблюдается и из консоли и из приложения (приложение пишу на qt).

Собственно вопрос, почему?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT parameter.id, 
           parameter.parameter_id, 
           parameter.hash, 
           parameter.name_display, 
           object_status.type_name 
FROM parameter, object_status 
WHERE exists (SELECT * FROM parameter_history 
                    WHERE parameter_history.parameter_id = parameter.id 
                    AND parameter_history.date_time 
                    BETWEEN '2013-07-21 00:00:00' AND '2013-08-06 00:00:00') 
AND parameter.device_id = 12 AND object_status.id = parameter.status_id;



Таблицы, с которыми ведется работа:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
CREATE TABLE IF NOT EXISTS object_status(
id INTEGER PRIMARY KEY AUTOINCREMENT,
type_name VARCHAR(30) NOT NULL
);

CREATE TABLE IF NOT EXISTS parameter(
id INTEGER PRIMARY KEY AUTOINCREMENT,
parameter_id INTEGER NOT NULL,
hash VARCHAR(256) NOT NULL,
name_display VARCHAR(30),
device_id INTEGER NOT NULL,
status_id INTEGER NOT NULL,
FOREIGN KEY(device_id) REFERENCES device(id),
FOREIGN KEY(status_id) REFERENCES object_status(id)
);

CREATE INDEX IF NOT EXISTS param_deviceid_index 
ON parameter(device_id);

CREATE INDEX IF NOT EXISTS parame_hash_index 
ON parameter(hash);

CREATE INDEX IF NOT EXISTS param_paramid_index 
ON parameter(parameter_id);

CREATE TABLE IF NOT EXISTS parameter_history(
id INTEGER PRIMARY KEY AUTOINCREMENT,
date_time TEXT NOT NULL,
value TEXT,
alias TEXT,
avary_level INTEGER,
text1 TEXT,
text2 TEXT,
parameter_id INTEGER NOT NULL,
reason_id INTEGER NOT NULL,
FOREIGN KEY(parameter_id) REFERENCES parameter(id),
FOREIGN KEY(reason_id) REFERENCES history_reason(id)
);

CREATE INDEX IF NOT EXISTS param_history_paramid_index 
ON parameter_history(parameter_id);

CREATE INDEX IF NOT EXISTS param_history_datetime_index 
ON parameter_history(date_time);



настройки базы:
Код: sql
1.
2.
3.
4.
5.
6.
PRAGMA encoding = "UTF-8";
PRAGMA foreign_keys = 1;
PRAGMA count_changes = 0;
PRAGMA temp_store = MEMORY;
PRAGMA cache_size = 13000;
PRAGMA synchronous = 1;



буду признательна за пояснение причины такого поведения.
...
Рейтинг: 0 / 0
Sqlite периодически виснет на выполнении запроса, почему?
    #38357277
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JosefinaЕсть запрос, который по непонятным мне причинам работает то быстро, то очень тормозит, причем такое поведение наблюдается и из консоли и из приложения (приложение пишу на qt).
Перезагрузи машину. Запусти запрос.
Если первый раз запрос выполняется медленно а второй и третий быстро (а сотый раз может быть опять медленным). То это будет виноват кэш. Лечить оптимизацией запроса и добавлением памяти.
Если зависимости "медленный-быстрый-быстрый...." не наблюдается и самый первый запрос тоже бывает быстрым. Значит виноваты сторонние приложения (типа вирусов-антивирусов-браузеров-бекаперов), которые жадны до физических ресурсов и отжирают память-процессор не давая работать СУБД. Лечить отслеживанием что начало работать когда запрос тормозит и выкидыванием этого процесса.

Проблемы с запросом по причине самого запроса обычно проявляются в виде постоянных тормозов.
...
Рейтинг: 0 / 0
Sqlite периодически виснет на выполнении запроса, почему?
    #38357566
wamaco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Josefina,

Попробуй использовать транзакции. Очень помогает для Sqlite.
...
Рейтинг: 0 / 0
Sqlite периодически виснет на выполнении запроса, почему?
    #38357766
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо большое за ответы)

White Owl, сейчас буду пробовать..

wamaco, все делаю через транзакции!
...
Рейтинг: 0 / 0
Sqlite периодически виснет на выполнении запроса, почему?
    #38363019
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена )

После перезагрузки компьютера стало понятно, что первый раз запрос выполняется оч долго, а дальше опять-таки почему-то рандомно по времени.

Решила посмотреть используются ли предусмотренные индексы и посмотрев план выполнения запроса, я поняла, что индекс по дате не выполняется. Для данного запроса его нужно было написать вот так:

Код: sql
1.
2.
CREATE INDEX IF NOT EXISTS param_history_paramid_and_date_index 
ON parameter_history(parameter_id, date_time);



Запрос стал выполняться за миллисекунды, ура-ура)
...
Рейтинг: 0 / 0
Sqlite периодически виснет на выполнении запроса, почему?
    #38365521
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Josefina,

* status_id у вас внешний кей и без индекса. это так задумано?
* parameter.device_id = 12 тут всегда константа?

не пробовали построить составной индекс по этим двум полям вытащив более селективное в начало
по идее это сократит выборку по базовому джойну и уменьшит кол-во под запросов к exists()

parame_hash_index вероятно создан для других запросов?
но если он не используется лучше удалить - тратит диск и время на перестройку.
...
Рейтинг: 0 / 0
Sqlite периодически виснет на выполнении запроса, почему?
    #38382440
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPA

status_id - да, без индекса... читала в статьях, что если внешний ключ принимает несколько повторяющихся значений, то делать по нему внешний ключ не нужно. Это поле может принимать только 6 значений и не более того.

parameter.device_id = 12 - нет, конечно, это для примера написан запрос... сюда значения device_id подставляются последовательно и запрос повторяется для каждого устройства.

Составной индекс по этим полям делать не пробовала, попробую )))

Значение промежутка дат так же не постоянно, оно задается с интерфейса приложения.

parame_hash_index надо удалить, вы правы.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite периодически виснет на выполнении запроса, почему?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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