![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 19.10.2024
Сообщений: 5
|
![]()
Здравствуйте! Представлена часть sql запроса с временными таблицами. Сначала формируются таблицы sent, deliv , undeliv. И в конце в итоговой таблице "res" , которая объединяет в себе эти три таблицы, считается количество записей в этих таблицах.
1. Можно ли эти таблицы как-то объединить в целях оптимизации? Они между собой отличаются только по одному условию a.response_test. 2. Насколько сильно влияет на скорость обработки запроса объединение по двум полям одной таблицы с идентичными полями другой таблицы? Например, "left join sent t11 on t11.task_id = t1.task_id AND t1.person_pin = t11.person_pin" 3. Как можно вывести все поля таблицы res с сортировкой по полям более оптимально, не создавая новый запрос?(см последний запрос). Можно ли последний запрос в "res" "впихнуть"?: sent as (select distinct a.task_id, a.person_pin, 'sent' as sent from com.responses a join all_cont b on a.task_id = b.task_id AND a.person_pin = b.person_pin and a.status = 'sent' and a.response_test >= current_date-20 ), deliv as (select distinct a.task_id, a.person_pin, 'deliv' as deliv from com.responses a join all_cont b on a.task_id = b.task_id AND a.person_pin = b.person_pin and a.status = 'deliv1' and a.response_test >= current_date-20 ), undeliv as (select distinct a.task_id, a.person_pin, 'undeliv' as undeliv from com.responses a join all_cont b on a.task_id = b.task_id AND a.person_pin = b.person_pin and a.status not in ('deliv1','sent') and a.response_test >= current_date-20 ), res as (select t1.contact_dt, t1.camp, t1.sender_email, t1.contact_status, t1.test, count(t1.task_id) as planned, count(t11.task_id) as sent, count(t2.deliv) as deliv, count(t3.undeliv) as undeliv, count(t4.read) as read from all_cont t1 left join sent t11 on t11.task_id = t1.task_id AND t1.person_pin = t11.person_pin left join deliv t2 on t2.task_id = t1.task_id AND t1.person_pin = t2.person_pin left join undeliv t3 on t3.task_id = t1.task_id AND t1.person_pin = t3.person_pin group by t1.contact_dt, t1.camp, t1.sender_email, t1.contact_status, t1.test ) select * from res order by contact_dt desc, camp, draft_id,contact_status, test |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Код:
программа — запись алгоритма на языке понятном транслятору
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 19.10.2024
Сообщений: 5
|
![]()
Спасибо Вам большое за помощь!
А здесь «count(distinct task_id), count(distinct sent_id), …» не нужно в скобках указывать таблицу? Вот так: «count(distinct t1.task_id), count(distinct t11.send_id), …» И затем джойны в конце указать? «… left join sent t11 on t11.task_id = t1.task_id AND t1.person_pin = t11.person_pin …..» Не совсем понятно, как выбирается поле нужной нам таблицы |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]()
имя таблцы требуется в случае повтора имен в используемых таблицах, здесь этого нет..
мы используем уникальные имена (точнее алиасы ) sent_id, deliv_id, undeliv_id, ... . p.s. по крайней мере в моем варианте.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 20.10.2024 в 18:41. |
![]() |
![]() |
![]() |
#5 |
Регистрация: 19.10.2024
Сообщений: 5
|
![]()
Не знаю как, но результаты сошлись, на 3 минуты быстрее провелся запрос))
Спасибо |
![]() |
![]() |
![]() |
#6 |
Регистрация: 19.10.2024
Сообщений: 5
|
![]()
Здравствуйте! Возник еще один небольшой вопрос по тому же запросу. Допустим, вместо условия "a.status not in ('deliv1','sent')" в третьей временной таблице "undeliv" будет условие с подзапросом "b.task_id NOT IN (SELECT task_id FROM deliv)". То есть в данном подзапросе идет обращение к одной из временных таблиц. Как в данном случае будет лучше прописать это в запросе? Если прописать саму временную таблицу deliv, то грузит 10 минут....
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 19.10.2024
Сообщений: 5
|
![]()
evg_m, Здравствуйте! Возник еще один небольшой вопрос по тому же запросу. Допустим, вместо условия "a.status not in ('deliv1','sent')" в третьей временной таблице "undeliv" будет условие с подзапросом "b.task_id NOT IN (SELECT task_id FROM deliv)". То есть в данном подзапросе идет обращение к одной из временных таблиц. Как в данном случае будет лучше прописать это в запросе? Если прописать саму временную таблицу deliv, то грузит 10 минут....
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]()
может быть так
Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 24.10.2024 в 09:28. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Оптимизация запроса | nactyx | SQL, базы данных | 4 | 08.08.2019 10:56 |
Оптимизация запроса. | EnMac | SQL, базы данных | 20 | 15.04.2015 15:11 |
Оптимизация запроса not in (select ... | sanich_23 | SQL, базы данных | 6 | 07.11.2014 02:56 |
Оптимизация запроса | stalsoft | SQL, базы данных | 0 | 05.07.2011 14:51 |
Оптимизация SQL запроса | Phantom | SQL, базы данных | 4 | 24.09.2009 16:07 |