Ottimizzazione della query con più join


8

ho questa domanda .. 214 Esecuzione / min, 44,42 CPU media (ms) esiste un modo per renderla molto più veloce

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'

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Ora questo se divido in 2 query

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;

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

usando la query raccomandata da Frisbee

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Utilizzando Hash Join

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


Quanto tempo deve essere eseguita la query ora? E perché viene eseguito 200 volte al minuto? Puoi spiegare la necessità di salvare i risultati in una tabella temporanea così spesso?
ypercubeᵀᴹ

questa query è in un SP e la tabella temporanea viene utilizzata nella query successiva. questa produzione ha una richiesta di circa 20 K al minuto.
Sebeid

Risposte:


2

Fai una prova
Hai alcune condizioni di partecipazione (potenzialmente) fuori posto

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'

Se #temp ha indici, ordina quello che ha più senso

Se ciò non migliora la risposta, imponi semplicemente un hash join su tutti.
Usa ancora seleziona nella mia risposta - aggiungi l'HASH alla query sopra

INNER HASH JOIN

ho provato la tua domanda ma non c'è molto miglioramento. inoltre so che non è consigliabile utilizzare INNER Hash Join in Production. Inoltre, non ho
capito

Non c'è molto miglioramento - è una brutta cosa? Non è consigliabile utilizzare INNER Hash Join in Production? Dove l'hai sentito? Perché non ci provi per sorridere?
paparazzo,

aggiunto il piano di esecuzione a .. questa query consuma più CPU e I / O in produzione. in base al numero che sto ottenendo maggiore durata e più scritture e stessa CPU
sebeid

stackoverflow.com/questions/800124/… .. ma lo proverò e ti farò sapere. grazie
sebeid

AF.Id = 6286 non è hard coded nella query, è un parametro passato a SP .. ho appena usato questo numero per il test
sebeid

1

Prova a creare il seguente indice (supponendo che non esista già)

CREATE INDEX ix_Organization_academicInstitutionid
    ON Organization(academicInstitutionid, Id) INCLUDE (Name)

c'è un indice non raggruppato suademy Institutionid e un indice Clustred su ID ..
sebeid

Nello specifico c'è un include (nome) sull'indice su academicInstitutionid?
Kenneth Fisher,

sì, il nome è incluso anche .. importa se si tratta di 1 indice o 2 indici
sebeid

1
Vuoi dire che hai l'indice cluster su id e il secondo su academInstitutionId include (nome)? Vorrei andare avanti e creare l'indice composito. Se osservi i tuoi piani, la maggior parte di essi sta effettuando ricerche di indici in cluster. L'idea è quella di provare a renderlo un indice cercare invece.
Kenneth Fisher,

0

Prima di apportare qualsiasi modifica allo script, basta fare un indice ricostruito su tutte le tabelle coinvolte e vedere se c'è un aumento significativo. (almeno, ricostruisci le statistiche a livello di tabella con la scansione completa)

[Programma] sembra una grande tabella, assicurati che P.AssociationOrgId sia indicizzato.


Ricostruisco le statistiche tutti i giorni e tutti gli indici sono stati ricostruiti
se il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.