Почему мой запрос в базе данных Sybase занимает слишком много времени? - PullRequest
0 голосов
/ 09 января 2020

Время выполнения моего запроса занимает около 27 минут. Я действительно не знаю, почему это так долго. Особенно у меня есть другой запрос с тем же выводом, но этот занимает всего 1,4 секунды. Я хочу знать, какова средняя разница между обоими запросами и почему первый выполняется так долго.

Первый, который занимает около 27 минут:

select ATTACHMENT_ID from PES_ESB_ATTACHMENT where ATTACHMENT_ID in(                                                                        
            select distinct ATTACHMENT_ID from PES_ESB_ATTACHMENT A 
                left outer join PES_ESB_SHIFTDOCUMENTATION SD on A.MOMENT=SD.ATTACHMENT_MOMENT 
                left outer join PES_ESB_SHIFTTASK T on A.MOMENT=T.ATTACHMENT_MOMENT
                where 
                                                                           SD.ATTACHMENT_MOMENT is null
                                                                          and 
                                                                           T.ATTACHMENT_MOMENT is null
                                                                          And ( 163697831 - A.MOMENT ) > 86400 
            )

Второй с 1,4 секунды:

select ATTACHMENT_ID from PES_ESB_ATTACHMENT where ATTACHMENT_ID in(                                                                        
            select ATTACHMENT_ID from (
                           select distinct ATTACHMENT_ID, A.MOMENT
                                           from PES_ESB_ATTACHMENT A 
                               left outer join PES_ESB_SHIFTDOCUMENTATION SD on A.MOMENT=SD.ATTACHMENT_MOMENT 
                               left outer join PES_ESB_SHIFTTASK T on A.MOMENT=T.ATTACHMENT_MOMENT
                               where 
                                                                                           SD.ATTACHMENT_MOMENT is null
                                                                                          and 
                                                                                           T.ATTACHMENT_MOMENT is null
                           )tbl1
            )
            and 
                           ( 163697831 - MOMENT ) > 86400

Как может быть такой большой разрыв?

1 Ответ

0 голосов
/ 09 января 2020

Легко. Во втором запросе есть дополнительный фильтр, доступный оптимизатору в самой внешней части запроса к PES_ESB_ATTACHMENT.

and ( 163697831 - MOMENT ) > 86400

Похоже, что это внутри запроса корреляции на длинной запрос. Это явно позволяет серверу сократить записи, которые он должен выполнять через коррелированный подзапрос.

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

...