目前正在致力于提高一些查询的效率。查看查询计划后,我发现当有top子句时,SQL没有执行并行性,导致查询时间从1-2秒增加到几分钟。
有问题的查询正在使用具有各种连接和联合的 View ,我正在寻找关于为什么会发生这种情况的一般答案/理解 - 谷歌到目前为止让我失望了。
谢谢
最佳答案
正如您可能知道的那样
通常,SQL Server 在以下情况下并行处理查询:
- 当 CPU 数量大于事件连接数量时。
- 当串行执行查询的估计成本高于查询计划阈值时(估计成本是指串行执行查询所需的时间(以秒为单位)。)
但是,某些类型的语句除非包含子句,否则无法并行处理。 例如,即使相关查询满足条件,UPDATE、INSERT 和 DELETE 通常也不会并行处理。
但如果 UPDATE 或 DELETE 语句包含 WHERE 子句,或者 INSERT 语句包含 SELECT 子句,则 WHERE 和 SELECT 可以并行执行。在这些情况下,更改会连续应用于数据库。
要配置并行处理,只需执行以下操作:
- 在“服务器属性”对话框中,转到“高级”页面。
- 默认情况下,“最大并行度”设置的值为 0,这意味着用于并行处理的最大处理器数量是自动控制的。本质上,SQL Server 根据工作负载使用实际可用处理器数量。要将用于并行处理的处理器数量限制为设定数量(最多为 SQL Server 支持的最大数量),请将最大并行度设置更改为大于 1 的值。值 1 告诉 SQL Server 不要使用并行处理。
- 大型、复杂的查询通常可以从并行执行中受益。但是,仅当为同一查询运行串行计划所需的估计秒数高于并行成本阈值中设置的值时,SQL Server 才会执行并行处理。 使用“服务器属性”对话框的“高级”页面上的“并行成本阈值”框设置成本估算阈值。您可以使用 0 到 32,767 之间的任何值。在单个CPU上,成本阈值被忽略。
- 单击“确定”。这些更改会立即应用。您不需要重新启动服务器。
您可以使用存储过程 sp_configure 来配置并行处理。 Transact-SQL 命令是:
exec sp_configure "max degree of parallelism", <integer value>
exec sp_configure "cost threshold for parallelism", <integer value>
关于SQL 2008 不与 top 子句执行并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8166432/