保存视图时如何防止 SSMS 重写我的代码?

Zik*_*kes 8 sql-server sql-server-2008-r2

我正在创建一个视图,该视图使用带有WHERE类似于此子句的语句:

WHERE
    (
        col1 IS NOT NULL
        OR
        col2 IS NOT NULL
    )
    AND
    NOT EXISTS (SELECT ...)
Run Code Online (Sandbox Code Playgroud)

运行平均需要 10 秒。但是,当我尝试将此查询保存为视图时,SQL Server(或 MS SQL Server Management Studio 客户端)会“优化”查询以使用此结构,而不是:

WHERE
    (col1 IS NOT NULL AND NOT EXISTS (SELECT ...))
    OR
    (col2 IS NOT NULL AND NOT EXISTS (SELECT ...))
Run Code Online (Sandbox Code Playgroud)

将查询减慢到 6 分钟以上。有什么方法可以禁用此行为,以便视图完全使用我提供的 SQL 查询?

Mar*_*ith 14

不要使用 SSMS 向导。

只需CREATE VIEW dbo.Foo AS SELECT ...在新的查询窗口中键入您的语句并执行它。

这将阻止它将查询语法重新排列为语义等效但性能更差的替代方案。

  • 并且所有视图、存储过程、UDF、表等所有创建或更改的对象无论如何都应该在脚本中,以便它们可以像所有其他代码一样放入源代码控制中。 (4认同)
  • @Earlz 是的,但我想我们都知道我们专门讨论 SSMS,而不是一般的所有图形工具。 (2认同)