大佬教程收集整理的这篇文章主要介绍了sql – 为什么如果在WHERE子句中一个常量被一个参数替换(具有相同的值),那么查询会大大减慢?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
查询#1 – 具有常量
;WITH Hierarchy (Id,ParentId,Data,Depth) AS ( SELECT Id,NULL AS Data,0 AS Depth FROM Test union all SELECT h.Id,t.ParentId,COALESCE(h.Data,t.Data),Depth + 1 AS Depth FROM Hierarchy h INNER JOIN Test t ON t.Id = h.ParentId ) SELECT * FROM Hierarchy WHERE Id = 69
查询#2 – 带参数
DECLARE @Id INT SELECT @Id = 69 ;WITH Hierarchy (Id,Depth + 1 AS Depth FROM Hierarchy h INNER JOIN Test t ON t.Id = h.ParentId ) SELECT * FROM Hierarchy WHERE Id = @Id
如果一个表为50,000行的查询,常量运行10毫秒,参数的运行速度为30秒(低于3,000倍).
将最后一个WHERE子句移动到递归的锚定定位不是一个选择,因为我想使用该查询创建一个视图(没有最后一个WHERE).从视图中选择将有WHERE子句(WHERE Id = @Id) – 我需要这个因为Entity Framework,但这是另一个故事.
有人建议强制使用查询#2(使用参数)的方式使用与查询1相同的查询计划(带常量)吗?
我已经尝试玩索引,但没有帮助.
如果有人想我可以发布表定义和一些样本数据.
我正在@R_450_10265@l 2008 R2.
谢谢你的帮助提前!
执行计划 – 查询#1 – 具有常量
执行计划 – 查询#2 – 带参数
最后我创建一个用户定义的表值函数,并用CROSS APPLY操作符来创建视图.
让我们看看解决方案本身.
用户定义的表值函数
create functION [dbo].[TestFunction] (@Id int) RETURNS TABLE AS RETURN ( WITH Hierarchy (Id,Depth) AS( SELECT Id,0 AS Depth FROM Test Where Id = @Id union all SELECT h.Id,Depth + 1 AS Depth FROM Hierarchy h INNER JOIN Test t ON t.Id = h.ParentId ) SELECT * FROM Hierarchy )
视图
create view [dbo].[TestView] AS SELECT t.Id,f.Data,f.Depth FROM Test AS t CROSS APPLY TestFunction(Id) as f
用常量进行查询
SELECT @R_262_4777@estView WHERE Id = 69
查询参数
DECLARE @Id INT SELECT @Id = 69 SELECT @R_262_4777@estView WHERE Id = @Id
与parmator的查询执行基本上与使用常量的查询一样快.
谢谢马丁和其他人!
以上是大佬教程为你收集整理的sql – 为什么如果在WHERE子句中一个常量被一个参数替换(具有相同的值),那么查询会大大减慢?全部内容,希望文章能够帮你解决sql – 为什么如果在WHERE子句中一个常量被一个参数替换(具有相同的值),那么查询会大大减慢?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。