sqlserver索引和主键

非聚集索引:

1.创建索引时若未指定索引类型则默认为非聚集索引

2.每张表最多可以有249个非聚集索引

3.行的物理位置不按索引的顺序排序

4.只有查询在具有高度选择性的情况下,非聚集索引才有优势

5.一个索引可以多个字段来定义

聚集索引:

1.行的物理位置和行在索引中的位置是一样的

2.每张表只能有一个聚集索引

3.聚集索引可以提高大多数表的性能

4.对数据行的排序,方便查询

5.一个索引可以多个字段来定义

6.创建聚集索引时如果数据里面已经有重复值将不能使用IGNORE_DUP_KEY=ON属性

7.数据可以唯一也可以不唯一取决于是否使用unique属性,虽然数据可能不唯一但是系统会自动生成一个唯一字段并自动插入唯一数据。

8.如果未使用unique属性创建聚集索引,数据库引擎将自动添加一个四字节的unique列并自动向这个字段填充数据来确保每个值唯一,此字段和字段的值供内部使用,用户不能查看和访问。

9.没有限制聚集索引的列必须是not null,可以为null

主键:

1.唯一标识,插入重复数据时会报错

2.每张表只能有一个主键

3.确保数据的完整性

4.可以是一个或多个字段

5.主键的值不可以为空

6.主键的值应该是没有太大意义,永远不会被改变的

使用非聚集索引和聚集索引的场景:

字段属性 非聚集索引 聚集索引
字段经常被分组排序 推荐
返回一个范围内的数据

推荐

一个或极少的不同值,其他都为相同的值 不可 不可
频繁更新的字段 不可
外键 推荐
主键 推荐
宽键(若干字段或若干字段的组合) 不可
连接操作涉及到的字段 推荐

使用索引的代价:

 1.索引需要占据数据表以外的存储空间

2.创建和维护索引需要花费一定的时间

3.当对表进行更新操作时需要重建索引,如表压缩,降低了数据维护的速度

创建非聚集索引

--唯一非聚集索引
create unique NONCLUSTERED index index_test_01 on test (id,name asc)
with(
IGNORE_DUP_KEY=ON --在插入重复值时启用警告功能,不会报错,但是会忽略重复值
,statistics_norecompute=off --启用统计信息自动更新功能
);

创建聚集索引

--创建唯一聚集索引
create unique CLUSTERED index index_test_01 on test (id,name asc)
with(
IGNORE_DUP_KEY=ON --在插入重复值时启用警告功能,不会报错,但是会忽略重复值
,statistics_norecompute=off --启用统计信息自动更新功能
);

创建唯一索引,默认非聚集

create unique index index_test_01 on test (id,name asc)
with(
IGNORE_DUP_KEY=ON --在插入重复值时启用警告功能,不会报错,但是会忽略重复值
,statistics_norecompute=off --启用统计信息自动更新功能
,DROP_EXISTING=ON --表示如果这个索引还在表上就会自动drop掉然后重新生成现有索引,其索引名称必须相同
);

创建索引时with里面的属性:

PAD_INDEX = {ON |OFF }:指定是否索引填充。默认为 OFF。
  ON 通过指定的可用空间的百分比fillfactor应用于索引中间级别页。
  OFF 或 fillfactor 未指定,考虑到中间级页上的键集,将中间级页填充到接近其容量的程度,以留出足够的空间,使之至少能够容纳索引的最大的一行。
  PAD_INDEX 选项只有在指定了 FILLFACTOR 时才有用,因为 PAD_INDEX 使用由 FILLFACTOR 指定的百分比。
FILLFACTOR = fillfactor:用于指定在创建索引时,每个索引页的数据占索引页大小的百分比,fillfactor 的值为1到100。
SORT_IN_TEMPDB = {ON |OFF }:用于指定创建索引时的中间排序结果将存储在 tempdb 数据库中。 默认为 OFF。
  ON 用于生成索引的中间排序结果存储在tempdb。 这可能会降低仅当创建索引所需的时间tempdb位于不同的与用户数据库的磁盘集。 
  OFF 中间排序结果与索引存储在同一数据库中。
