A:表t有一千万条数据,有六十个字段(其中包含B的六个字段)
B:表t有一千万条数据,只有六个字段a、b两种情况
相同的地方:
都是一千万条数据,
都有字段fee、code,其中code有200万个不同的值。不同是:
A有六十个字段(其中包含B的六个字段)、B有六个字段.sql server读取数据是先把数据页读到内存里,再从内存中读出数据来sql:select sum(fee) from t group by code针对上面这条sql,
a比b慢,因为a的数据页肯定比b多问题:
1、慢的只是把数据页读到内存里的过程吗?
2、A比B慢多少?这个慢可忽略不记吗?为什么?
A:表t有一千万条数据,有六十个字段(其中包含B的六个字段)
B:表t有一千万条数据,只有六个字段
应该是:select code,sum(fee) from t group by code
如果两张表的 code 列上没有聚集索引,或者 code 和 fee 列上没有复合索引,查询语句主要的操作代价在于“表扫描”和“排序”上,显然查询语句对于 A 表执行表扫描需要更多的 I/O,而对于两张表的排序操作,都是对 code 和 fee 列进行的,因此查询语句对两张表的排序操作的代价都是基本相同的。如果两张表的 code 列上有聚集索引,查询语句主要的操作代价在“clustered index scan”,显然查询语句对于 A 表执行 clustered index scan 需要更多的 I/O,因为 A 表的占用的数据页面的数量要比 B 表大。
而如果两张表的 code 和 fee 列上有复合非聚集索引,查询语句主要的操作代价在“nonclustered index scan”,显然查询语句对于 A 和 B 表所需的 I/O 都是相同的,因为 A 和 B 表的 code 和 fee 列上有复合非聚集索引的叶级索引页是相同的。
select code , sum(fee) from t group by code
to #5 、#6:1、老乌龟的看法和#5楼猫兄的看法不一样,该听谁的??
2、自己总感觉索引对group by 的作用不大?高手们怎么看??
ORDER GROUP,在处理 GROUP BY 操作时先进行排序,再从已排序的数据中进行分组,此时返回的分组结果将是排序顺序。
HASH GROUP,在处理 GROUP BY 操作时将数据按分组的条件组织到哈希表中,哈希桶中存放的即是分组结果,此时返回的分组结果将是数据在哈希桶中的存放顺序。后一种算法适用于数据量较少的情况。因此对于 lz 的情况,sql server 将会使用前一种算法。
正如 #5 所说的,如果有适当的索引,group by 将不再需要重新排序,可以大大提升性能。其实,lz 可以自己做个测试,看看 group by 的执行计划和所需的代价。实践是
高手们一起过来看看小弟的问题吧,先谢了
我还是想请更多的高手看一下,主要是看我在#8楼的疑问,
sql77、小F、KG、狙击手,苦行僧
高手们一起过来看看小弟的问题吧,先谢了