Frage

Ich muss überprüfen, ob eine Zeile in einer Datenbank vorhanden ist; aber ich versuche, den Weg zu finden, dies zu tun, das die beste Leistung bietet. Dies geschieht am besten mit einem Beispiel zusammengefasst.

Nehmen wir an, ich die folgende Tabelle haben:

dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)

Nehmen wir diese Tabelle Millionen von Zeilen hat jedoch nur die Spalte Company einen Index hat.

Ich möchte herausfinden, ob eine bestimmte Kombination von FirstName, LastName und Company existiert. Ich weiß, ich kann dies tun:

IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End

Allerdings, wenn ich mich nicht irre, dass ein vollständiger Tabellenscan tun.

Was würde ich wirklich wie es zu tun ist, eine Abfrage, wo es den Index verwendet. Mit der obigen Tabelle, weiß ich, dass die folgende Abfrage große Leistung hat, da sie den Index verwendet:

Select * from dbo.Person where Company = @Company

Gibt es trotzdem die Suche auf dieser Teilmenge von Daten nur zu machen? z.B. so etwas wie folgt aus:

select * from (
  Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName

Auf diese Weise wäre es nur einen Tabellenscan auf einer viel engeren Sammlung von Daten tun.

Ich weiß, dass die Abfrage oben wird nicht funktionieren, aber gibt es eine Abfrage, die würde?

Oh, und ich bin nicht in der Lage temporäre Tabellen zu erstellen, da der Benutzer nur Lesezugriff hat.

War es hilfreich?

Lösung

IF EXISTS( ...) ist die schnellste Form. Der Optimiser eine verfügbare Index verwenden, um die Filterbedingung zu erfüllen, wenn es der Index schneller wird berechnet. IF EXISTS sobald eine Zeile gefunden verlassen wird.

Stellen Sie sicher, dass Ihre Statistiken sind auf dem Laufenden ...

Andere Tipps

FWIW, dies gilt SQL:

select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName

Und nur unterscheidet sich von Ihrer Anfrage durch einen Alias. Die IF EXISTS wird schneller sein als Mitch in seinem Amt sagt.

Sie können die Query Analyzer verwenden, um herauszufinden, was das Optimierungsprogramm zu tun entscheidet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top