聚集索引是直接与数据在磁盘上排布相关。
这个说法是否正确:如果从表中任意删除记录,sql server是否都要按聚集索引重新组织数据的磁盘排布。也可以说聚集索引的维护,是一个很耗时的过程,效率会比较低。
有文章里推荐在标识字段上创建聚集索引,数据表总会删除记录的,是不是建立非聚集索引会更利于性能,而不是聚集索引

解决方案 »

  1.   

    ---使用索引优化数据库查询效率
    1.不宜创建索引的情形
    (1)经常插入,修改和删除的表
    (2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间2.适合创建索引的情形
    (1)为where子句中出现的列创建索引
    (2)创建组合索引
    (3)为group by 子句中出现的列创建索引3.聚集索引的设计原则
    (1)该列的数值是唯一的或者很少有重复的记录
    (2)经常使用between ...and..按顺序查询的列
    (3)定义identity的唯一列.
    (4)经常用于对数据进行排序的列.---无法使用索引的select语句
    1.对索引列使用了函数,如:
    select * from tb where max(id)=1002.对索引列使用了'%xx',如:
    select * from tb where id like '%1'
    需要注意的不是所有使用like关键字的select 语句都无法使用索引,比如
    select * from tb where id like '1%'就可以使用索引3.在where子句中对列进行类型转换(其实也是使用到了函数)4.在组合索引的第1列不是使用最多的列,如在下面3个查询语句中建立组合索引,按顺序包含col2,col1,id列;
    select * from tb where id='1' and col1='aa'
    select id,sum(col1) from tb group by id
    select * from tb where id='2' and col2='bb'
    则第一句和第二句无法使用到索引 所以需要注意组合索引的顺序5.在where 子句中使用in关键字的某些句子
    当在in关键字后面使用嵌套的select语句,将无法使用在该列上定义的索引
    如:
    select 
     *
    from
     ta 
    where
     id 
    in
     (select id from tb where ....)--这样可以用到索引
    select * from tb where id in('1','2')本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2010/01/12/5183068.aspx
      

  2.   

    假设在这个表里
    id value
    1 v1
    2 v2
    3 v3
    4 v4
    5 v5
    6 v6
    7 v7
    8 v8
    9 v9
    10 v10
    11 v11
    12 v12
    13 v13
    14 v14
    15 v15id列建有聚集索引。把8,9,10三行数据删掉后,这时会不会立即回收这三行的空间?
    如果立即回收,sql server的运行速度肯定会大打折扣;
    如果不立即回收,新插入记录肯定不会再使用这块空间(如果使用就不是聚集索引了)。
    这块空间是不是只有等到收缩数据库时才会回收?如果这样的话,建聚集索引的优势在哪里?