Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Борис Гаркун Member Откуда: Лермонтов Сообщений: 250 |
Здравствуйте! Есть запрос: SELECT s6.* , st.col_tip_pokazanij FROM temp_so6_09 s6 LEFT JOIN temp_so1_09 st -- тип показаний ON st.link = (SELECT TOP 1 s.link FROM temp_so1_09 s WHERE (s.col_pl_kod = s6.col_ob_pl_kod OR s.col_dogovor = s6.col_ob_pl_kod ) AND s.col34 = s6.col_nomer_pu AND s.col_tip_pokazanij IS NOT NULL ORDER BY s.col14 DESC) , который медленно работает. Можно ли ускорить этот запрос? Сообщение было отредактировано: 1 ноя 19, 12:53 |
1 ноя 19, 12:47 [22008024] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Проанализировать план выполнения, найти проблемные места, устранить. Как-то так. |
1 ноя 19, 12:50 [22008027] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
create index ... on temp_so1_09 (col_nomer_pu, col14) include (col_pl_kod, col_dogovor, col_tip_pokazanij, link) |
||
1 ноя 19, 13:23 [22008082] Ответить | Цитировать Сообщить модератору |
Борис Гаркун Member Откуда: Лермонтов Сообщений: 250 |
Спасибо. Вы наверно имели в виду такой create index ... on temp_so1_09 (col34, col14) include (col_pl_kod, col_dogovor, col_tip_pokazanij, link) ? |
||||
1 ноя 19, 14:53 [22008171] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
Борис Гаркун, Да, col34 |
1 ноя 19, 15:10 [22008180] Ответить | Цитировать Сообщить модератору |
Mind Member Откуда: Лучший город на Земле Сообщений: 2322 |
Борис Гаркун, Попробуйте развернуть OR в UNION ALL. Получится громоздко, но возможно быстрее, если есть правильные индексы. Ну а вообще, как уже сказали, надо смотреть план. |
1 ноя 19, 22:15 [22008521] Ответить | Цитировать Сообщить модератору |
Владимир Затуливетер Member Откуда: Сообщений: 427 |
Для вашей версии запроса:create index IDX1 on temp_so1_09 ( col34, col14 ) include ( col_pl_kod, col_dogovor, col_tip_pokazanij, link ) where col_tip_pokazanij is not null go create index IDX2 on temp_so1_09 ( link ) include ( col_tip_pokazanij ) go |
4 ноя 19, 19:29 [22009507] Ответить | Цитировать Сообщить модератору |
Владимир Затуливетер Member Откуда: Сообщений: 427 |
Для версии с развернутым "OR":select s6.* , st.col_tip_pokazanij from temp_so6_09 as s6 cross apply ( select top 1 t.link from ( select top 1 s.link, col14 from temp_so1_09 as s where s.col_pl_kod = s6.col_ob_pl_kod and s.col34 = s6.col_nomer_pu and s.col_tip_pokazanij is not null order by s.col14 desc union all select top 1 s.link, col14 from temp_so1_09 as s where s.col_dogovor = s6.col_ob_pl_kod and s.col34 = s6.col_nomer_pu and s.col_tip_pokazanij is not null order by s.col14 desc ) t order by t.col14 desc ) left join temp_so1_09 as st on st.link = t.link go create index IDX1 on temp_so1_09 ( link ) include ( col_tip_pokazanij ) go create index IDX2 on temp_so1_09 ( col34, col_dogovor, col14 ) include ( col_tip_pokazanij, link ) where col_tip_pokazanij is not null go create index IDX3 on temp_so1_09 ( col34, col_pl_kod, col14 ) include ( col_tip_pokazanij, link ) where col_tip_pokazanij is not null go если ничего не напутал... :) |
4 ноя 19, 19:31 [22009510] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4407 |
У тебя сразу бросается в глаза корреллированный подзапрос. Попытаться для начала от него избавиться. И, ты бы, того, чтя здешние рекомендации, закинул бы create table ... insert into ... |
4 ноя 19, 20:12 [22009523] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Сообщение было отредактировано: 4 ноя 19, 22:43 |
||||
4 ноя 19, 22:41 [22009571] Ответить | Цитировать Сообщить модератору |
Gerros Member Откуда: Харьков Сообщений: 508 |
--Если temp_so1_09.link уникален для каждой строки из temp_so6_09: SELECT s6.* , ( SELECT TOP 1 col_tip_pokazanij FROM temp_so1_09 s -- тип показаний WHERE (s.col_pl_kod = s6.col_ob_pl_kod OR s.col_dogovor = s6.col_ob_pl_kod) AND s.col34 = s6.col_nomer_pu AND s.col_tip_pokazanij IS NOT NULL ORDER BY s.col14 DESC) FROM temp_so6_09 s6 --Порядок полей в индексе доработать напильником: create nonclusterd index XXX on temp_so1_09( col14, col_pl_kod, col_dogovor, col34, col_tip_pokazanij) desc |
||||
5 ноя 19, 00:45 [22009632] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4407 |
Сообщение было отредактировано: 5 ноя 19, 13:27 |
|
5 ноя 19, 13:21 [22009906] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |