2016-07-18 6 views
0

Ich versuche, eine Ansicht zu erstellen, die im Grunde 2 Dinge tut, ob ein Datensatz in Tabelle 1 in Tabelle 2 ist und ob eine Verknüpfung zu einer anderen Tabelle noch vorhanden ist. Es funktionierte auf einer Teilmenge von Daten, aber wenn ich versuchte, die vollständige Abfrage auszuführen, wurde die Zeitüberschreitung im Ansichtsdesigner überschritten.SQL-Ansicht Optimierung

Die Ansicht funktionierte gut, bis ich in der Überprüfung hinzugefügt, um zu sehen, ob der Link zu einer anderen Tabelle vorhanden war.

Anfänglich trat es Tabelle A Tabelle B und herausgefiltert, wo A.ID in der ID-Spalte in Tabelle B vorhanden war nicht

I wurde dann gesagt, dass, wenn die Verbindung zwischen der Person und der Adressentabelle (gespeichert in Tabelle C) wurde entfernt, dann hätten wir keine andere Möglichkeit, als einen vollständigen Auszug dieser Tabelle zu erhalten und zu sehen, welche Links nicht mehr vorhanden sind. Ich versuche, dass der Check zu verwenden, um festzustellen, ob einige Daten in bestimmten Spalten angezeigt werden

ich die folgende Struktur bin mit fast 60-mal, ob wählen Informationen in einer Spalte zeigen:

Column1 = case when exists (select LinkID from LinkTable C 
      where cast(C.LinkAddressID as varchar) = A.AddressID 
      and cast(C.LinkID as varchar) = A.ID) 
      then Column1 
      else NULL 
      end 

Es gibt ca. 1,6 Mio. Datensätze in Tabelle A nur etwas über 4 Mio. Datensätze in der Link-Tabelle.

Gibt es eine bessere Möglichkeit, diese Abfrage/Ansicht zu schreiben, die optimiert wäre?

Bitte lassen Sie mich wissen, wenn mehr Informationen

benötigt wird
+1

Wenn Sie Varchar-Datentypen definieren, sollten Sie immer die Größe angeben. Ohne weitere Details hier ist es schwer zu wissen, was vor sich geht, aber es scheint, als wäre möglicherweise eine Linksbindung zu LinkTable besser. Sie müssen viel mehr Informationen hier zur Verfügung stellen, bevor wir wirklich helfen können. Ein kleines Stück einer Frage ist nicht genug, um mit der Leistung zu helfen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Bitte geben Sie den tatsächlichen Ausführungsplan und Abfrage – Devart

+0

Auch Ihre Abfrage ist nicht SARGABLE, es kann am Ende Scan tun – TheGameiswar

Antwort

0
Select C.LinkID 
    From A 
    Left Join C On C.LinkAddressID = A.AddressID And C.LinkID = A.ID 

Dies wird Ihnen C.LinkID geben, wenn ein Spiel auf den beiden Bedingungen und NULL liegt vor, wenn beide Kriterien nicht erfüllt sind.

Wenn Indizes/Schlüssel wie Primärschlüssel für A.ID und Fremdschlüsselbeziehungen basierend auf dem Inhalt der Join-Klausel vorhanden sind, wird eine sehr gute Leistung erzielt.

0

Als Joe vorgeschlagen, wenn für alle 60 Spalten verwenden Sie die gleiche AddressId und Id Felder zwei Tabellen übereinstimmen, ich glaube, so kann man etwas wie folgende Abfrage

SELECT 
    Column1 = CASE WHEN C.LinkID IS NULL THEN NULL ELSE A.Column1 END, 
    .... 
FROM A 
Left Join LinkTable C 
    ON C.LinkAddressID = A.AddressID AND C.LinkID = A.ID 

Casting Datentypen wird das auf jeden Fall deaktivieren Vorteil aus dem Index. Also halten Sie den Datentyp Cast wenn möglich auf Joins und in WHERE-Klauseln