当前位置: 代码迷 >> Sql Server >> 高分请问:唯一索引的创建选聚集还是非聚集,详见帖子
  详细解决方案

高分请问:唯一索引的创建选聚集还是非聚集,详见帖子

热度:59   发布时间:2016-04-24 09:50:48.0
高分请教:唯一索引的创建选聚集还是非聚集,详见帖子
create table test(
user_id int,
data_id int,
value   int
)

CREATE NONCLUSTERED INDEX [IX_data_id] ON [dbo].[test] 
(
[data_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IX_user_id] ON [dbo].[test] 
(
[user_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IX_user_data_id] ON [dbo].[test] 
(
[user_id] ASC,
[data_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]


一、表结构如上。现有3个约束;没有主键;然后就是value上有默认约束
二、常用操作:
1、查询user_id为指定值的所有记录
2、修改user_id和data_id为指定值的一条记录的value字段(增加、减少一定数值)
3、如果操作2中把value变为0,删除改条记录(也可以不删除,目前的逻辑是删除的)
4、插入新的一列
三、其他:
userid范围以百万计,data_id很小,应该以百计,应该不会超过500

四、要求:现在要求在user_id和data_id具有联合的唯一性
五、问题:
1、创建联合主键、唯一索引选取哪个更好点
2、主键/唯一所以,使用聚集还是非聚集好点

3、唯一索引与唯一约束区别,

请不吝赐教,请给出比较详细的理由,
定当高分感谢
------解决思路----------------------
主键默认是聚集索引。
------解决思路----------------------
1、只要一个聚集的联合主键 (user_id,data_id)
2、user_id,data_id 不会变,聚集!
3、唯一约束会自动创建唯一索引,所以显示创建唯一索引就够了,没想到创建唯一约束的必要。
------解决思路----------------------
1、设置主键,同时也会在此之上建立聚集索引。
看类型应该不是很复杂的字符串之类的id数据,所以聚集索引会很合适。
2、同1,设置了主键,也就没有必要在建立唯一约束了,因为主键已经唯一了。
3、唯一约束可以用于保证在基表中增加一条记录时,一个或多个列值是唯一的。
如果已经给一个或以上列定义了唯一约束,那么任何操作都不可能替换这些列中的复制的值。尽管唯一的、系统要求的索引是用来加强唯一约束,但是定义唯一约束和创建唯一索引之间还是有区别的。即使这二者之间都可以增强唯一性,唯一索引允许NULL值并且一般不能用在指示性约束中。换句话说,唯一约束不允许NULL值并能在外键规范中使用( "NULL"的意思就是列值不明确并且和其他值不同,还包括其他NULL值)。
------解决思路----------------------
以下是个人建议,欢迎讨论。
1、创建联合主键、唯一索引选取哪个更好点

user_id和data_id具有联合的唯一性 ,这说明,这两列都是业务数据,不建议在业务数据上建立 PK, 建议唯一索引;

2、主键/唯一所以,使用聚集还是非聚集好点

数据改动较大的话不建议聚集,如果有较小的变动,并且查询较多,聚集索引是个不错的选择,这个你自己根据实际情况去权衡;
3、唯一索引与唯一约束区别,

唯一索引,很显然,就是一个索引,所占用你的空间,来存储这些索引数据,当然某些语句会使用该索引,提高性能;
唯一约束,只是在数据插入或更新时,检查有无重复,没有额外的存储,不会对帮助查询语句提交性能。
------解决思路----------------------
data_id因为他不是复合中的第一列,他不会走索引,如果你考虑效率的话,说不定还得为data_id建个单列索引
------解决思路----------------------
返璞归真,严格按照微软官方对于索引的规定和建议理解来操作
------解决思路----------------------
其实楼上各位大师都已经总结的很清楚了:
1、创建联合主键、唯一索引选取哪个更好点
      如果创建了联合主键,就不必再选唯一索引了,因为默认情况下主键就是唯一聚集的

2、主键/唯一所以,使用聚集还是非聚集好点
           
        选聚集和非聚集的话要看具体业务,如果业务只是查询,建议建聚集索引,聚集索引的效率同等条件下相对高于非聚集索引,
        如果对添加聚集索引字段会发生频繁且数据量较大的更新操作,建议使用非聚集索引,因为聚集索引确定表中记录的物理顺序,更新操作也会更新索引,这样会降低更新速度,而通过你说的每次只是对特定的user_id或data_id做更新操作,数量级别应该不会很大,其实更新效率估计不会有明显影响吧

3、唯一索引与唯一约束区别,

索引的作用就是为了提高查询效率的
而约束是为了保证数据的完整性,具体就是唯一性

建了唯一索引后其实也能保证值不重复,在某种层面上说没有什么区别,只是开发者设计之初的一个设计需要吧
  相关解决方案