SQL Server索引进阶第八篇:唯一索引
sql索引原理

sql索引原理SQL索引原理。
SQL索引是一种用于快速查找数据库中数据的技术。
它类似于书籍的目录,可以帮助数据库系统快速定位需要的数据,从而提高查询效率。
在本文中,我们将深入探讨SQL索引的原理,包括索引的作用、类型、创建和使用等方面。
首先,让我们来了解一下索引的作用。
索引可以加快数据库中数据的检索速度,特别是在大型数据表中。
通过使用索引,数据库系统可以直接定位到符合查询条件的数据,而不需要逐行扫描整个表格。
这样就大大提高了查询效率,减少了系统的负荷。
接下来,我们来介绍一下SQL索引的类型。
常见的索引类型包括主键索引、唯一索引、普通索引和全文索引等。
主键索引是一种唯一性索引,用于保证数据表中每行数据的唯一性。
唯一索引也是一种唯一性索引,但允许有空值。
普通索引则是最基本的索引类型,没有唯一性限制。
全文索引则用于全文搜索,适用于文本字段的检索。
然后,让我们来讨论一下SQL索引的创建和使用。
在创建索引时,需要考虑到索引的字段选择、索引类型和索引的命名等因素。
通常情况下,可以通过CREATE INDEX语句来创建索引。
而在使用索引时,可以通过在查询语句中添加关键字来指定使用哪个索引,从而优化查询性能。
此外,还需要注意索引的优化和维护。
索引的优化可以通过定期分析查询性能和索引的使用情况来进行。
而索引的维护则包括索引的重建、重新组织和删除等操作,以确保索引的有效性和稳定性。
总结一下,SQL索引是一种重要的数据库技术,它可以提高数据库查询的效率。
通过了解索引的作用、类型、创建和使用等方面的知识,可以更好地应用索引来优化数据库性能。
希望本文对您有所帮助,谢谢阅读!。
sqlserver索引的原理及索引建立的注意事项小结

sqlserver索引的原理及索引建⽴的注意事项⼩结聚集索引,数据实际上是按顺序存储的,数据页就在索引页上。
就好像参考⼿册将所有主题按顺序编排⼀样。
⼀旦找到了所要搜索的数据,就完成了这次搜索,对于⾮聚集索引,索引是安全独⽴于数据本⾝结构的,在索引中找到了寻找的数据,然后通过指针定位到实际的数据。
SQL Server中的索引使⽤标准的B-树来存储他们的信息,如下图所⽰,B-树通过查找索引中的⼀个关键之来提供对于数据的快速访问,B-树以相似的键记录聚合在⼀起,B不代表⼆叉(binary),⽽是代表balanced(平衡的),⽽B-树的⼀个核⼼作⽤就是保持树的平衡。
同伙向下遍历这棵树以找到⼀个数值并定位记录。
因为树是平衡的,所以寻找任何记录都只需要等量的资源,⽽且获取的速度总是⼀致的—因为从根索引叶索引都具有相同的深度。
索引的中间层次是根据表的⾏数⼀级索引⾏的⼤⼩⽽变化的,如果使⽤⼀个较长的键(KEY)来创建索引,⼀个分页上就只容纳较少的条⽬,因⽽索引就需要更多分页(或者说更多层),页越多那么查找就需要话费相对较长的时间来找到所需要的信息,索引就可能不太有⽤了。
聚集索引的叶级别不仅包含了索引键,还包含了数据页。
另⼀种说法数据本⾝也是聚集索引的⼀部分,聚集索引基于键值保持表中的数据有序,表中的数据页是通过⼀个被称作页链(page chain)的双向链接表来维护的,由于实际的数据页的页链只能按⼀种⽅式排序,因此⼀张表只能拥有⼀个聚集索引。
这⾥可能有⼀个误区,有很多介绍SQL Server索引的⽂档会告诉读者:聚集索引按照排序顺序(sorted order)物理地存储数据。
如果以为物理存储就是磁盘本⾝的话就会产⽣误解。
试想如果聚集索引需要按照特定顺序在实际的磁盘上维护数据的话,那么任何修改操作都将会产⽣相当⾼昂的代价。
当⼀个页变满了需要⼀分为⼆的时候,所有后续页⾯上的数据都必须向后移动。
聚集索引中的排序顺序(sorted order)仅仅表⽰数据页链在逻辑上是有序的。
SQLServer索引进阶第八篇:唯一索引

