Optimierungsabfrage mit mehreren Verknüpfungen


8

Ich habe diese Abfrage .. 214 Ausführung / min, 44,42 Durchschnittliche CPU (ms) gibt es eine Möglichkeit, es viel schneller zu machen

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'

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Nun dies, wenn ich in 2 Abfragen aufteilte

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;

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

mit der von Frisbee empfohlenen Abfrage

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Verwenden von Hash Join

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


Wie viel Zeit benötigt die Abfrage jetzt, um ausgeführt zu werden? Und warum wird es 200 Mal pro Minute ausgeführt? Können Sie die Notwendigkeit erklären, die Ergebnisse so oft in einer temporären Tabelle zu speichern?
Ypercubeᵀᴹ

Diese Abfrage befindet sich in einem SP und die temporäre Tabelle wird in der nächsten Abfrage verwendet. Diese Produktion hat ungefähr 20 K Anfrage pro Minute.
Sebeid

Antworten:


2

Probieren
Sie es aus Sie haben einige (möglicherweise) falsch platzierte Join-Bedingungen

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'

Wenn #temp Indizes hat, sortieren Sie nach dem Index, der am sinnvollsten ist

Wenn dies die Antwort nicht verbessert, erzwingen Sie einfach einen Hash-Join für alle.
Verwenden Sie weiterhin die Auswahl in meiner Antwort - fügen Sie den HASH zur obigen Abfrage hinzu

INNER HASH JOIN

Ich habe Ihre Anfrage ausprobiert, aber es gibt nicht viel Verbesserung. Ich weiß auch, dass es nicht empfohlen wird, INNER Hash Join in der Produktion zu verwenden. Außerdem habe ich nicht verstanden, was du mit "
Benutze

Keine große Verbesserung - ist das eine schlechte Sache? Nicht empfohlen, INNER Hash Join in der Produktion zu verwenden? Wo hast du das gehört? Warum versuchst du es nicht zum Grinsen?
Paparazzo

Der Ausführungsplan wurde hinzugefügt. Diese Abfrage verbraucht am meisten CPU und E / A in der Produktion. basierend auf der Zahl
bekomme

stackoverflow.com/questions/800124/… .. aber ich werde es versuchen und Sie wissen lassen. danke
sebeid

AF.Id = 6286 ist nicht fest in der Abfrage codiert, es ist ein Parameter, der an den SP übergeben wird. Ich habe diese Nummer nur zum Testen verwendet
sebeid

1

Versuchen Sie, den folgenden Index zu erstellen (vorausgesetzt, er existiert noch nicht).

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

Es gibt einen Non-Clustered-Index für AcademicInstitutionid und einen Clustred-Index für ID ..
Sebeid

Gibt es speziell ein Include (Name) im Index von AcademicInstitutionid?
Kenneth Fisher

ja Name ist auch enthalten .. spielt es eine Rolle, ob es 1 Index oder 2 Indizes ist
sebeid

1
Sie meinen, Sie haben den Clustered-Index für ID und den zweiten für AcademicInstitutionId include (Name)? Ich würde fortfahren und den zusammengesetzten Index erstellen. Wenn Sie sich Ihre Pläne ansehen, führen die meisten von ihnen Clustered-Index-Suchen durch. Die Idee ist, stattdessen zu versuchen, es zu einer Indexsuche zu machen.
Kenneth Fisher

0

Bevor Sie Änderungen am Skript vornehmen, führen Sie einfach eine Neuerstellung des Index für alle beteiligten Tabellen durch und prüfen Sie, ob eine signifikante Erhöhung vorliegt. (Führen Sie zumindest eine Statistik auf Tabellenebene mit vollständigem Scan neu aus.)

[Programm] scheint eine große Tabelle zu sein. Stellen Sie sicher, dass P.AssociationOrgId indiziert ist.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.