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慢多少?这个慢可忽略不记吗?为什么?

解决方案 »

  1.   

    注意条件
    A:表t有一千万条数据,有六十个字段(其中包含B的六个字段)
    B:表t有一千万条数据,只有个字段
      

  2.   

    太粗心了,
    应该是:select code,sum(fee) from t group by code
      

  3.   

    按正常情况,A 表的占用的数据页面的数量要比 B 表大。对于 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 列上有复合非聚集索引的叶级索引页是相同的。
      

  4.   

    如果使用的都是这条语句,且字段类型,索引设置,及数据量都一样,则对两个表的时候几乎一样.
    select code , sum(fee) from t group by code
      

  5.   


    to #5  、#6:1、老乌龟的看法和#5楼猫兄的看法不一样,该听谁的??
    2、自己总感觉索引对group by 的作用不大?高手们怎么看??
      

  6.   

    group by 有两种算法:
    ORDER GROUP,在处理 GROUP BY 操作时先进行排序,再从已排序的数据中进行分组,此时返回的分组结果将是排序顺序。
    HASH GROUP,在处理 GROUP BY 操作时将数据按分组的条件组织到哈希表中,哈希桶中存放的即是分组结果,此时返回的分组结果将是数据在哈希桶中的存放顺序。后一种算法适用于数据量较少的情况。因此对于 lz 的情况,sql server 将会使用前一种算法。
    正如 #5 所说的,如果有适当的索引,group by 将不再需要重新排序,可以大大提升性能。其实,lz 可以自己做个测试,看看 group by 的执行计划和所需的代价。实践是
      

  7.   

    sql77、TONY、小F、KG、狙击手,苦行僧
    高手们一起过来看看小弟的问题吧,先谢了
      

  8.   

    谢谢tony哥的指点,谢谢猫兄和老乌龟的回复
    我还是想请更多的高手看一下,主要是看我在#8楼的疑问,
    sql77、小F、KG、狙击手,苦行僧
    高手们一起过来看看小弟的问题吧,先谢了