索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说“成也索引,败也索引”。
本系列文章来自StairwaytoSQLServerIndexes,翻译和整理后发布在agilesharp和博客园,希望对广大的技术朋友在如何使用索引上有所帮助。
唯一索引和约束唯一索引和其它索引本质上并没有什么不同,唯一不同的是唯一索引不允许索引键中存在相同的值。
因为索引中每一个条目都与表中的行对应。
唯一索引不允许重复值被插入索引也就保证了对应的行不允许被插入索引所在的表,这也是为什么唯一索引能够实现主键和候选键。
为表声明主键或唯一约束时,SQLServer会自动创建与之对应的唯一索引。
你可以在没有唯一约束的情况下创建唯一索引,但反之则不行。
定义一个约束时,SQLServer会自动创建一个与之同名的索引,并且你不能在删除约束之前删除索引。
但可以删除约束,删除约束也会导致与之关联的索引被删除。
每个表中可以包含多个唯一索引。
比如说AdventureWorks的Product表,含有四个唯一索引,分别是ProductID,ProductNumber,rowguid和ProductNameColumn,设置Product表的人将ProductID作为主键,其它三个作为候选键。
你可以通过CreateINDEX语句创建唯一索引,比如:CREATEUNIQUENONCLUSTEREDINDEX[AK_Product_Name]ONProduction.Product( [Name]);也可以通过直接定义约束创建唯一索引:ALTERTABLEProduction.ProductADDCONSTRAINTPK_Product_ProductIDPRIMARYK EYCLUSTERED(ProductID);上面第一种方法,你Prodcut表中不能含有相同的ProductName,第二种情况表中不允许存在相同的ProductID。
sqlserver 索引用法

标题:深入了解SQL Server索引的用法摘要:本文将深入探讨SQL Server索引的用法,包括索引的概念、创建、优化和使用技巧,帮助读者更好地利用索引提高数据库的性能。
一、索引的概念1. 什么是索引在SQL Server中,索引是一种特殊的数据结构,用于快速定位和访问数据库表中的数据。
通过索引,可以加快数据检索的速度,提高查询性能。
2. 索引的作用索引可以帮助数据库引擎快速定位到符合查询条件的数据,减少数据库的扫描和比对操作,从而提高数据检索的效率。
二、创建索引1. 创建索引的语法在SQL Server中,可以通过CREATE INDEX语句来创建索引,语法如下:```CREATE INDEX index_nameON table_name (column1, column2, ...);```2. 索引的类型SQL Server支持多种类型的索引,包括主键索引、唯一索引、聚簇索引和非聚簇索引等。
不同类型的索引适用于不同的场景,需要根据实际情况选择合适的索引类型进行创建。
三、优化索引1. 索引的设计原则在设计索引时,需要考虑到索引的覆盖性、选择性和唯一性等因素,以及索引对于 INSERT、UPDATE 和 DELETE 操作的影响。
合理的索引设计可以有效提高数据库的性能。
2. 索引的优化策略为了提高索引的性能,可以采取一些优化策略,如合并重叠索引、删除不必要的索引、定期重建索引和使用索引查找替代检索等方法。
四、使用技巧1. 如何使用索引在编写SQL查询语句时,可以通过使用EXPL本人N PLAN或者执行计划等工具来帮助分析查询语句的执行计划,以及确定是否使用了合适的索引。
2. 注意事项在使用索引时,需要注意索引的命中率、页面填充因子、索引维护等问题,以及定期对索引进行监控和优化。
五、总结通过本文的介绍,读者应该对SQL Server索引的概念、创建、优化和使用技巧有了一定的了解。
在实际应用中,需要根据具体的业务需求和数据库环境,选择合适的索引策略,以提高数据库的性能和稳定性。
sqlserver索引名规则

