Рассмотрим этот запрос:
select
map,line,pda,item,qty,qty_gift,pricelist,price,linevalue,vat,
vat_value,disc_perc,disc_value,dt_disc_value,netvalue,imp_qty,
imp_value,exp_qty,exp_value,price1,price2,price3,price4,
justification,notes
from appnameV2_Developer.dbo.pt
where exists (select 1 from [dbo].[dt] dt
where pt.map=dt.map and dt.pda=pt.pda and dt.canceled=0)
except
select
map,line,pda,item,qty,qty_gift,pricelist,price,linevalue,vat,
vat_value,disc_perc,disc_value,dt_disc_value,netvalue,imp_qty,
imp_value,exp_qty,exp_value,price1,price2,price3,price4,
justification,notes
from appnameV2_Developer_reporting.dbo.pt
Я сделал это, чтобы убедиться, что в одной и той же таблице (pt) нет различий между базой данных издателя репликации (appnameV2_Developer) и базой данных подписчиков (appnameV2_Developer_reporting).Конкретная статья репликации имеет полусоединение на dt.
dt - это таблица заголовка транзакции с PK (map, pda)
pt - это таблица с подробностями транзакции с PK (map, pda, line)
Вот план выполнения
Итак, у нас есть соединение с правым полу-объединением.Я ожидаю, что его результат будет упорядочен (map, pda, line).Но затем вызывается оператор сортировки (map, pda, line).
Почему происходит такая сортировка (или, точнее: почему данные еще не отсортированы по этой точке)?В оптимизаторе запросов отсутствует логика: «при объединении слиянием его выходные данные (все еще) сортируются по предикатам объединения»?Я что-то пропустил?