Comment puis-je empêcher SSMS de réécrire mon code lors de l'enregistrement d'une vue?

8

Je crée une vue qui utilise une déclaration avec une WHEREclause similaire à ceci:

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

ce qui prend en moyenne 10 secondes pour fonctionner. Cependant, lorsque j'essaie d'enregistrer cette requête en tant que vue, SQL Server (ou le client MS SQL Server Management Studio) "optimise" la requête pour utiliser cette structure à la place:

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

Ralentir la requête à 6+ minutes. Existe-t-il un moyen de désactiver ce comportement, afin que la vue utilise exactement la requête SQL que je lui donne?

Zikes
la source

Réponses:

14

N'utilisez pas les assistants SSMS.

tapez simplement votre CREATE VIEW dbo.Foo AS SELECT ...instruction dans une nouvelle fenêtre de requête et exécutez-la.

Cela l'empêchera de réorganiser la syntaxe de requête en alternatives sémantiquement équivalentes mais moins performantes.

Martin Smith
la source
4
Et toutes les vues, procs stockés, UDF, table, etc. tous les objets créés ou modifiés doivent de toute façon être dans le script afin qu'ils puissent être placés dans le contrôle de code source comme tout autre code.
HLGEM
1
Il existe quelques outils graphiques SQL qui sont décents et ne feront pas de trucs stupides comme ça
Earlz
2
@Earlz true, mais je pense que nous savons tous que nous parlons spécifiquement de SSMS, pas de tous les outils graphiques en général.
Aaron Bertrand