Wie kann ich verhindern, dass SSMS meinen Code beim Speichern einer Ansicht neu schreibt?

8

Ich erstelle eine Ansicht, die eine Anweisung mit einer WHEREähnlichen Klausel verwendet:

WHERE
    (
        col1 IS NOT NULL
        OR
        col2 IS NOT NULL
    )
    AND
    NOT EXISTS (SELECT ...)

Die Ausführung dauert durchschnittlich 10 Sekunden. Wenn ich jedoch versuche, diese Abfrage als Ansicht zu speichern, "optimiert" SQL Server (oder der MS SQL Server Management Studio-Client) die Abfrage, um stattdessen diese Struktur zu verwenden:

WHERE
    (col1 IS NOT NULL AND NOT EXISTS (SELECT ...))
    OR
    (col2 IS NOT NULL AND NOT EXISTS (SELECT ...))

Verlangsamung der Abfrage auf 6+ Minuten. Gibt es eine Möglichkeit, dieses Verhalten zu deaktivieren, sodass die Ansicht genau die SQL-Abfrage verwendet, die ich ihr gebe?

Zikes
quelle

Antworten:

14

Verwenden Sie keine SSMS-Assistenten.

Geben Sie einfach Ihre CREATE VIEW dbo.Foo AS SELECT ...Anweisung in ein neues Abfragefenster ein und führen Sie es aus.

Dadurch wird verhindert, dass die Abfragesyntax auf semantisch äquivalente, aber leistungsschwächere Alternativen umgestellt wird.

Martin Smith
quelle
4
Alle Ansichten, gespeicherten Prozesse, UDFs, Tabellen usw. Alle erstellten oder geänderten Objekte sollten ohnehin im Skript enthalten sein, damit sie wie alle anderen Codes in die Quellcodeverwaltung übernommen werden können.
HLGEM
1
Es gibt ein paar grafische SQL-Tools, die anständig sind und solche dummen Sachen nicht machen
Earlz
2
@Earlz stimmt, aber ich denke, wir alle wissen, dass wir speziell über SSMS sprechen, nicht über alle grafischen Tools im Allgemeinen.
Aaron Bertrand