一、概述随着互联网和大数据时代的到来,数据库系统的重要性日益凸显。
在数据库系统中,索引是一种非常重要的性能调优手段,可以大幅提升数据库的查询速度,减少资源的消耗。
而对于SQL Server这样的关系型数据库管理系统来说,索引的设计和命名规则就显得尤为重要。
本文将就SQL Server索引的命名规则进行探讨,以期帮助读者更好地理解和使用索引。
二、索引的作用索引是一种特殊的数据库对象,它能够大幅加快数据库的查询速度。
通俗来讲,索引就像是一本书的目录,可以帮助数据库更快地找到需要的数据。
当数据库表中的数据量非常大时,没有索引的情况下查询可能会耗费大量的时间和资源。
而使用了索引之后,数据库可以迅速地定位到需要的数据,从而大幅提升了查询的效率。
三、SQL Server索引的规则在SQL Server中,索引的设计和命名规则对于数据库的性能和维护都至关重要。
以下是SQL Server索引名的命名规则:1. 索引名应当简明扼要:索引名应当能够清晰地反映出索引所在的表和列,能够清晰地表达索引的作用和含义。
一个针对“用户表”中“用户ID”列的唯一主键索引,可以命名为“PK_User_UserID”。
2. 索引名要避免使用保留字和特殊符号:索引名不应当使用SQL Server的保留字或者特殊符号,这样可以避免引发一些不必要的问题和混淆。
3. 索引名要使用规范的命名约定:在团队协作开发和维护数据库时,使用规范的命名约定可以使得索引名更易于理解和维护。
可以统一使用“IX_”作为索引名的前缀,以表示这是一个普通的非聚集索引。
4. 唯一性约束的索引名应当以“IX_Unique”开头:唯一性约束的索引名应当以“IX_Unique”开头,以表示这是一个唯一性约束。
5. 聚集索引名应当以“IX_Clustered”开头:聚集索引是数据库表中数据物理顺序的索引,聚集索引名应当以“IX_Clustered”开头,以表示这是一个聚集索引。
sql的四个索性

sql的四个索性1. 普通索引这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。
01–直接创建索引02CREATE INDEX index_name ON table(column(length))03–修改表结构的方式添加索引04ALTER TABLE table_name ADD INDEX index_name ON (column(length))05–创建表的时候同时创建索引06CREATE TABLE `table` (07`id` int(11) NOT NULL AUTO_INCREMENT ,08`title` char(255) CHARACTER SET utf8 COLLATEutf8_general_ci NOT NULL ,09`content` text CHARACTER SET utf8 COLLATEutf8_general_ci NULL ,10`time` int(10) NULL DEFAULT NULL ,11PRIMARY KEY (`id`),12INDEX index_name (title(length))13)14–删除索引15DROP INDEX index_name ON table2. 唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。
如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
01–创建唯一索引02CREATE UNIQUE INDEX indexName ON table(column(length)) 03–修改表结构04ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))05–创建表的时候直接指定06CREATE TABLE `table` (07`id` int(11) NOT NULL AUTO_INCREMENT ,08`title` char(255) CHARACTER SET utf8 COLLATEutf8_general_ci NOT NULL ,09`content` text CHARACTER SET utf8 COLLATEutf8_general_ci NULL ,10`time` int(10) NULL DEFAULT NULL ,11PRIMARY KEY (`id`),12UNIQUE indexName (title(length))13);3. 全文索引(FULLTEXT)MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。
sqlserver索引的结构及其存储,索引内容

