读书人

抉择这个字段作聚集索引合理吗

发布时间: 2014-01-08 00:30:58 作者: rapoo

选择这个字段作聚集索引合理吗?
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、如果你的系统,插入操作比较多的话,可以考虑用填充因子,也就是预留一部分空闲空间,然后大量插入的时候,就不用经常的进行页的分裂,那么效率就提高了。

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

读书人网 >SQL Server

热点推荐