首页 > 解决方案 > 使用参数时 SQL 查询性能下降

问题描述

这很快:

SELECT * 
FROM [Assignable Assessors] 
WHERE ([Certificate Type ID] = 'TAA')

但这很慢:

DECLARE @__targetLevel_4 AS nvarchar(8);
SET @__targetLevel_4 = 'TAA';

SELECT * 
FROM [Assignable Assessors] 
WHERE ([Certificate Type ID] = @__targetLevel_4)

这怎么可能?

[Assignable Assessor]是一个视图,它使用包含很多“一组最新记录”的选项。

[Certificate Type ID]是类型nvarchar(8)的,并且选择中没有显式的类型转换。

我正在使用 Azure SQL 数据库。

标签: sqlsql-servertsqlazure-sql-databasessms

解决方案


您所看到的是,当您使用硬编码值“TAA”时,能够使用特定值查看统计信息以创建执行计划。相反,您使用的是局部变量(不是参数),因此它不是查看特定行数的统计信息,而是使用平均行数。如果将相同的代码放入存储过程中,其中将有一个参数而不是局部变量,则参数嗅探(对参数值进行采样并将其用于统计信息)将产生更准确的计划。

要验证所有这些,请捕获每个查询的执行计划并查看行数。然后将这些与相关列(或索引)的统计信息进行比较。


推荐阅读