SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 <第八篇>

聚集索引、非聚集索引、非聚集唯一索引

  我们都知道建立适当的索引能够提高查询速度,优化查询。先说明一下,无论是聚集索引还是非聚集索引都是B树结构

  •   聚集索引默认与主键相匹配,在设置主键时,SQL Server会默认在主键列创建聚集索引。但是可以手动更改为在任意一个列创建聚集索引,然后在另一个字段或多个字段上定义主键。这时主键将会被作为一个唯一的非聚集索引(唯一索引)被创建。通过指定NONCLUSTERED关键字就可以做到。

    CREATE TABLE MyTableKeyExample
    {Column1 int IDENTITY  KEY NONCLUSTERED,Column2 int
    }

  •   聚集索引实际上装载了SQL Server的数据记录行,聚集索引的叶级就是数据行,所以到达了聚集索引的叶级就到达了数据。
  •   为表声明主键或唯一约束时,SQL Server会自动创建与之对应的唯一索引。
  •   聚集索引的列最好就是自增的,因为根据区段-页的理论,如果聚集索引列是自增的,那么添加数据的时候,所见是放在索引的最后,不会发生由中间插入的情况,这样就不会引起页拆分。而如果索引列不是自增的,添加数据的时候,还要按顺序找到该条记录的位置,并且插入,如果插入比较频繁,还可能会经常引起页拆分。
  •   聚集索引的最佳数据类型,smallint、int、bigint、datetme。
  •   最好避免组合聚集索引。

  索引(index)是除了表之外的另一个重要的、用户定义的存储在数据库里的数据结构。当根据索引码的值搜索数据时,索引提供了对数据的快速访问。事实上,没有索引数据库也能够根据SELECT语句通过表扫描成功地检索到结果,但是随着表变得越来越大,使用“适当”的索引的效果就越来越明显。但如果使用索引时不认真考虑其实现过程,索引反而有可能会降低数据库的工作性能。创建主键时会自动创建聚集索引,除非当前表中已经含有了聚集索引或是创建主键时指定了NONCLUSTERED关键字。

  聚集索引、非聚集索引、非聚集唯一索引:

  SqlServer提供了两种索引:聚集索引和非聚集索引。聚集的作用就是将某一列(或是多列)的物理顺序改变为和逻辑顺序相一致。

  聚集索引(CLUSTERED)与非聚集索引(NONCLUSTERED)的区别:

  其实,我们的汉语字典的正文本身就是一个聚集索引(按照拼音的英文字母排序) 比如,我们要查“安”字 ,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字 母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的 字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。 这也是为什么一张表只能 够有一个聚集索引的原因。因为一张表只能够按一种方式排序。 其中聚集索引的叶级节点就是数据。你可以理解为有很多列火车,按照火车头索引(排序),火车头后面跟着的就是数据。
  如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张” 的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是 “弩”字,页面390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩” 三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

  实际上如果表上有聚集索引,则非聚集索引中存储着聚集索引的引用,然后通过利用聚集索引来获取数据。因此这就是为什么返回少量数据的时候使用非聚集索引的性能较好,而返回大量的数据的时候使用非聚集索引还不如直接全表扫描来得快。而如果表上没有聚集索引的时候,则引用行号。

  非聚集索引需要额外的空间进行存储,按照被索引列进行聚集索引,并在B树的叶子节点包含指向非聚集索引所在表的指针。非聚集索引也是B树结构,另外一个单独的B树。

  唯一索引:

  当主键创建时如果不设置为聚集索引,那么就一定是唯一的非聚集索引。实际上,唯一索引,故名思议就是它要求该列上的值是唯一的。

  聚集索引列可以重复,非聚集索引列也可以重复。这就是为什么要有唯一这个东东了。声明唯一索引的语法很简单,只是多了个UNIQUE关键字。

  CREATE UNIQUE NONCLUSTERED INDEX [AK_Product_Name] ON Production.Product ( [Name] );

  唯一索引有很多限制和特性。下面详细学习下唯一索引。

  为表声明主键或唯一约束时,SQL Server会自动创建与之对应的唯一索引。定义一个唯一约束时,SQL Server会自动创建一个与之同名的唯一索引,要删除索引必须先删除约束。但删除约束,删除约束也会导致与之关联的索引被删除,也就是说,不能删除唯一索引,要删除索引只有删除唯一约束这个办法。

  唯一索引依赖于唯一约束,删除唯一索引必须删除唯一约束。另外SQL Server又在建立唯一约束时又默认建立唯一索引。

  总结起来就是:唯一索引与唯一约束始终一同存在。

  因为定义一个主键或是定义约束会导致索引被创建,所以你必须在约束定义时就给出必要的索引信息,因此上面ALTER TABLE语句中包含了”CLUSTERED”关键字。

ALTER TABLE Production.Product ADD CONSTRAINT PK_Product_ProductID PRIMARY KEY
CLUSTERED ( ProductID );

   如果唯一索引或约束所约束的列在当前的表中已经含有了重复值,那么创建索引会失败。而当唯一索引创建成功后,所有违反这个约束的INSERT、UPDATE语句都会失败。

