Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsaufruf in where-Klausel

Wie bei SQL üblich, ist die Abfrage ohne Kenntnis des eigentlichen Schemas weitgehend irrelevant.

Haben Sie einen Index auf Members.Phone? Wenn nein, dann macht es keinen Unterschied, wie Sie die Abfrage schreiben, sie werden alle die gesamte Tabelle scannen und die gleiche Leistung erbringen (d. h. schlecht). Wenn Sie einen Index haben dann macht die Art und Weise, wie Sie die Abfrage schreiben, den Unterschied:

SELECT * FROM Members WHERE Phone= @Phone;
SELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone);
SELECT * FROM Members WHERE  dbo.FormatPhone(Phone)[email protected];

Erste Abfrage ist garantiert optimal, sucht das Telefon im Index.
Zweite Abfrage hängt von den Eigenschaften des dbo.FormatPhone ab. Es kann eine optimale Suche verwenden oder nicht.
Die letzte Abfrage ist garantiert schlecht. Werde die Tabelle scannen.

Außerdem habe ich den NOLOCK-Hinweis entfernt, es scheint das Thema des Tages zu sein ... Siehe Syntax für nolock in SQL . NOLOCK ist immer die falsche Antwort. Snapshot-Isolation verwenden.