none
索引问题 RRS feed

  • 问题

  • 1,一个大数据表中,建有很多非聚集索引,如果再增加个聚集索引,是否会提高非聚集索引的查询速度?
    2,一个大数据表中,Group by 字段1,字段2 后 查询会很慢,如何提高效率?
    3,一个大数据表中,联合索引和单独的索引查询效率更高?
    2009年11月5日 9:03

答案

  • 1,一个大数据表中,建有很多非聚集索引,如果再增加个聚集索引,是否会提高非聚集索引的查询速度?
    2,一个大数据表中,Group by 字段1,字段2 后 查询会很慢,如何提高效率?
    3,一个大数据表中,联合索引和单独的索引查询效率更高?

    樓主的提的問題,效率要從多方面入手。
    大表可用SQL2005的分區表,通常會提高一倍的速度。
    索引選擇要根據實現SQL應用而定。

    ROY WU(吳熹)
    2009年11月5日 11:03
    版主
  • 1,一个大数据表中,建有很多非聚集索引,如果再增加个聚集索引,是否会提高非聚集索引的查询速度?
    2,一个大数据表中,Group by 字段1,字段2 后 查询会很慢,如何提高效率?
    3,一个大数据表中,联合索引和单独的索引查询效率更高?

    1、不一定
    2、合式的索引、联结方式、用分区表
    3、这个不好说,看SQL及数据而定
    More: blog.csdn.net/happyflystone
    2009年11月5日 14:06
  • 1 不一定
       举两个例子:
        当表为heap是,非聚集索引的索引页内包含包含这索引键和指向实际数据行的定位标记(RID). 当表被频繁更新时,可能产生forward pointer。 例如表t有一个非聚集索引,并且表t包含一个数据行rowA,该数据行位于page1,当rowA中的一列被更新,导致page1无法容纳rowA,这是sqlserver会将rowA转移到有空间的数据页(pageB),而rowA在page1原来的位置被forward pointer代替(这个forward pointer指向rowA实际的位置)。 如果表中包含大量的forward pointer,当利用非聚集索引查询数据并需要读取基表数据时就会产生额外的逻辑读,这是就会造成性能的下降。如果表创建了聚集索引,就不存在forward pointer的问题,从这点上说,创建聚集索引是有优点的。
       
       假设有表t,包含列c1,c2,c3,c4,c5. 创建了非聚集索引index1,索引键值为c2,有如下的查询select name from t
        如之前所说,当表建立了聚集索引之后ci,索引键值为c1,index1的每一行都包含了聚集索引键. 对于之前的查询,聚集索引并不能提供什么帮助。相反的,如果c1所占的空间很大,会降低到index1每一页所容纳的索引行数,导致查询时性能的下降
       

        还有其他的情况就不一一列举了。


    2 在合适的列创建一个聚集索引,可以保证数据是排序的。效果会好一些
        
    3 不一定,根据查询而定吧。没有一定的事情


    有dba的职位吗
    2009年11月7日 15:37
    版主
  • 并非所有索引都能提高查询速度,可能效率还差了,例如A表,B表有很多数据,在A表的外键(B表的主键)加上索引就可以了。

    2009年11月8日 8:01

全部回复

  • 1,一个大数据表中,建有很多非聚集索引,如果再增加个聚集索引,是否会提高非聚集索引的查询速度?
    2,一个大数据表中,Group by 字段1,字段2 后 查询会很慢,如何提高效率?
    3,一个大数据表中,联合索引和单独的索引查询效率更高?

    樓主的提的問題,效率要從多方面入手。
    大表可用SQL2005的分區表,通常會提高一倍的速度。
    索引選擇要根據實現SQL應用而定。

    ROY WU(吳熹)
    2009年11月5日 11:03
    版主
  • 1,一个大数据表中,建有很多非聚集索引,如果再增加个聚集索引,是否会提高非聚集索引的查询速度?
    2,一个大数据表中,Group by 字段1,字段2 后 查询会很慢,如何提高效率?
    3,一个大数据表中,联合索引和单独的索引查询效率更高?

    1、不一定
    2、合式的索引、联结方式、用分区表
    3、这个不好说,看SQL及数据而定
    More: blog.csdn.net/happyflystone
    2009年11月5日 14:06
  • 1 不一定
       举两个例子:
        当表为heap是,非聚集索引的索引页内包含包含这索引键和指向实际数据行的定位标记(RID). 当表被频繁更新时,可能产生forward pointer。 例如表t有一个非聚集索引,并且表t包含一个数据行rowA,该数据行位于page1,当rowA中的一列被更新,导致page1无法容纳rowA,这是sqlserver会将rowA转移到有空间的数据页(pageB),而rowA在page1原来的位置被forward pointer代替(这个forward pointer指向rowA实际的位置)。 如果表中包含大量的forward pointer,当利用非聚集索引查询数据并需要读取基表数据时就会产生额外的逻辑读,这是就会造成性能的下降。如果表创建了聚集索引,就不存在forward pointer的问题,从这点上说,创建聚集索引是有优点的。
       
       假设有表t,包含列c1,c2,c3,c4,c5. 创建了非聚集索引index1,索引键值为c2,有如下的查询select name from t
        如之前所说,当表建立了聚集索引之后ci,索引键值为c1,index1的每一行都包含了聚集索引键. 对于之前的查询,聚集索引并不能提供什么帮助。相反的,如果c1所占的空间很大,会降低到index1每一页所容纳的索引行数,导致查询时性能的下降
       

        还有其他的情况就不一一列举了。


    2 在合适的列创建一个聚集索引,可以保证数据是排序的。效果会好一些
        
    3 不一定,根据查询而定吧。没有一定的事情


    有dba的职位吗
    2009年11月7日 15:37
    版主
  • 并非所有索引都能提高查询速度,可能效率还差了,例如A表,B表有很多数据,在A表的外键(B表的主键)加上索引就可以了。

    2009年11月8日 8:01