我有一个包含许多SELECT
命令的存储过程。
不是将OPTION (MAXDOP 8)
放在每个select命令的末尾,是否有一种方法可以在存储过程的开头设置它并在最后删除它,而不是在服务器上实际设置它? / p>
离。
sp_configure 'max degree of parallelism', 4
go
reconfigure with override
答案 0 :(得分:12)
我希望有一种方法可以为proc的范围设置MAXDOP,但我同意没有办法做到这一点。
为了对抗上面的一些建议,使用MAXDOP提示有很多理由,例如在多处理器环境中进行非工作时间索引构建,更新或数据构建,但MAXDOP的设置低于处理器数量在繁忙的“高峰”时段帮助平衡活动,例如正常营业时间。与某些提示(如索引提示)不同,这不会强制您的进程使用更多线程,但如果计划选择,它将使其能够执行此操作。
如果你加倍线程,一些索引构建的执行速度几乎要快两倍,所以有一个真正的好处。
答案 1 :(得分:4)
可悲的是,没有。
您的选项可以使用
sp_configure 'max degree of parallelism'
在服务器级别设置,也可以更新存储过程中的每个SELECT语句以使用OPTION (MAXDOP 8)
。
也就是说,查询选项应该是最后的选择,如果您的查询表现不佳,可能存在潜在的问题。
答案 2 :(得分:2)
幸运的是没有。做这些事情的推荐方法是根本不做。当SQL Server真正选择错误的计划而不是规则时,覆盖查询应该只是罕见的异常。当必须强制执行查询计划时,正确的操作是使用查询计划指南:
最重要的是要了解查询提示是设计时间选项(它们需要代码更改以修改查询)并且滥用它们会大大降低未来的可维护性应用程序(当硬件更改时,或在不同的部署站点上,提示将是错误的)。相比之下,查询计划指南是部署时间选项,它们不需要更改代码,可以根据现场硬件容量和工作负载在每个部署的站点上进行自定义。