当前位置:首页 » 编程语言 » sql不唯一

sql不唯一

发布时间: 2023-05-11 02:48:53

sql Server唯一索引和非唯一索引的区别简析

1. 在表和索引设计阶段,如果配卜可能,字段设定为不允许NULL,索引设定为唯一。这样节约存储空间并提高了IO效率。
2. 聚集索引键列应该尽量选用窄的字段,因为非聚集索引会引用其键列。如果聚集键过大则会使非聚集索引同时也占用更多存储空间。
3. SQL Server在创建索引时,默认是创建非唯一的培旦穗。所以在创建索引时,要认真考虑是否可迟耐以创建为唯一索引。

㈡ SQL Server唯一索引和非唯一索引的区别简析

SQL Server创建索引时,可以指定Unique使之成为唯一索引。“唯一”顾名思义,但是两都到底有什么区别呢?因为索引也是一种物理结构,所以还是要从存储和结构上分析。

索引结构分叶级和非叶级,分析时我们要分开来看,这个很重要。

文中涉及的索引行大小计算,参考MSDN估计数据库大小索引部分。

1. 非唯一聚集索引和唯一聚集索引

创建两个测试表,各10000条整数,tb1唯一,tb2非唯一,有1000条为9999的重复值。

view sourceprint?

01.<img onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_402704').style.display='none'; document.getElementById('Code_Open_Image_402704').style.display='inline'; document.getElementById('Code_Open_Text_402704').style.display='inline';"id="Code_Closed_Image_402704"align="top"src=""width="11"height="16"style="display: none;"><img alt="加载中..."title="图片加载中..."src="http://www.it165.net/statics/images/s_nopic.gif"><img onclick="this.style.display='none'; document.getElementById('Code_Open_Text_402704').style.display='none'; getElementById('Code_Closed_Image_402704').style.display='inline'; getElementById('Code_Closed_Text_402704').style.display='inline';"id="Code_Open_Image_402704"style="display: none;"align="top"src=""width="11"height="16"><img alt="加载中..."title="图片加载中..."src="http://www.it165.net/statics/images/s_nopic.gif">Codecreate table tb1

02.(col1int);

03.declare@iint=1

04.while@i<10001

05.begin

06.insert into tb1 values(@i);

07.set@i=@i+1;

08.end;

09.create unique clustered index ucix on tb1 (col1)

10.go

11.-------

12.create table tb2

13.(col2int);

14.declare@iint=1

15.while@i<9001

16.begin

17.insert into tb2 values(@i);

18.set@i=@i+1;

19.end;

20.go

21.insert into tb2 values(9999)

22.go1000;

23.create clustered index cix on tb2 (col2)

24.go

先查询索引的一些基本状况:

发现多出一个UNIQUIFIER,同样叶级也是一样。MSDN说明:

“如果聚集索引不是唯一的索引,SQL Server 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。”

还有UNIQUIFIER不是一个全局自增列,重复记录增加时此值会发生改变,并且它是一个可为null的变长列。

现在来算一算索引行大小:

两个表都是只有一个int型可为NULL的字段,而聚集索引叶级是存储数据本身

叶级是一个4字节的INT列,无变长列,加上3字节的NULL位图,再加上4字节的行头开销:两个表的叶级minSize =4+0+3+4=11

非叶级是一个4字节的INT列,无变长列,加上3字节的NULL位图,加上1字节的行头开销,再加6字节的子页指针:两个表的非叶级minSize=4+0+3+1+6=14

tb1的索引行大小是一致的minSize=maxSize,因为它是唯一的。tb2的索引行大小不一致,有大有小,大的索引行是因为:a)不唯一 b)UNIQUIFIER

唯一标识列增加了2+1*2+4=8字节开销,tb2的min和max相差就是这8字节。

tb2的叶级maxSize=4+8+3+4=19

tb2的非叶级maxSize=4+8+3+1+6=22

小结:非唯一聚集索引为保证索引键值唯一性,会生成UNIQUIFIER与键列一起组成索引键值。同时无论在叶级还是非叶页级,都比唯一索引占用更多存储空间。

㈢ SQL server 建立的触发器子查询返回值不唯一,需要用多个返回值如何操作

问题在
(select商品数目 from购物袜梁车细则where购物车细则.购物车编号=购物车编号)。
这里面商品数目是多条。
改为
(select商品数目 from购物车细则where购物车细则告败运.购物车编号=购物枯带车编号 and 购物车细则.商品编号=商品.商品编号)

㈣ SQL SERVER中怎么样在主关键字上创建聚集不唯一索引

一个表只能有一个 聚集索引 ,但可以有多个野纳神 非聚集索引 设置某列为主键,则该列就默认为 聚集索引;
创建了唯一茄陪约束,将自动为其创建 唯一索引, 唯一索引的性能 往往是很差的,所以 建议使颂亏用 主键约束;相信您的问题已经得到了解答。。

㈤ SQL SERVER中怎么样在主关键字上创建聚集不唯一索引

呵,你可以试着在建表时,建双主键!

或者,建一张关联表,把第一张表的主建,和要让桐关联的第二张的主坦州坦建,都放在第三迹铅张表去,然后进行关联查寻!这样表与表之间就能相互取值了

㈥ sql把两个结果集一对一连接但字段不唯一

关联问题。在sql里两张表帆数中的关联字段都是唯一的,关联之后关联字段竟然不态锋首唯一了。SQL是具有数据操纵和数据定义等多种功能的数据库语言基者,这种语言具有交互性特点。

㈦ 数据库语句返回记录不唯一,会出现什么现象

返回数据不唯一,就把符合SQL语句条件的所有项都列出来。
查询语句不会只轮郑用于精确定位查找,还会有泛查找,比如符合每个条件的许多人,例如都是20岁的,或者都大于多少小于多少等等。
你问这个问题,表示你对SQL语句很不熟悉顷亩,只要你的语句是对的,你的数据库不要太庞大(如果你查雀桐森询的范围太广,会耗费非常大的资源),就OK

热点内容
数据库的根本目标 发布:2025-07-18 21:37:50 浏览:937
压缩机的流速 发布:2025-07-18 21:37:40 浏览:406
三星怎么取消手机密码 发布:2025-07-18 21:33:50 浏览:629
安卓手机耳机如何弹窗显示电量 发布:2025-07-18 21:20:53 浏览:59
云服务器搭建需要什么工具 发布:2025-07-18 20:51:08 浏览:322
如何提高手机缓存速度 发布:2025-07-18 20:24:48 浏览:237
vba读取数据库数据 发布:2025-07-18 20:24:48 浏览:608
shell解压zip 发布:2025-07-18 20:20:36 浏览:861
安卓泰拉瑞亚去哪里买 发布:2025-07-18 20:01:05 浏览:694
flash编译器 发布:2025-07-18 19:49:38 浏览:487