Consulta de ajuste con múltiples combinaciones

8

Tengo esta consulta ... 214 Ejecución / min, 44.42 Promedio de CPU (ms) ¿Hay alguna manera de hacerlo mucho más rápido?

SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM    unicas_config..applicationForm AF  
  INNER JOIN UNICAS_CONFIG.. AcademicInstitution AI
           ON AF.casid=AI.casid 
  INNER JOIN UNICAS_CONFIG..Organization O 
           ON O.academicInstitutionid=AI.id   
  INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
           ON asOrg.FormId=AF.id
  INNER JOIN  UNICAS_CONFIG..Program P
           ON P.AssociationOrgId=asOrg.Id and asOrg.OrganizationId=O.id AND AF.Id = 6286
  INNER JOIN  unicas_config..ReferenceData RD 
                 ON P.STATE = RD.ValueId AND RD.ValueAbbr ='US'
  INNER JOIN  unicas_config..ReferenceDataSet RS  
           ON RD.ReferenceSetId = RS.SetId AND RS.NAME = 'LK_States'

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Ahora esto si me divido en 2 consultas

select RD.ValueId, RD.id into #temp1
from   unicas_config..ReferenceData RD
INNER JOIN  unicas_config..ReferenceDataSet RS   ON RD.ReferenceSetId= RS.SetId AND RS.NAME= 'LK_States'
where RD.ValueAbbr='US';


SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM    unicas_config..applicationForm AF  
  INNER JOIN UNICAS_CONFIG.. AcademicInstitution AI
           ON AF.casid=AI.casid 
  INNER JOIN UNICAS_CONFIG..Organization O 
           ON O.academicInstitutionid=AI.id   
  INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
           ON asOrg.FormId=AF.id
  INNER JOIN  UNICAS_CONFIG..Program P
           ON P.AssociationOrgId=asOrg.Id and asOrg.OrganizationId=O.id AND AF.Id = 6286
  INNER JOIN    #temp1 RD ON P.STATE= RD.ValueId;

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

utilizando la consulta recomendada por Frisbee

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Utilizando Hash join

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

sebeid
fuente
¿Cuánto tiempo necesita ejecutar la consulta ahora? ¿Y por qué se ejecuta 200 veces por minuto? ¿Puede explicar la necesidad de guardar los resultados en una tabla temporal con tanta frecuencia?
ypercubeᵀᴹ
esta consulta está en un SP y la tabla temporal se usa en la siguiente consulta. Esta producción tiene alrededor de 20 K solicitud por minuto.
sebeid

Respuestas:

2

Pruébalo
Tienes algunas condiciones de unión (potencialmente) extraviadas

SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM       UNICAS_CONFIG..Organization O                 
INNER JOIN UNICAS_CONFIG..AcademicInstitution AI
            ON AI.id = O.academicInstitutionid        
INNER JOIN unicas_config..applicationForm AF
            ON AF.casid = AI.casid  
           AND AF.Id = 6286   
INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
            ON asOrg.FormId         = AF.id
           and asOrg.OrganizationId = O.id
INNER JOIN UNICAS_CONFIG..Program P
            ON P.AssociationOrgId = asOrg.Id 
INNER JOIN unicas_config..ReferenceData RD 
            ON RD.ValueId = P.STATE  
           AND RD.ValueAbbr ='US'
INNER JOIN unicas_config..ReferenceDataSet RS  
            ON RS.SetId = RD.ReferenceSetId   
           AND RS.NAME = 'LK_States'

Si #temp tiene índices, clasifique el que tenga más sentido

Si eso no mejora la respuesta, simplemente fuerce una combinación hash en todos.
Todavía use la selección en mi respuesta: agregue el HASH a la consulta anterior

INNER HASH JOIN
paparazzo
fuente
Intenté su consulta pero no hay mucha mejora. También sé que no se recomienda usar INNER Hash Join en Producción. Además, no entendí lo que quieres decir con "Todavía uso el select en mi respuesta"
sebeid
No hay muchas mejoras, ¿es eso algo malo? ¿No se recomienda usar INNER Hash Join en la producción? ¿De dónde has oído eso? ¿Por qué no lo intentas sonreír?
paparazzo
se agregó el plan de ejecución a ... esta consulta consume más CPU e IO en producción. basado en el número que
obtengo
stackoverflow.com/questions/800124/… .. pero lo intentaré y te lo haré saber. gracias
sebeid
AF.Id = 6286 no está codificado en la consulta, es un parámetro pasado al SP ... acabo de usar este número para las pruebas
sebeid
1

Intente crear el siguiente índice (suponiendo que no exista)

CREATE INDEX ix_Organization_academicInstitutionid
    ON Organization(academicInstitutionid, Id) INCLUDE (Name)
Kenneth Fisher
fuente
hay un índice no agrupado en academicInstitutionid y un índice de Clustred ID ..
sebeid
Específicamente, ¿hay una inclusión (nombre) en el índice en academiaInstitutionid?
Kenneth Fisher
sí, el nombre también está incluido ... importa si es 1 índice o 2 índices
sebeid
1
¿Quiere decir que tiene el índice agrupado en id y el segundo en academiaInstitutionId include (name)? Seguiría y crearía el índice compuesto. Si observa sus planes, la mayoría de ellos están haciendo búsquedas de índices agrupados. La idea es intentar que sea una búsqueda de índice.
Kenneth Fisher
0

Antes de realizar cualquier cambio en el script, solo haga un índice reconstruido en todas las tablas involucradas y vea si hay algún aumento significativo. (al menos, haga una reconstrucción de estadísticas a nivel de tabla con exploración completa)

[Programa] parece una gran tabla, asegúrese de que P.AssociationOrgId esté indexado.

jyao
fuente
reconstruyo estadísticas todos los días y todos los índices se reconstruyeron
sebeid