2017-06-13 3 views
0

Eine Abfrage, die von meiner Anwendung auf einem bestimmten Kunden ausgeführt wird, ist sehr langsam. Ich habe festgestellt, dass der Kunde viele Datensätze in einer Tabelle hat.Inner Join mit großen Tabelle verlangsamen Abfrage

die Abfrage so etwas wie dieses

SELECT T1.Field1,BT.Field2, T3.Field3 
FROM TABLE1 T1 INNER JOIN 
BIGTABLE BT ON FIELDS INNER JOIN 
TABLE2 T2 ON FIELDS 

ist bemerkte ich, dass wie diese Kommentierung in einem viel schnelleren Abfrage stellt sich heraus:

SELECT T1.Field1,/*BT.Field2,*/ T3.Field3 
FROM TABLE1 T1 /*INNER JOIN 
BIGTABLE BT ON FIELDS*/ INNER JOIN 
TABLE2 T2 ON FIELDS 

Also ich diesen Trick versucht, die Größe des Bigtable zu reduzieren :

--I use top 10 while the BIGTABLE contains 150000 records 
SELECT top 10 * 
INTO #BIGTABLE 
FROM BIGTABLE 

SELECT T1.Field1,BT.Field2, T3.Field3 
FROM TABLE1 T1 INNER JOIN 
#BIGTABLE BT ON FIELDS INNER JOIN 
TABLE2 T2 ON FIELDS 

DROP TABLE #BIGTABLE 

Vor der Ausführung erwartete ich eine viel schnellere Abfrage, aber die Ausführung Die Zeit war ziemlich ähnlich. Könnten Sie bitte einen Weg vorschlagen, um die Leistung zu studieren?

Danke.

+3

Wahrscheinlich brauchen Sie nur Indizes für die in den Joins verwendeten Spalten. –

+2

Ich würde nicht 150.000 Datensätze als eine "große" Tabelle, vor allem für SQL Server. Können Sie den Ausführungsplan posten? Könnte alles sein, aber die Statistiken oder ein Index sind möglicherweise aus. Veröffentlichen Sie auch das Schema, wenn Sie bei nicht indexierten, großen Varchar-Feldern mitmachen, wird es Ihnen schlecht gehen. –

+2

Sehen Sie sich die ersten 2 (oder alle) der Videos hier an: Das wird Ihnen sehr helfen: https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free- Open-Source/ –

Antwort

0

die Leistung zu untersuchen, Sie einige Dinge tun könnte:

Wenn Sie die Abfrage von SSMS läuft dann schließen Sie einfach den Ist Plan Execution (überprüfen ein kleines Symbol in der Symbolleiste), bevor die Abfrage ausgeführt wird und ausführen. Schau dir den sqlplan an oder du kannst ihn hier posten. Manchmal können "Table-Scans" oder andere ressourcenintensive Operationen zu Langsamkeit führen. Der Plan wird Ihnen helfen zu verstehen.

Abgesehen von Ihrer Abfrage könnte es andere Dinge auf dem Server laufen, In der Vergangenheit habe ich Who Is Active Script from Adam Machanic verwendet, um zu finden, welche anderen Dinge den Server beschäftigt halten. Prüfen Sie, ob Ihre SPID durch andere Abfragen blockiert wird (Wenn Sie Adams Skript ausführen, hat es eine blocking_session-Spalte, die Ihnen dies anzeigt). Sie benötigen fast DBA-Berechtigungen, um das Skript auszuführen. Einige Leute empfehlen nicht, dieses Skript häufig auf Produktionsservern auszuführen.

Sie könnten "WITH (READUNCOMMITED)" Hinweis verwenden, um zu sehen, ob das hilft. Dies wird nicht empfohlen, wenn Sie keine schmutzigen Daten in Ihrer Abfrage sehen möchten.

+0

Hallo. Danke für die Antwort. Ich habe den Plan hier eingefügt https://www.brentozar.com/pastetheplan/?id=B1MIB96Mb kannst du etwas erzählen? – LaBracca

+0

EVA_REFERENCES ist der große Tisch – LaBracca

+0

Wenn Sie nur MF.ID_FUNZIONE auswählen möchten und PA.ID_DIPENDENTE dann könnte man diese Abfrage versuchen: 'wählen MF.ID_FUNZIONE, PA.ID_DIPENDENTE aus PER_ANAGRAFICA PA INNER MSQ_PERS_FUNZIONI MPF ON MPF JOIN. ID_DIPENDENTE = PA.ID_DIPENDENTE UND PA.STATO = 1 INNER JOIN MSQ_FUNZIONI MF MF.ID_FUNZIONE ON = MPF.ID_FUNZIONE WHERE EXISTIERT (SELECT FROM 1 EVA_REFERENCES ER INNER JOIN \t \t \t \t APP_SSHSR APP ON APP.ID_REF_IS_SS_PERIODICO_MANSIONI = ER.ID_EVA_REFERENCE_TYPES \t \t \t \t WO ER.ID_FOR_ALL = MF.ID_FUNCTION) ' – Nachi