建索引是为了提高查询效率,跟你怎样写select语句没多大关系

解决方案 »

  1.   

    solidpanther那他为什么不直接用查询索引表的机制查询普通表呢,索引里的内容应该与实际内容一样呀,他怎么就会快很多呢?
      

  2.   

    如果一个表没有创建索引,则数据行不按任何特定的顺序存储。这种结构称为堆集。SQL Server 索引的两种类型为: 聚集 
    聚集索引基于数据行的键值在表内排序和存储这些数据行。由于数据行按基于聚集索引键的排序次序存储,因此聚集索引对查找行很有效。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。数据行本身构成聚集索引的最低级别。只有当表包含聚集索引时,表内的数据行才按排序次序存储。如果表没有聚集索引,则其数据行按堆集方式存储。非聚集 
    非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。在非聚集索引内,从索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。对于有聚集索引的表,行定位器是聚集索引键。只有在表上创建了聚集索引时,表内的行才按特定的顺序存储。这些行就基于聚集索引键按顺序存储。如果一个表只有非聚集索引,它的数据行将按无序的堆集方式存储。
      

  3.   

    rouqu
    按你这意思,是不是说,先以索引定一个大致位置,比如a的范围是在10-50行,再在该范围查找?
      

  4.   

    你说的这种情况我举个例子
    select * from table where 索引字段cc between 参数A and 参数B
    索引字段cc上做簇级索引
    直接在A-B的物理区域做扫描
      

  5.   

    SQL Server 的数据库中按存储结构的不同将索引分为两类:簇索引(Clustered Index)和非簇索引(Nonclustered Index)。     簇索引簇索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即簇索引与数据是混为一体,的它的叶节点中存储的是实际的数据。由于簇索引对表中的数据一一进行了排序,因此用簇索引查找数据很快。但由于簇索引将表的所有数据完全重新排列了,它所需要的空间也就特别大,大概相当于表中数据所占空间的120% 。表的数据行只能以一种排序方式存储在磁盘上,所以一个表只能有一个簇索引。     非簇索引非簇索引具有与表的数据完全分离的结构,使用非簇索引不用将物理数据页中的数据按列排序。非簇索引的叶节点中存储了组成非簇索引的关键字的值和行定位器。行定位器的结构和存储内容取决于数据的存储方式。如果数据是以簇索引方式存储的,则行定位器中存储的是簇索引的索引键;如果数据不是以簇索引方式存储的,这种方式又称为堆存储方式(Heap Structure),则行定位器存储的是指向数据行的指针。非簇索引将行定位器按关键字的值用一定的方式排序,这个顺序与表的行在数据页中的排序是不匹配的。由于非簇索引使用索引页存储因此它比簇索引需要更多的存储空间且检索效率较低但一个表只能建一个簇索引,当用户需要建立多个索引时就需要使用非簇索引了。从理论上讲,一个表最多可以建249 个非簇索引。
      

  6.   

    但是索引不能完全与内容对应呀?
    ----
    当然要对应(索引表)
    字段A  行定位
    v102     xxx.页2地址.行3地址
    v104     xxx.页4地址.行8地址  -------非簇级索引大致理解
    ...
    v074     xxx.页1地址.行6地址~~~~
    字段A  行定位
    v102     xxx.页2地址.行3地址
    v103     xxx.页2地址.行4地址  -------簇级索引大致理解
    ...
    v110     xxx.页2地址.行11地址理解不对的地方大家纠正