IGNORE_DUP_KEY = {ON |OFF }:指定在插入操作尝试向唯一索引插入重复键值时的错误响应。默认为 OFF。
  ON 向唯一索引插入重复键值时将出现警告消息。 只有违反唯一性约束的行才会失败。
  OFF 向唯一索引插入重复键值时将出现错误消息。 整个 INSERT 操作将被回滚。
STATISTICS_NORECOMPUTE = {ON |OFF}:用于指定过期的索引统计是否自动重新计算。 默认为 OFF。
  ON 不会自动重新计算过时的统计信息。
  OFF 启用统计信息自动更新功能。
DROP_EXISTING = {ON |OFF }:表示如果这个索引还在表上就 drop 掉然后在 create 一个新的。 默认为 OFF。
  ON 指定要删除并重新生成现有索引,其必须具有相同名称作为参数 index_name。
  OFF 指定不删除和重新生成现有的索引。 如果指定的索引名称已经存在,SQL Server 将显示一个错误。
ONLINE = {ON |OFF}:表示建立索引时是否允许正常访问,即是否对表进行锁定。默认为 OFF。
  ON 它将强制表对于一般的访问保持有效,并且不创建任何阻止用户使用索引和/表的锁。
  OFF 对索引操作将对表进行表锁,以便对表进行完全和有效的访问。

对现有表创建主键

ALTER TABLE [dbo].[IN_COAST_CMTX] ADD  CONSTRAINT [PK_IN_COAST_CMTX] PRIMARY KEY CLUSTERED 
(
	[COMPENSATIONDATE],
	[AGENTCODE],
	[PRODUCTID]
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

在新表中创建主键

create table IN_COAST_CMTX(
 CHECK_TYPE            nvarchar(4)
,COMPENSATIONDATE      Date
,AGENTCODE             nvarchar(10)
,AGENCYCODE            nvarchar(10)
,PRODUCTID             nvarchar(255)
CONSTRAINT [PK_IN_COAST_CMTX] PRIMARY KEY CLUSTERED 
(
	COMPENSATIONDATE,
	AGENTCODE,
	PRODUCTID
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
);
/*
CONSTRAINT:创建约束
PK_IN_COAST_CMTX:主键名称
PRIMARY KEY:表明创建的是主键约束
CLUSTERED:表示索引类型是聚集索引
PAD_INDEX :是否聚集索引  
STATISTICS_NORECOMPUTE: 是否启用统计信息更新 
IGNORE_DUP_KEY: 重复键值,为OFF一旦有重复所有行插入失败,为ON只有重复行插入失败不重复的行会插入
ALLOW_ROW_LOCKS:是否开启行锁  
ALLOW_PAGE_LOCKS:是否开启页锁
*/

 创建唯一非聚集筛选索引,创建筛选索引时不能使用DROP_EXISTING=ON

create unique index index_test_02 on test (id,name asc)
where id>=1 and id<=2
with(
statistics_norecompute=off --启用统计信息自动更新功能
);

修改索引,REBUILD:重建索引,DISABLE:禁用索引,REORGANIZE:重新组织索引页级

ALTER INDEX index_test_01
ON test
REBUILD|DISABLE|REORGANIZE

 查看索引

--查看指定表中的索引
exec sp_helpindex test;
--删除指定表中的索引
drop index test.index_test_01;
--检查表test中索引 index_test_01 的碎片信息
dbcc showcontig(test,index_test_01);
--整理db_glory_id_mig数据库中表 test 的索引 index_test_01 的碎片
dbcc indexdefrag(db_glory_id_mig,test,index_test_01);
--更新表 test 中的全部索引的统计信息
update statistics test;

查看主键信息

SELECT TABLE_NAME,COLUMN_NAME FROM 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME= 'IN_COAST_CMTX'

猜你喜欢

转载自blog.csdn.net/qq_38892977/article/details/121395602
今日推荐