我只想了解如何更快地执行CTE查询。
选项1:
;with cte as
(
select Name , count(*) as TotalCount from dbo.table
where date_value > getdate()-120
)
select * from cte
where count(*) > 100
选项2:
declare @date_value date;
set @date_value = getdate()-120;
;with cte as
(
select Name , count(*) as TotalCount from dbo.table
where date_value > @date_value
)
select * from cte
where count(*) > 100
选项2运行速度略快于1,只有上述查询中的更改是使用局部变量且没有位置变量。
我的问题是,如果我们在日期范围内使用局部变量,它会改善查询性能吗?
仅供参考: 数据库服务器:sql server 2008 / R2, 表行:100万, 运行时间:21分钟
有什么想法?
答案 0 :(得分:0)
性能不是因为CTE。你也为什么要使用CTE? CTE中是否有更多脚本。如果是,那么您应该提供全面检查。 i)最后,不要使用两次计数(*),只使用一次row_number。
ii)您是否在日期列上创建了索引?您应该这样做。 iii)存在条件不利用指数的情况。
试试这个并请提供反馈。多次运行。
select * from
(
select Name ,
row_number()over(order by date_value) rn from dbo.table
where date_value > dateadd(d,-120,getdate())
)tbl where rn>100