Почему простое левое соединение нуждается в сортировке в плане выполнения?

#sql #sql-server #sql-execution-plan

Вопрос:

У меня есть простой запрос на левое соединение, подобный этому

 select   o.orderreference,   c.FirstName   ' '   c.LastName as Customer,  c.phone as CustomerPhoneNumber,  case when(isjson(c.metafields) gt; 0) then  JSON_VALUE(c.metafields,'$.BaseLocation')  else  ''  end BaseLocation,  case when(isjson(c.metafields) gt; 0) then  JSON_VALUE(c.metafields,'$.CostCenter')  else  ''  end CostCenter,  c.email as Email,  c.AcceptsMarketing,  outlets.Name outletname,  registers.name registername,  concat(concat(users.firstname,' '), users.LastName) cashiername,  concat(concat(ser.firstname,' '), ser.LastName) servername from orders o with(index(test)) left join customers c  on o.CustomerId = c.CustomerId left join users   on users.UserId = o.CashierId left join users ser  on ser.UserId = o.serverid left join outlets  on outlets.outletid = o.OutletId left join registers  on registers.RegisterId = o.RegisterId where orderdate between '2019-07-01' and '2019-07-30'  

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

введите описание изображения здесь

Вот тест индекса

 create nonclustered index test on orders ([orderdate]) include (  [customerid], [OutletId],[OrderNumber],[OrderReference],[ServerId],[CashierId],[RegisterId])  

Комментарии:

1. покажите свой test индекс

2. @RoMEoMusTDiE Я отредактировал свой вопрос, добавив тест индекса

3. @AlwaysLearning Я отредактировал индекс test , добавил идентификатор клиента в поле «Включить», заказ стал поиском по индексу, а затем все еще сортировал перед присоединением к таблице «Клиенты».

4. Тестовый индекс отсортирован по orderdate , остальные столбцы включены в листовые данные, но не являются частью ключа индекса. Избегает ли он узла сортировки, если вместо этого вы индексируете ([orderdate], [customerid]) вместо этого?

5. «почему там есть род»? Потому что SQL Server решил выполнить объединение слиянием, и для этого требуется, чтобы входные данные были отсортированы по ключу. Одна сторона уже отсортирована, но ей нужно отсортировать другую