select 有聚合和没有聚合在速度上有什么不同?
What is different between select with aggregate and without it in speed?
我有两个 SQL 查询。
第一次查询:
CHECKPOINT
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SELECT dateadd(HH, datediff(HH, 0, time_Stamp), 0) as Time1
,[Field1]
,[Field2]
,[Field3]
,[Field4]
,[Field5]
,[Field6]
,[Field7]
FROM [dbo].[TableT001]
和第二个查询:
CHECKPOINT
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Select dateadd(HH, datediff(HH, 0, time_Stamp), 0) as Time1
,Min(cast(Field1 as bigint))
,Min(cast(Field2 as bigint))
,CAST(Avg(Field3) as float)
,CAST(Avg(Field4) as float)
,CAST(Avg(Field5) as float)
,CAST(Avg(Field6) as float)
,CAST(Avg(Field7) as float)
from TableT001
Group by dateadd(HH, datediff(HH, 0, time_Stamp), 0)
order by Time1
第一个查询在 30 秒内执行,第二个在 2 秒内执行!
虽然两个查询从TableT001
读取相同的数据(大约1450000行),速度差异的原因是什么?
编辑:
第一个查询执行计划:
the first query execution plan
第二个查询执行计划:
the second query execution plan
通常情况下,聚合比不聚合要慢得多。但是,将最终结果集移出数据库也需要时间。
返回 1,450,000 行所花费的时间显然比返回 24 行要多得多。我推测这可以解释您的情况的大部分差异。事实上,它可能解释了 更多 的差异,因为聚合应该更慢。
聚合可以利用表上的索引,因此您的数据库可能也有优化聚合的索引。
我有两个 SQL 查询。
第一次查询:
CHECKPOINT
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SELECT dateadd(HH, datediff(HH, 0, time_Stamp), 0) as Time1
,[Field1]
,[Field2]
,[Field3]
,[Field4]
,[Field5]
,[Field6]
,[Field7]
FROM [dbo].[TableT001]
和第二个查询:
CHECKPOINT
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Select dateadd(HH, datediff(HH, 0, time_Stamp), 0) as Time1
,Min(cast(Field1 as bigint))
,Min(cast(Field2 as bigint))
,CAST(Avg(Field3) as float)
,CAST(Avg(Field4) as float)
,CAST(Avg(Field5) as float)
,CAST(Avg(Field6) as float)
,CAST(Avg(Field7) as float)
from TableT001
Group by dateadd(HH, datediff(HH, 0, time_Stamp), 0)
order by Time1
第一个查询在 30 秒内执行,第二个在 2 秒内执行!
虽然两个查询从TableT001
读取相同的数据(大约1450000行),速度差异的原因是什么?
编辑:
第一个查询执行计划:
the first query execution plan
第二个查询执行计划:
the second query execution plan
通常情况下,聚合比不聚合要慢得多。但是,将最终结果集移出数据库也需要时间。
返回 1,450,000 行所花费的时间显然比返回 24 行要多得多。我推测这可以解释您的情况的大部分差异。事实上,它可能解释了 更多 的差异,因为聚合应该更慢。
聚合可以利用表上的索引,因此您的数据库可能也有优化聚合的索引。