sql - 使用参数时 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 数据库。
解决方案
您所看到的是,当您使用硬编码值“TAA”时,能够使用特定值查看统计信息以创建执行计划。相反,您使用的是局部变量(不是参数),因此它不是查看特定行数的统计信息,而是使用平均行数。如果将相同的代码放入存储过程中,其中将有一个参数而不是局部变量,则参数嗅探(对参数值进行采样并将其用于统计信息)将产生更准确的计划。
要验证所有这些,请捕获每个查询的执行计划并查看行数。然后将这些与相关列(或索引)的统计信息进行比较。
推荐阅读
- node.js - 使用 Heroku 部署 React 应用程序 + 节点服务器
- python - 从字典和python中的列表列表创建字典集
- mongodb - 在 Quasar / VueJS 中连接到 MongoDB
- css - css覆盖禁用文本选择
- html - Crisp 不断抛出错误“BoundWidget”对象没有属性“字段”
- c - 子进程改变内存图像
- reactjs - Webpack 在 React 图像导入时抛出错误
- mongodb - MongoDB聚合管道:如何将字符串与数组内的日期进行比较
- python - 以浮点数组的形式获取音频频率和幅度
- python-3.x - 为什么我不能更换新的行分隔符?