使用优化嵌套循环或批处理排序的查询可能会造成 CPU 或内存授予过高
本文可帮助你解决在 SQL Server 中运行查询时 CPU 使用率过高的问题。
适用范围:SQL Server
原始 KB 数: 2009160
现象
在运行具有高度并发工作负荷的 SQL Server Microsoft时,你可能会注意到查询中的某些性能问题。 此行为可能显示为中到高 CPU 使用率或极端内存授予请求。
还可能会遇到其他副作用,例如 OOM 条件、计划缓存逐出的内存压力或意外 RESOURCE_SEMAPHORE
等待。
此外,你可能会注意到,使用大量 CPU 或内存的查询的查询计划将 嵌套循环联接运算符的 OPTIMIZED 属性设置为 True。
原因
在某些情况下,SQL Server 查询处理器引入可选排序操作以提高性能时,可能会出现此问题。 此操作称为“优化嵌套循环”或“批处理排序”,查询优化器确定何时最好地引入这些运算符。 在极少数情况下,查询只涉及几行,但排序操作的设置成本如此之大,以至于优化嵌套循环的成本超过了其优势。 因此,在这些情况下,与预期相比,性能可能会降低。
解决方法
跟踪标志 2340
若要解决此问题,请使用跟踪标志 2340 禁用优化。 跟踪标志 2340 指示查询处理器在生成查询计划时不要对优化的嵌套循环联接使用排序操作(批处理排序)。 这会影响整个实例。
启用此跟踪标志之前,可以彻底测试应用程序,以确保禁用此优化时获得预期的性能优势。 这是因为,当计划触摸的行数大幅增加时,排序优化非常有用。
有关详细信息,请参阅 DBCC TRACEON - 跟踪标志(Transact-SQL)。
修改代码以使用DISABLE_OPTIMIZED_NESTED_LOOP提示
或者,应用以下 DISABLE_OPTIMIZED_NESTED_LOOP
查询提示以在查询级别禁用优化。
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT (DISABLE_OPTIMIZED_NESTED_LOOP));
有关详细信息,请参阅 DISABLE_OPTIMIZED_NESTED_LOOP。
详细信息
适用于
- SQL Server 2005 到 SQL Server 2019