定义视图时如何让 T-SQL 执行 OPTION (FORCE ORDER)?

Fre*_*sen 2 t-sql sql-server query-optimization

我的 DBA 告诉我,OPTION (FORCE ORDER)当访问一组特定的视图时,我应该始终在我的 SQL 语句中使用。我明白这是为了防止服务器否决他的加入顺序。

很公平 - 让 DBA 开心是值得的,我很乐意遵守。

但是,我想在我自己的架构中编写几个视图,但这显然不受支持。

那么,我如何在编写我的观点时实现同样的目标,OPTION (FORCE ORDER)即被强制执行?

谢谢弗雷德

Mar*_*ith 5

盲目地附加OPTION (FORCE ORDER)到引用特定视图的所有查询是非常糟糕的一揽子建议。

OPTION (FORCE ORDER) 是一个查询提示,这些在视图内无效 - 您需要将它放在引用您自己的视图的所有查询的外部级别。

有效使用联接提示里面的观点,但并

如果为任意两个表指定了连接提示,则查询优化器会根据 ON 关键字的位置自动为查询中的所有连接表强制执行连接顺序。

所以

SELECT v1.Foo,
       v2.Bar
FROM   v1
       INNER HASH JOIN v2
         ON v1.x = v2.x;
Run Code Online (Sandbox Code Playgroud)

将强制执行 v1 和 v2 内的连接顺序(以及强制执行它们之间的连接顺序和算法)。

但我不会推荐这个。这些类型的提示只能在无法以任何其他方式获得令人满意的计划后,以极其有针对性的方式使用。甚至在没有测试替代方案的情况下,这都不是政策问题。

  • 除此之外,对于每个关于 SQL Server 的问题,答案总是不止一个。任何关于*总是*做任何事情来强制服务器的建议都假定演讲者比整个 SQL Server 优化团队更了解。这有多大可能是真的?如果你必须让你的 DBA 开心,那好吧。但是在你采用他的实践之前,请确保你了解服务器的查询优化特性,它如何实现你的连接,*以及*未来数据的基数将如何变化。通常良好的规范化和索引比优化提示更有用。 (2认同)