日期:2014-05-17  浏览次数:20488 次

选择这个字段作聚集索引合理吗?
sql2000中的一个表,保存的是几十个单位的人员名单,字段有id、单位、姓名、职务等等,数据量预计会超过百万记录。因此,想用“单位”字段作聚集索引,另用“id”等两三个常用在where中的字段再建一非聚集索引。这样设计索引是否合理?心中没底,麻烦各位帮出主意。谢谢!
------解决方案--------------------
单位+工号应该是唯一的,就用它来做唯一聚集索引吧
------解决方案--------------------
引用:
该表的id字段已设为标识字段。用单位作聚集索引字段是希望数据能按单位物理排列存储,但单位确实有很多重复值(每个单位有几千上万人),但保存后单位值是肯定不会修改的。另外,每个where语句的头一个条件一般都是“单位=‘……’ and ...”,所以才作上述考虑。标识字段好像不宜作聚集索引,是这样吗?


标识字段可以作为聚集索引,我到是建议你用标识字段。

然后,在建立几个非聚集索引,以单位字段开头,来加快搜索的速度
------解决方案--------------------
引用:
还有些疑问想请教各位:在系统开发阶段,目前数据库中的这个表还只实验性地录入了几千个记录,在建立了索引并投入使用后,将新增很多记录,预计会超过百万。那么,将来这个索引需要重建吗?如果需要,什么时候(或什么情形下)重建?另外,我没有选择填充因子(微软说不选的话默认值是0),但有的资料说对于频繁增删改的表可选10,麻烦各位给个主意。谢谢!


1、如果你的表,有频繁的增删改,那么可以进行索引的重建。

2、什么时候重建,这个得看具体情况,如果碎片率 超过30%,那么可以考虑在系统空闲的时间,特别是每天的维护期内,进行索引重建:
use master
go

select   
    DB_NAME(d.database_id),  
    OBJECT_NAME(d.object_id),  
      
    i.name,        --索引名称  
    d.index_type_desc,  
    d.alloc_unit_type_desc,  
      
    d.index_depth,  --索引的深度  
    d.index_level,  --索引当前级别  
      
    --索引的逻辑碎片百分比 
    d.avg_fragmentation_in_percent  
         
from sys.dm_db_index_physical_stats  
   (db_id('数据库名称'),   --数据库id  
    null,           --对象id:数据库名称.架构.对象名称  
    null,           --索引id  
    null,           --分区号  
    ''              --模式  
   )d  
inner join sys.indexes i  
        on d.object_id = i.object_id  
           and d.index_id = i.index_id  


3、如果你的系统,插入操作比较多的话,可以考虑用填充因子,也就是预留一部分空闲空间,然后大量插入的时候,就不用经常的进行页的分裂,那么效率就提高了。

不过,一段时间后,页还是会被填满,这个时候,通过重建索引,那么可以重排数据,然后再次给每个数据页保留一定的空闲空间