SQL Server - 使用group by聚合比没有聚合更快

时间:2012-10-03 16:56:19

标签: sql indexing group-by aggregate sql-execution-plan

我很难弄清楚为什么在一种情况下强制执行特定的执行计划,而在另一种情况下却没有。例如:

select min(COLUMN) from TABLE where FK_COLUMN = 1;

VS

select min(COLUMN) from TABLE where FK_COLUMN = 1 group by FK_COLUMN;

第一个产生具有索引扫描的执行计划,而在第二个中,扫描被替换为搜索。进一步增加我的困惑的事实是,这不会发生在表格的每一列上 - 对于某些列我不需要该组,以便产生搜索。我还注意到,慢速条件仅发生在某些外键值 - 仅返回没有行的值,但不返回没有返回任何行的所有值都会产生不利的计划。是什么给了什么?

1 个答案:

答案 0 :(得分:1)

我选择@Robbie Dee作为Oracle CBO选择的执行计划并不意味着它是最好的方式,但在大多数情况下是最优化的方式。 此外,执行计划可以根据列和行的存储方式(基本上是表的大小)进行更改。

考虑在EMP_ID列上主键控制的EMP表。如果我们在搜索中包含主键列,我们会期望INDEX RANGE SCAN,但我们可能会在解释计划中获得FULL TABLE ACCESS。这是Oracle CBO选择的数据访问路径,因为它知道表的大小太小而不需要基于主键进行搜索。

... H个