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

Posted

技术标签:

【中文标题】定义视图时如何让 T-SQL 执行 OPTION (FORCE ORDER)?【英文标题】:How can I make T-SQL perform OPTION (FORCE ORDER) when defining views? 【发布时间】:2017-03-12 19:11:05 【问题描述】:

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

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

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

那么,我如何在撰写观点时达到同样的效果,即强制执行OPTION (FORCE ORDER)

谢谢 弗雷德

【问题讨论】:

【参考方案1】:

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

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

在视图中使用Join hints 是有效的,并且

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

所以

SELECT v1.Foo,
       v2.Bar
FROM   v1
       INNER HASH JOIN v2
         ON v1.x = v2.x;

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

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

【讨论】:

除此之外,关于 SQL Server 的每一个问题,总是有不止一个答案。任何关于总是做任何事情来强迫服务器的建议都假定说话者比整个 SQL Server 优化团队更了解。这有多大可能是真的?如果你必须让你的 DBA 开心,那好吧。但在您采用他的做法作为您自己的做法之前,请确保您了解服务器的查询优化功能、它是如何实现您的连接的,以及数据的基数在未来将如何变化。通常,良好的规范化和索引比优化提示更有用。 感谢大家的 cmets - 让我的生活更加复杂,我通过 SAS 访问这些视图,到目前为止还没有看到使用 FORCE ORDER 的任何性能改进。 @JamesK.Lowden:原则上我同意,但是优化团队无法知道的内容很多,比如当有 30 个表连接时,最优查询计划是什么。复杂系统具有复杂的连接,优化器不善于选择合理的顺序。在这种情况下,任何合理的顺序都比优化器选择的要好。

以上是关于定义视图时如何让 T-SQL 执行 OPTION (FORCE ORDER)?的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL,在视图中重复相同的标量子查询性能

T-SQL 谜题:将其用作内联视图时查询失败

T-SQL查询进阶--深入浅出视图

关于T-SQL重编译那点事,WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗

用自定义视图替换字符串

如何让自定义表格视图单元格扩展到表格末尾?