Я читал, что производительность оператора With
в некоторых случаях намного выше, чем у соединений. Однако при присоединении к varchars (обычно я этого избегаю) я увидел значительное улучшение скорости, когда заменил соединение на With
.
Например, у меня есть три таблицы, к которым я хочу присоединиться: Customer, CustomerNickname, Address
(не настоящий пример, но подойдет для вопроса)
Обычно я использую следующий запрос для получения данных:
select * from customer c
inner join address a on c.addressid = a.id
left join CustomerNickname cn on cn.originalname = c.name --name and original name are varchars
Если в этих таблицах много данных, производительность будет очень низкой из-за объединения varchar. Однако, если я заменю запрос на:
with Nicknames as (
select * from CustomerNickname
)
select * from customer c
inner join address a on c.addressid = a.id
left join Nicknames cn on cn.originalname = c.name
производительность значительно улучшится. В моем примере (здесь я его не добавлял, потому что таблиц слишком много) запрос ушел с минуты на секунду. Кроме того, я заметил в плане выполнения исходного запроса, что есть оператор SORT
со стоимостью 95%. Откуда это взялось?
Итак, два вопроса:
Почему With намного быстрее?
Откуда в плане выполнения берется оператор
SORT
.