【发布时间】:2015-06-11 22:11:07
【问题描述】:
我正在尝试将内联 TVF 作为原始参数化 SQL 查询运行。
当我在 SSMS 中运行以下查询时,需要 2-3 秒
select * from dbo.history('2/1/15','1/1/15','1/31/15',2,2021,default)
我能够通过 SQL 分析器(参数化,由实体框架生成)捕获以下查询并在 SSMS 中运行它。
exec sp_executesql N'select * from dbo.history(@First,@DatedStart,@DatedEnd,@Number,@Year,default)',N'@First date,@DatedStart date,@DatedEnd date,@Maturity int,@Number decimal(10,5)',@First='2015-02-01',@DatedStart='2015-01-01',@DatedEnd='2015-01-31',@Year=2021,@Number=2
在 SSMS 中运行上述查询需要 1:08,这比非参数化版本长约 30 倍。
我尝试将option(recompile) 添加到参数化查询的末尾,但就性能而言它完全没有任何作用。这对我来说显然是一个索引问题,但我不知道如何解决它。
在查看执行计划时,似乎参数化版本大部分都挂在 Eager Spool (46%) 上,然后是 Clustered Index scan (30%) 在没有参数的执行计划中不存在。
也许我缺少一些东西,有人可以为我指出正确的方向,让我如何让这个参数化查询正常工作?
编辑:Parameterized query execution plan,non-parameterized plan
【问题讨论】:
-
TVF的定义是什么。你能发布计划吗?
-
我无法发布该功能,但它是一个将另一个 ITVF 连接到一系列日期的 ITVF。我已经在主帖中链接了这两个查询的计划。
标签: sql-server sql-server-2008 user-defined-functions sqlperformance sql-optimization