Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как ускорить запрос?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
Здравствуйте!

Есть запрос:
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]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36499
Проанализировать план выполнения, найти проблемные места, устранить.
Как-то так.
1 ноя 19, 12:50    [22008027]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
invm
Member

Откуда: Москва
Сообщений: 8839
Борис Гаркун
Можно ли ускорить этот запрос?
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]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
invm
Борис Гаркун
Можно ли ускорить этот запрос?
create index ... on temp_so1_09 (col_nomer_pu, col14) include (col_pl_kod, col_dogovor, col_tip_pokazanij, link)

Спасибо.

Вы наверно имели в виду такой
create index ... on temp_so1_09 (col34, col14) include (col_pl_kod, col_dogovor, col_tip_pokazanij, link)

?
1 ноя 19, 14:53    [22008171]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
invm
Member

Откуда: Москва
Сообщений: 8839
Борис Гаркун,

Да, col34
1 ноя 19, 15:10    [22008180]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2302
Борис Гаркун,

Попробуйте развернуть OR в UNION ALL. Получится громоздко, но возможно быстрее, если есть правильные индексы. Ну а вообще, как уже сказали, надо смотреть план.
1 ноя 19, 22:15    [22008521]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 420
Для вашей версии запроса:
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]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 420
Для версии с развернутым "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]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
fkthat
Member

Откуда:
Сообщений: 1606
У тебя сразу бросается в глаза корреллированный подзапрос. Попытаться для начала от него избавиться. И, ты бы, того, чтя здешние рекомендации, закинул бы create table ... insert into ...
4 ноя 19, 20:12    [22009523]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36499
fkthat
У тебя сразу бросается в глаза корреллированный подзапрос. Попытаться для начала от него избавиться.
Не надо следствия ваших детских психологических травм, связанных с коррелированными подзапросами, превращать в якобы общепринятые рекомендации. При ответах уточняйте этот момент.

Сообщение было отредактировано: 4 ноя 19, 22:43
4 ноя 19, 22:41    [22009571]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 479
Гавриленко Сергей Алексеевич
Не надо следствия ваших детских психологических травм ... превращать в якобы общепринятые рекомендации.
Тогда так:
--Если 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]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
fkthat
Member

Откуда:
Сообщений: 1606
Модератор: Удалено.


Сообщение было отредактировано: 5 ноя 19, 13:27
5 ноя 19, 13:21    [22009906]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить