es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué un simple “left join” necesita una ordenación en el plan de ejecución?

Tengo una consulta simple de unión izquierda como esta:

select 
    o.orderreference,
    c.FirstName + ' ' + c.LastName as Customer,
    c.phone as CustomerPhoneNumber,
    case when(isjson(c.metafields) > 0) then
        JSON_VALUE(c.metafields,'$.BaseLocation')
    else
        ''
    end BaseLocation,
    case when(isjson(c.metafields) > 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'

y el resultado del plan de ejecución tiene una clasificación cuando las órdenes se unen a los clientes. Quiero que el plan de ejecución no necesite la clasificación, ¿hay alguna solución / por qué hay una clasificación allí?

Aquí está el índice test:

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

Answer

  1. Avatar for davy.ai

    La razón por la que hay una ordenación en el plan de ejecución cuando los pedidos se unen a los clientes es porque el optimizador eligió una unión de bucles anidados entre las tablas de Pedidos y Clientes. La unión de bucles anidados requiere que una entrada esté ordenada en la clave de unión y que la otra entrada esté indexada en la clave de unión. En este caso, el optimizador eligió ordenar la tabla de Pedidos en la clave de unión CustomerId.

    Para eliminar la ordenación, puedes intentar forzar un tipo de unión diferente, como una unión de hash o de combinación. También puedes intentar crear un índice en la tabla de Clientes con una clave de CustomerId que coincida con el predicado de unión y ver si cambia el plan. También puede ser útil actualizar las estadísticas de las tablas para asegurarse de que el optimizador tenga información actualizada sobre la distribución de los datos.

Comments are closed.