消息 2601,级别 14,状态 1,第 1 行
不能在具有唯一索引 'AK_Product_Name' 的对象
'Production.Product' 中插入重复键的行。
语句已终止。 

  唯一约束和唯一索引并没有显著的区别。创建独立的唯一索引和使用唯一约束对于数据的验证方式并无区别。查询优化器也不会区分唯一索引是由约束创建还是手工创建。然而以数据完整性为目标的话,最好创建约束,这使得对应的索引的目标一目了然。

  过滤唯一索引,当我们需要既允许多个NULL值,又不允许重复的时候,可以使用这个:

  CREATE UNIQUE NONCLUSTERED INDEX xx on ProductDemo(<索引列>)  --指定索引列where <索引列>!=null)  --过滤条件

  对于用以上语法创建的唯一索引,插入时,只有当唯一索引列不为NULL的时候才检测重复。换句话说,以上表的索引列允许多个NULL值。

posted on 2014-07-02 16:37 铭轩同学 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mingxuantongxue/p/3820577.html

SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 第八篇相关推荐

  1. SQL server学习(四)T-SQL编程之事务、索引和视图

    今天来分享下T-SQL高级编程中的事务.索引.视图,可以和之前的SQL server系列文章结合起来. 一.事务 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个 ...

  2. oracle主键和唯一索引,Oracle 主键、唯一键与唯一索引的区别

    如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响? SQL> drop table test purge; Table dropped. SQL> cre ...

  3. [存储过程]sql server 中 统计一条记录中 非空 字段个数 ,并且计算它所占百分比

    integrity 是表中存放非空字段百分比 的字段 companyName 等字段是参与统计的成员 看代码 drop procedure update_company_intergrity ; cr ...

  4. 把Oracle数据库移植到Microsoft SQL Server 7 0

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 把Ora ...

  5. SQL Server的聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)-- (一) ...

  6. [转]聚集索引和非聚集索引(sql server索引结构及其使用)

    聚集索引和非聚集索引(sql server索引结构及其使用) [来自]http://www.cnblogs.com/xinqqing83/archive/2006/10/31/545747.html ...

  7. SQL Server临界点游戏——为什么非聚集索引被忽略!

    当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: 1 CREA ...

  8. SQL Server中的聚集索引(clustered index) 和 非聚集索引 (non-clustered index)

    1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 2. 聚合索引和非聚合索引有什么区别? 深入浅出理解索引结构 实际上,您可以把索 ...

  9. Sql Server 创建唯一聚集索引典型实现

    创建唯一聚集索引典型实现 唯一索引可通过以下方式实现: PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动 ...

  10. SQL Server Insert 操作效率(堆表 VS 聚集索引表)

    "SQL Server的Insert操作在堆表或者聚集索引表的时候,哪个效率更高?为什么高?" 之前有同事问过我这个问题,为了确保日志库的记录效率,于是我做了简单测试了,首先要先强 ...

最新文章

  1. 国外物联网平台初探(四):Ayla Networks
  2. Linux_LVMQuota
  3. Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法
  4. 如何用Transformer来做目标检测?一文简述DERT及其变体
  5. 云联会企业认证_今日新鲜事:沉浸式交互购车新体验 2020首届中国春季云车展启幕...
  6. ORACLE 动态SQL中的多个单引号
  7. 5G(4)---5G 标准
  8. python按键盘上哪个键运行_python按什么键运行
  9. redis和zookeeper安装教程并配置开机自启
  10. WPF MVVM 网易云音乐
  11. 数据结构之红黑树插入案例详解
  12. 基于51单片机的扫地小车,扫地机器人设计。 有原理图,程序代码,原文
  13. 机器学习提高准确率的一些思路和技巧
  14. 脚本安装爱普生790K打印机安装完成之后销毁程序(其他版本打印机更换inf文件即可)
  15. Oracle bpm实现oa,Oracle BPM/SOA API 操作流程
  16. 蓝桥杯每日一练专栏导读
  17. 圣朱妮佩洛|San Junipero(5)
  18. UVM TLM2.0简单介绍
  19. c9计算机专业考研哪个容易,二本考研考C9是什么难度?有可能吗?
  20. Gradle不能加载依赖包的问题

热门文章

  1. 树莓派能跑matlab,Matlab树莓派硬件支持平台的搭建
  2. LM358恒流恒压原理
  3. Win10系统下安装Ubuntu系统(双系统)
  4. 废旧手机改造成好玩的天气暗示相框
  5. 四、ARDUINO UNO开发板介绍
  6. 《觉醒年代》掀观剧热潮,年轻人为什么爱看主旋律了?
  7. 金融安全视角农民投资理财的实证研究——以X县为例
  8. 腾讯安全发布《零信任解决方案白皮书》
  9. 抖音短视频去水印教程
  10. 夺灵者哈卡(Hakkar, the Soulflayer)