SQL server 索引

索引类别唯一索引(UNIQUE)
聚集索引(CLUSTERED)
非聚集索引(NONCLUSTERED)


主键与唯一索引的区别

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 唯一性索引列允许空值,而主键列不允许为空值。 主键列在创建时,已经默认为空值 + 唯一索引了。 主键可以被其他表引用为外键,而唯一索引不能。 一个表最多只能创建一个主键,但可以创建多个唯一索引。 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。

-- 创建一张仅包含主键和唯一索引的表

CREATE TABLE test

(PrimaryKey VARCHAR2(20),

UniqueKey  VARCHAR2(20)

);

-- 分别创建主键和唯一索引,语法不同

ALTER TABLE test ADD CONSTRAINT test_PrimaryKey PRIMARY KEY (PrimaryKey);

CREATE UNIQUE INDEX test_UniqueKey ON test (UniqueKey);

-- 在 USER_INDEXES 中可以看到两个索引名称

SELECT table_name,table_type,index_name,index_type,uniqueness

FROM USER_INDEXES

WHERE TABLE_NAME=‘TEST‘;

-- 在 USER_IND_COLUMNS 中可以看到两个索引字段名称

SELECT table_name,index_name,column_name,column_position

FROM USER_IND_COLUMNS

WHERE TABLE_NAME=‘TEST‘;

-- 在 USER_CONSTRAINTS 仅可以看到主键约束名称

SELECT table_name,constraint_name,constraint_type

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘;

-- 在 USER_CONS_COLUMNS 仅可以看到主键约束字段名称

SELECT table_name,constraint_name,column_name,position

FROM USER_CONS_COLUMNS

WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘);

-- 为唯一索引增加一个非空约束

ALTER TABLE test MODIFY UniqueKey NOT NULL;

-- 在 USER_CONSTRAINTS 仅可以看到主键约束名称和非空约束名称

SELECT table_name,constraint_name,constraint_type

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘

-- 在 USER_CONS_COLUMNS 仅可以看到主键约束字段名称和非空约束字段名称

SELECT table_name,constraint_name,column_name,position

FROM USER_CONS_COLUMNS

WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘)

时间: 2024-11-15 04:45:41

SQL server 索引的相关文章

SQL Server 索引维护:系统常见的索引问题

在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次DTA,里面提示了很多列缺少统计信息,后来在不改动其他操作的前提下,把这些统计信息手动建上去,性能提升非常明显.关于统计信息将另开文章介绍).一个表甚至有20多个索引(索引的数量并没有标准,但是要尽量合理,每个索引都应该能支撑大量查询或者增删改中的查询功能才有存在价值).索引过多带来了服务器的沉重压力,有这么

SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>

实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多),一个区中的页面可能属于多余一个的索引或表---这被称为混合区.如果数据库中有太多的小表,混合区帮助SQL Server节约磁盘空间. 随着表(或索引)增长并且请求超过8个页面,SQL Server创建专用于该表(或索引)的区并且从该区中分配页面.这样一个区被称为统一区,它可以为多达8个相同表或索引的

SQL Server索引设计 <第五篇>

SQL Server索引的设计主要考虑因素如下: 检查WHERE条件和连接条件列: 使用窄索引: 检查列的选择性: 检查列的数据类型: 考虑列顺序: 考虑索引类型(聚集索引OR非聚集索引): 一.检查WHERE条件列和链接条件列 当一个查询提交到SQL Server时,查询优化器尝试为查询中引用的所有表查找最佳的数据访问机制.下面列出查询优化器针对WHERE和连接的工作方式: 优化器识别WHERE子句和连接条件中包含的列. 接着优化器检查这些列上的索引. 优化器通过从索引上维护的统计确定子句的选

SQL Server索引 - 非聚集索引 <第七篇>

一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向新的数据页面,而不是更新所有相关非聚集索引的行定位器.这样,虽然降低了非聚集索引的维护开销,但是增加了从非聚集索引行到数据行的导航开销,因为添加了一个旧数据页面和信数据页面之间的连接.因此,将聚集索引作为行定位器降低了非聚集索引相关的开销. 二.定义书签查找 当一个查询请求不是优化器选择的非聚集索引

