【发布时间】:2015-02-02 06:37:39
【问题描述】:
我只是想知道如何让我的 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 分钟
有什么想法吗?
【问题讨论】:
-
很确定查询没有运行。你能发布实际的查询吗?
-
在尝试进行性能调整(任何事情)之前,您是否根据实际目标实际测量了性能,并且性能是否比要求的差?如果没有,只需编写清晰的代码并继续前进。如果您确实需要调整性能,您是否测量过哪里性能较差?这是问题的实际位置吗?如果是这样,切换到局部变量形式是否真的可以解决您的性能问题?如果是这样,请继续。如果没有,请查看其他地方。
-
我怀疑你可以在没有分组的情况下计算()。 group by 和 "have count() > 300" 有什么问题?无需 CTE。
标签: sql sql-server sql-server-2008-r2 common-table-expression database-performance