Armsinglom
17-12-2020, 11:35
Добрый день.
Есть 2 таблицы (1. stend_monitoring 2.stand_status) в PSQL, примерно такого содержания:
num_stend stamp_ name_event
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
num_stend object_ name_status
1205 1 книга у читателя
2205 1 книга на складе
Необходим следующий select :
1) показать num_stend
2) по num_stend показать последнюю дату когда был "Контейнер изъят".
3) по num_stend показать последнюю дату когда был "Контейнер установлен".
4) по num_stend показать последнюю дату "Книга используется" после даты последнего события "Контейнер установлен".
5) по num_stend показать последнюю дату "Книга используется"
6) из второй таблицы (stand_status) нужен просто текущий name_status. (в таблице name_status постоянно обновляется, нужно просто забирать этот status)
7) Посчитать общее кол-во строк "Книга используется" после последнего события "Контейнер установлен"
Попытался сделать следующим образом:
SELECT t1.num_stend as номер_стенда, t3.stamp_ as Контейнер изъят, t1.stamp_ as Контейнер установлен, t2.stamp_ as Книга используется, t4.name_event as Состояние
FROM azt.stend_monitoring t1, azt.stend_monitoring t2, azt.stend_monitoring t3, azt.stand_status t4
where t1.num_stend = '2205'
and t1.name_event = 'Контейнер установлен'
and t2.num_stend = t1.num_stend
and t2.name_event = 'Книга используется'
and t2.stamp_ > t1.stamp_
and t3.num_stend = t1.num_stend
and t3.name_event = 'Контейнер изъят'
and t4.num_stend = t1.num_stend
and t4.object_ = 1
order by t1.id desc, t2.id desc, t3.id desc LIMIT 1
В принципе select отрабатывает, но за 9 секунд как то долговато но терпимо, а вот если я к ниму прикручиваю пункт. номер 7 (где нужно вывести общее кол-во строк), COUNT (*) и начинаю группировать GROUP BY .... то запрос уходит на 5-7 минут раздумий и я не дожидаясь результата отключаю его.
Можете помочь с оптимизацией запроса?
Есть 2 таблицы (1. stend_monitoring 2.stand_status) в PSQL, примерно такого содержания:
num_stend stamp_ name_event
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
num_stend object_ name_status
1205 1 книга у читателя
2205 1 книга на складе
Необходим следующий select :
1) показать num_stend
2) по num_stend показать последнюю дату когда был "Контейнер изъят".
3) по num_stend показать последнюю дату когда был "Контейнер установлен".
4) по num_stend показать последнюю дату "Книга используется" после даты последнего события "Контейнер установлен".
5) по num_stend показать последнюю дату "Книга используется"
6) из второй таблицы (stand_status) нужен просто текущий name_status. (в таблице name_status постоянно обновляется, нужно просто забирать этот status)
7) Посчитать общее кол-во строк "Книга используется" после последнего события "Контейнер установлен"
Попытался сделать следующим образом:
SELECT t1.num_stend as номер_стенда, t3.stamp_ as Контейнер изъят, t1.stamp_ as Контейнер установлен, t2.stamp_ as Книга используется, t4.name_event as Состояние
FROM azt.stend_monitoring t1, azt.stend_monitoring t2, azt.stend_monitoring t3, azt.stand_status t4
where t1.num_stend = '2205'
and t1.name_event = 'Контейнер установлен'
and t2.num_stend = t1.num_stend
and t2.name_event = 'Книга используется'
and t2.stamp_ > t1.stamp_
and t3.num_stend = t1.num_stend
and t3.name_event = 'Контейнер изъят'
and t4.num_stend = t1.num_stend
and t4.object_ = 1
order by t1.id desc, t2.id desc, t3.id desc LIMIT 1
В принципе select отрабатывает, но за 9 секунд как то долговато но терпимо, а вот если я к ниму прикручиваю пункт. номер 7 (где нужно вывести общее кол-во строк), COUNT (*) и начинаю группировать GROUP BY .... то запрос уходит на 5-7 минут раздумий и я не дожидаясь результата отключаю его.
Можете помочь с оптимизацией запроса?