SQL Server 索引和表体系结构(三)

原文:SQL Server 索引和表体系结构(三) 包含列索引 概述 包含列索引也是非聚集索引,索引结构跟聚集索引结构是一样,有一点不同的地方就是包含列索引的非键列只存储在叶子节点:包含列索引的列分为键列和非键列,所谓的非键列就是INCLUDE中包含的列,至少需要有一个键列,且键列和非键列不允许重复,非键列最多允许1023列(也就是表的最多列-1),由于索引键列(不包括非键)必须遵守现有索引大小的限制(最大键列数为 16,总索引键大小为 900 字节)的要求所以引进了包含列索引. 正文 创建包含

SQL Server 索引知识-应用,维护

创建聚集索引 a索引键最好唯一(如果不唯一会隐形建立uniquier列(4字节)确保唯一,也就是这列都会复制到所有非聚集索引中) b聚集索引列所占空间应尽量小(否则也会使非聚集索引的空间变大) c聚集索引应固定,不能随便改动(否则会引起分页,碎片,非聚集索引被迫修改等一些列问题) d聚集索引键一般与主键(primary key)分开(基于方便业务调整,如业务逻辑存储数据与clustered index key一致且不会改变,则主键可为聚集索引) 应用实例: 选择聚集键时,尽量避免因插入引起的分页

SQL Server 索引知识-概念

概念篇 索引概念(index concept) 一种表或视图中相关的B-tree的数据结构.索引键列由一列或多列组成.可拥有包含性列(sql2005).用于提升Sql Server 查找相关数据行效率. 聚集索引(Clustered index) 表或索引视图数据行按照聚集索引键排序.每个表只能有一个聚集索引(聚集表中数据只能按一种方式组织).表中有聚集索引则表称为聚集索引表,无聚集索引则称为堆表. 非聚集索引(Nonclustered index) 独立于数据行之外的一种数据结构.用于快速检索

SQL Server 索引的自动维护 <第十三篇>

在有大量事务的数据库中,表和索引随着时间的推移而碎片化.因此,为了增进性能,应该定期检查表和索引的碎片,并对具有大量碎片的进行整理. 1.确定当前数据库中所有需要分析碎片的表. 2.确定所有表和索引的碎片. 3.考虑一下因素以确定需要进行碎片整理的表和索引. 高的碎片水平-avg_fragmentation_in_percent大于20%: 不是非常小的表或索引-也就是page_count大于8的: 4.整理具有大量碎片的表和索引: 这里给出一个样板SQL存储过程,它执行以下操作: 遍历系统上的

SQL Server索引 - 索引(物化)视图 <第九篇>

一.索引视图基本概念 索引视图实际上是一种将一组唯一值“物化”为群集索引形式的视图,所为物化就是几乎和表一样,其数据也是会存储一份的(会占用硬盘空间,但是查询速度快,例如可以将count(),sum()等值设在索引视图中).其优点是它在提取视图背后的信息方面提供了一个非常快的查找方法.在第一个索引(必须是针对一组唯一值的聚集索引)之后,通过使用来自第一个索引的聚集键作为参考点,SQL Server还能在视图上建立额外的索引.其限制如下: 视图必须使用SCHEMABINDING选项: 如果视图引用

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

聚集索引.非聚集索引.非聚集唯一索引 我们都知道建立适当的索引能够提高查询速度,优化查询.先说明一下,无论是聚集索引还是非聚集索引都是B树结构. 聚集索引默认与主键相匹配,在设置主键时,SQL Server会默认在主键列创建聚集索引.但是可以手动更改为在任意一个列创建聚集索引,然后在另一个字段或多个字段上定义主键.这时主键将会被作为一个唯一的非聚集索引(唯一索引)被创建.通过指定NONCLUSTERED关键字就可以做到. CREATE TABLE MyTableKeyExample { Colu