更好的选择在CTE查询中提及日期范围?

时间:2015-02-02 06:37:40

标签: sql sql-server sql-server-2008-r2 common-table-expression database-performance

我只想了解如何更快地执行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分钟

有什么想法?

1 个答案:

答案 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