我很好奇为什么有GROUP BY
子句的聚合查询比没有子句的查询运行得这么快。
例如,此查询将花费近10秒钟来运行
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
虽然这个过程不到一秒钟
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
CreatedDate
在这种情况下只有一个,因此分组查询返回的结果与未分组查询相同。
我注意到两个查询的执行计划是不同的-第二个查询使用Parallelism,而第一个查询则没有。
如果SQL Server没有GROUP BY子句,则以不同的方式评估聚合查询是否正常?在不使用GROUP BY
子句的情况下,我可以做些什么来提高第一查询的性能?
编辑
我刚刚学会了可以将OPTION(querytraceon 8649)
并行性的开销开销设置为0,这使查询使用某种并行性,并将运行时间减少到2秒,尽管我不知道使用此查询提示是否有任何弊端。
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)
我仍然希望运行时间更短,因为查询是要在用户选择时填充一个值,因此理想情况下应该像分组查询一样是瞬时的。现在,我只是包装查询,但我知道这并不是理想的解决方案。
SELECT Min(CreatedDate)
FROM
(
SELECT Min(CreatedDate) as CreatedDate
FROM MyTable WITH (NOLOCK)
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
) as T
编辑#2
无论CreatedDate
和SomeIndexedValue
对他们有独立的非唯一,非聚集索引。SomeIndexedValue
实际上,它是一个varchar(7)字段,即使它存储了一个指向另一个表的PK(int)的数值。在数据库中未定义两个表之间的关系。我根本不应该更改数据库,只能写查询数据的查询。
MyTable
包含超过300万条记录,并且每个记录都分配了一个属于(SomeIndexedValue
)的组。组可以是1到200,000条记录中的任何
MAXDOP
设置最大并行度,这限制了查询可以使用的处理器数量。基本上,这将使第二个查询的运行速度与第一个查询一样慢,因为它删除了使用并行性的功能,而这并不是我想要的。