sqlserver索引的结构及其存储,索引内容sqlserver 索引的结构及其存储,sql server索引内容⽂章转载,原⽂地址:本⽂关注以下⽅⾯(本⽂所有的讨论基于SQL Server数据库):索引的分类;索引的结构;索引的存储⼀、索引定义分类 让我们先来回答⼏个问题: 什么是索引?索引是对数据库表中⼀列或多列的值进⾏排序的⼀种结构,使⽤索引可快速访问数据库表中的特定信息。
举个例⼦,索引就像我们查字典时⽤的按拼⾳或笔画或偏旁部⾸有哪些索引?从物理结构上可分为两种:聚集索引和⾮聚集索引(此外还有空间索引、筛选索引、XML索引)索引说明( )每张表上最⼤的聚集索引数为1;每张表上最⼤的⾮聚集索引数为999;每个索引最多能包含的键列数为16;索引键记录⼤⼩最多为900字节⼆、索引数据结构 在SQL Server数据库中,索引的存储是以B+树(注意和⼆叉树的区别)结构来存储的,⼜称索引树,其节点类型为如下两种:索引节点;叶⼦节点 索引节点按照层级关系,有时⼜可以分为根节点和中间节点,其本质是⼀样的,都只包含下⼀层节点的⼊⼝值和⼊⼝指针; 叶⼦节点就不同了,它包含数据,这个数据可能是表中真实的数据⾏,也有可能是索引列值和⾏书签,前者对应于聚集索引,后者对应于⾮聚集索引。
三、索引存储结构 在正式讨论索引的存储结构之前,我们有必要先来了解⼀下SQL Server数据库的存储结构。
SQL Server数据库存储(结构)的最⼩单位是页,⼤⼩为8K,共8 * 1024 = 8192Byte,不论是数据页还是索引页都是以此⽅式存放。
实际上对于SQL Server数据库⽽⾔,其页(Page)类型有很多种,⼤概有如下⼗⼏种():Type 1 – Data page.Data records in heapClustered index leaf-levelLocation can be randomType 2 – Index pageNon-clustered indexNon-leave-level clustered indexLocation can be randomType 3 – Text Mixed PageSmall LOB value(s), multiple types and rows.Location can be randomType 4 – Text PageLOB value from a single column valueLocation can be randomType 7 – Sort PageTemporary page for sort operation.Usually tempdb, but can be in user database for online operations.Location can be randomType 8 – GAM PageGlobal Allocation Map, track allocation of extents.One bit for each extent, if the bit is 1, means the extent is free, otherwise means the extent is allocated (not necessary full).The first GAM page in each file is page 2Type 9 – SGAM PageShared Global Allocation Map, track allocation of shared extentsOne bit for each extent, if the bit is 1, means the extent is allocated but has free space, otherwise means the extent is fullThe first SGAM page in each file is page 3Type 10 – IAM PageIndex Allocation Map. Extent allocation in a GAM interval for an index or heap table.Location can be random.Type 11 – PFS PagePage Free Space. Byte map, keeps track of free space of pagesThe first PFS is page 1 in each file.Type 13 – Boot PageInformation about the pageOnly page 9 in file 1.Type 14 – Server Configuration Page (It may not be the official name)Part of information returned from sp_configure.It only exists in master database, file 1, page 10SQL Server 2008 OnlyType 15 – File Header PageInformation about the file.It's always page 0 every data page.Type 16 – Differential Changed mapExtents in GAM interval have changed since last full or differential backupThe first Differential Changed Page is page 6 in each fileType 17 – Bulk Change MapExtents in GAM interval modified by bulk operations since last backupThe first Bulk Change Map page is page 7 in each file 表中所有数据页的存放在磁盘上⼜有两种组织⽅式:堆表;索引组织表 如果表中所有数据页是以⼀种页间⽆序、随机存储的⽅式,则称这样的表为堆表; 否则如果表中数据页间按某种⽅式(如表中某个字段)有序地存储与磁盘上,则称为索引组织表。
第8章索引及记录操作

