2017-02-06 2 views
0

Ich versuche, die folgende Abfrage in SQL Server ausführen, aber es dauert ca. 1 Stunde zu laufen. Tabelle 'dbo.AccessControl' hat ca. 3 Millionen Datensätze und 'dbo.username' Tabelle hat 3.5k Datensätze. Gibt es eine Möglichkeit, diese Abfrage zu optimieren, weil ich nicht glaube, dass ein einziger linker Join so viel Zeit für nur 3 Millionen Datensätze benötigen würde?Wählen Sie in SQL-Server viel Zeit nehmen

select isd.*,ac.username1+','+ac.Username2+','+ac.Username3 as UserName 
into dbo.username 
from dbo.details isd 
left outer join dbo.AccessControl ac 
on isd.LocationId=ac.LocationId 
and isd.DepartmentId=ac.DepartmentId 
and isd.productId=ac.productId; 
+0

Versuchen Sie eine innere Verknüpfung unioned mit (ein oder mehrere (d. h drei)) Anti-Joins. Ich habe viele Instanzen gesehen, bei denen ein innerer Join sofort abgeschlossen wird und ein linker Join für immer dauert. – cco

+0

Bitte senden Sie den Ausführungsplan. Haben Sie Indizes in den Join-Spalten? Werden sie benutzt? Wie viele sind die geschätzten Zeilen im Plan? Ihre Abfrage könnte schließlich zu 3M * 3,5 Zeilen führen. Warum versuchen Sie, eine neue Tabelle mit all diesen Daten zu erstellen? –

+0

Haben Sie den Aktivitätsmonitor überprüft, während die Abfrage ausgeführt wird? Dies wird zeigen, wenn es irgendwelche Sperren oder IO-Probleme gibt, sogar den Ausführungsplan der Anfrage anzeigen –

Antwort

0

Gibt es eine Möglichkeit, diese Abfrage zu optimieren, weil ich glaube nicht eine einzige links für nur 3 Millionen Datensätze so viel Zeit in Anspruch nehmen beitreten sollte.

In Ihrem Fall, ich denke, es könnte eine Art Verriegelung sein, Blockierung, die diese Abfrage verursacht so lange laufen oder haben Sie vielleicht zu in eine Art Engpass lief ..

Um herauszufinden, , warum Ihre Anfrage wird so viel Zeit läuft ... unter Abfrage in einem separaten Fenster laufen

select status,command,blocking_session_id,wait_type,last_Wait_type 
from sys.dm_exec_requests where session_id=<<select into sessionid>> 

Dies sollte Ihnen einen Anhaltspunkt auf, was geschieht ..

(Sie können auch Activity Monitor anzuzeigen das gleiche verwenden)

Wenn Sie in einer Version> SQL2014 sind, können Sie Live-Status der Abfrage davon, indem Sie folgende Schritte

Set statistics profile on 
    your query 

und dann unter Abfrage in einem sepereate Fenster laufen

select * from sys.dm_exec_query_profiles 
where session_id=your session id 
+0

Der SSMS-Aktivitätsmonitor kann diese Informationen für alle SQL Server-Versionen anzeigen. Es könnte Sperren, IO oder Tempdb Spillover wegen fehlender Indizes sein –

+0

@PanagiotisKanavos: Aktualisiert, danke – TheGameiswar

Verwandte Themen