第8章索引及记录操作本章要点掌握什么是索引、索引类型及创建索引方法与步骤,掌握建立表间的关联关系的方法,掌握记录排序方法,掌握记录定位方法,掌握记录删除和记录修改方法。
8.1 索引概述8.1.1 什么是索引索引是按照索引表达式的值,使表中的记录有序排列的一种技术。
索引实际上是一种排序,但是它不改变表中数据的物理顺序,而是另外建立一个记录号列表。
表一旦按索引表达式建立索引后,就产生了一个相应的索引文件,其索引文件名与索引字段同名,或由用户定义。
一旦表和相关的索引文件被打开,对表进行操作时,则记录的顺序按索引表达式值的逻辑顺序显示和操作。
在Visual FoxPro系统中,可以为一个表建立多个索引,每一个索引确定了一种表记录的逻辑顺序。
在Visual FoxPro系统中,同一个数据库中的多个表以相同属性字段建立索引后,可根据索引表达式的值建立数据库中多个表间的关联关系。
8.1.2 索引类型1.主索引数据库表,可以建立主索引(Primary Index)。
其索引表达式的值是唯一能够标识每个记录处理顺序的,即每个记录的索引表达式的值是唯一的。
主索引字段经常在多个文件之间形成关系,而且可作为被引用表中的查找值。
2.候选索引候选索引(Candidate Index)像主索引一样,它的索引表达式的值也是能够唯一标识每个记录逻辑顺序的值,即索引表达式无重复值。
3.普通索引普通索引(Regular Index)表示把由索引表达式为每个记录产生的值存入索引文件中。
如果多个记录的索引表达式值相同,则可以重复存储,并用独立的指针指向各个记录。
4.唯一索引唯一索引(Unique Index)表示把由索引表达式为每个记录产生的唯一值,存入索引文件中,如果表中记录的索引表达式值相同,则只存储第一个索引表达式值。
8.1.3 创建索引1.利用表设计器创建索引在“表设计器”窗口,选择“索引”选项卡,再设置以下参数:(1)在“排序”选项中,选择索引方向,升序(↑)或降序(↓);(2)在“索引”选项中,输入索引文件名;(3)在“类型”选项中,选择索引类型;(4)在“表达式”选项中,输入索引字段名,或者索引表达式;(5)在“筛选”选项中,限制记录的输出范围。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说“成也索引,败也索引”。
本系列文章来自翻译和整理后发布在agilesharp和博客园,希望对广大的技术朋友在如何使用索引上有所帮助。
唯一索引和约束唯一索引和其它索引本质上并没有什么不同,唯一不同的是唯一索引不允许索引键中存在相同的值。
因为索引中每一个条目都与表中的行对应。
唯一索引不允许重复值被插入索引也就保证了对应的行不允许被插入索引所在的表,这也是为什么唯一索引能够实现主键和候选键。
为表声明主键或唯一约束时,SQL Server会自动创建与之对应的唯一索引。
你可以在没有唯一约束的情况下创建唯一索引,但反之则不行。
定义一个约束时,SQL Server会自动创建一个与之同名的索引,并且你不能在删除约束之前删除索引。
但可以删除约束,删除约束也会导致与之关联的索引被删除。
每个表中可以包含多个唯一索引。
比如说AdventureWorks的Product表,含有四个唯一索引,分别是ProductID,ProductNumber,rowguid和ProductNameColumn,设置Product表的人将ProductID作为主键,其它三个作为候选键。
你可以通过Create INDEX语句创建唯一索引,比如:CREATE UNIQUE NONCLUSTERED INDEX [AK_Product_Name] ON Production.Product ([Name] );也可以通过直接定义约束创建唯一索引:ALTER TABLE Production.Product ADD CONSTRAINT PK_Product_ProductID PRIMARY KEYCLUSTERED ( ProductID );上面第一种方法,你Prodcut表中不能含有相同的ProductName,第二种情况表中不允许存在相同的ProductID。
因为定义一个主键或是定义约束会导致索引被创建,所以你必须在约束定义时就给出必要的索引信息,因此上面ALTER TABLE语句中包含了”CLUSTERED”关键字。
如果唯一索引或约束所约束的列在当前的表中已经含有了重复值,那么创建索引会失败。
而当唯一索引创建成功后,所有违反这个约束的DML语句都会失败,比如,我们打算加入一条当前表中存在的的ProductName,语句如下:INSERT Production.Product( Name ,ProductNumber ,Color ,SafetyStockLevel ,ReorderPoint ,StandardCost ,ListPrice ,Size ,SizeUnitMeasureCode ,WeightUnitMeasureCode ,[Weight] ,DaysToManufacture ,ProductLine ,Class ,Style ,ProductSubcategoryID ,ProductModelID ,SellStartDate ,SellEndDate ,DiscontinuedDate)VALUES ( 'Full-Finger Gloves, M' ,'A unique product number' ,'Black' ,4 ,3 ,20.00 ,40.00 ,'M' ,NULL ,NULL ,NULL ,0 ,'M' ,NULL ,'U' ,20 ,3 ,GETDATE() ,GETDATE() ,NULL) ;代码1.插入的行和表中存在相同的ProductName上面代码执行后我们可以看到如下报错信息:消息 2601,级别 14,状态 1,第 1 行不能在具有唯一索引 'AK_Product_Name' 的对象'Production.Product' 中插入重复键的行。
语句已终止。
上面的消息告诉我们AK_Product_Name索引不允许我们插入的数据含有和当前表中一样的ProductName。
主键,唯一约束和没有约束主键约束和唯一约束有如下细小的差别。
∙主键约束不允许出现NULL值。
任何索引的索引键都不允许包含null值。
但唯一约束允许包含NULL值,但唯一约束把两个NULL值当作重复值,所以施加了唯一约束的每一列只允许包含一个NULL值。
∙创建主键时会自动创建聚集索引,除非当前表中已经含有了聚集索引或是创建主键时指定了NONCLUSTERED 关键字。
∙创建唯一约束时会自动创建非聚集索引,除非你指定了CLUSTERED关键字并且当前表中还没有聚集索引。
∙每个表中只能有一个主键,但可以由多个唯一约束。
对于唯一约束和唯一索引的选择,请参照MSDN上的指导,如下:唯一约束和唯一索引并没有显著的区别。
创建独立的唯一索引和使用唯一约束对于数据的验证方式并无区别。
查询优化器也不会区分唯一索引是由约束创建还是手工创建。
然而以数据完整性为目标的话,最好创建约束,这使得对应的索引的目标一目了然。
混合唯一索引和过滤索引上面我们提到过唯一索引只允许一个NULL值,但这和常见的业务需求有冲突。
很多时候我们对于已经存在的值不允许重复,但是允许存在多个没有值的列。
比如说吧,你是一个供货商,你所有的产品都来自于第三方厂商。
你将你这里所有的商品信息都存在一个叫做ProductDemo的表中。
你有自己的ProductID,还追踪产品的UPC(Universal Product Code)值。
但并不是所有的厂商产品都存在UPC,你表中的部分数据如下所示。
表1.ProductDemo表的部分内容在上表中第二列,你既要保证UPCode的唯一性,又要保证允许NULL值。
实现这种需求最好的办法就是混合唯一索引和过滤索引(过滤索引实在SQL Server 2008中引入的)。
作为演示,我们创建了表1所示的表.CREATE TABLE ProductDemo(ProductID NCHAR(6) NOT NULLPRIMARY KEY ,UPCode NCHAR(12) NULL) ;接下来我们插入如上所示的数据.INSERT ProductDemo(ProductID, UPCode )VALUES ( '14AJ-W', '036000291452' ), ( '23CZ-M', NULL ), ( '23CZ-L', NULL ), ( '18MM-J', '0440********' ) ;当我们插入重复值时INSERT ProductDemo (ProductID , UPCode) VALUES ('14AJ-K', '036000291452');收到如下错误消息 2601,级别 14,状态 1,第 1 行不能在具有唯一索引 'xx' 的对象 'dbo.ProductDemo' 中插入重复键的行。
语句已终止。
(译者注,这里原文作者应该是疏忽了,略坑爹,因为他没有创建过滤唯一索引,所以按照原文不会报错,我在这里加上了,代码:CREATE UNIQUE NONCLUSTERED INDEX xx on ProductDemo(UPCode) where UPCode!=null)选择合适的IGNORE_DUP_KEY选项当你创建唯一索引时,你可以指定IGNORE_DUP_KEY选项,因此本文最开始创建唯一索引的选项可以是:CREATE UNIQUE NONCLUSTERED INDEX AK_Product_Name ON Production.Product ( [Name]) WITH ( IGNORE_DUP_KEY = OFF );IGNORE_DUP_KEY这个名字容易让人误会。
唯一索引存在时重复的值永远不会被忽略。
更准确的说,唯一索引中永远不允许存在重复键。
这个选项的作用仅仅是在多列插入时有用。
比如,你有两个表,表A和表B,有着完全相同的结构。
你可能提交如下语句给SQL Server。
INSERT INTO TableA SELECT * FROM TableB;SQL Server会尝试将所有表B中的数据插入表A。
但如果因为唯一索引拒绝表B中含有和表A相同的数据插入A怎么办?你是希望仅仅重复数据插入不成功,还是整个INSERT语句不成功?这个取决于你设定的IGNORE_DUP_KEY参数,当你创建唯一索引时,通过设置设个参数可以设定当插入不成功时怎么办,设置IGNORE_DUP_KEY的两种参数解释如下:IGNORE_DUP_KEY=OFF整个INSERT语句都不会成功并弹出错误提示,这也是默认设置。
IGNORE_DUP_KEY=OFF只有那些具有重复键的行不成功,其它所有的行会成功。
并弹出警告信息。
IGNORE_DUP_KEY 选项仅仅影响插入语句。
而不会被UPDATE,CREATE INDEX,ALTER INDEX所影响。
这个选项也可以在设置主键和唯一约束时进行设置。
为什么唯一索引可以提供额外的性能提升唯一索引可以提供出乎你意料之外的性能提升。
这是因为唯一索引给SQL Server提供了确保某一列绝对没有重复值的信息。
adventureWork的Product表中的ProductID和ProductName这两个唯一索引,提供了很好的例子。
加入,你们公司数据仓库的某个哥们希望你给他提供Product表的一些信息,要求如下:∙产品名称∙产品销售的数量∙总销售额因此,你写了如下的查询语句:SELECT [Name] ,COUNT(*) AS'RowCount' ,SUM(LineTotal) AS'TotalValue'FROM Production.Product PJOIN Sales.SalesOrderDetail D OND.ProductID = P.ProductIDGROUP BY (译者注,这里原作者给的代码有问题,ProductID替换为)数据仓库的哥们对你的查询语句很满意,每一行都包含了产品名称,销售数量和总的销售额,查询出来的部分结果如下:但是,你对于这个查询的成本有所担心。
SalesOrderDetail是上面查询中两个表中比较大的表,并且还按照ProductName 进行分组,这个ProductName是来自Product表而不是SalesOrderDetail表。