创建索引和主键

Posted 过隙白驹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建索引和主键相关的知识,希望对你有一定的参考价值。

一、      主建的创建与删除

1.       创建表时同时创建主键(加primary key)

Create Table Book

(

  ID int identity(1,1) primary key,

  Name nvarchar(50) not null,

  StudentID int not null

)

2.       用SQL语句单独创建主键

1)创建主键同时会自动在该主键上创建聚集索引

语句:alter table [表名] add constraint PK_Book_ID primary key (主键列名)

例如:alter table Book add constraint PK_Book_ID primary key (ID)

2)创建主键但不在该主键上创建聚集索引(但会自动创建非聚集索引)

语句:alter table [表名] add constraint PK_Book_ID primary key (主键列名)

例如:alter table Book add constraint PK_Book_ID primary key (ID)

3.       用SQL语句删除主键

语句:alter table [表名] drop constraint [主键名]

例如:alter table Book drop constraint [PK_Book_ID]

二、      索引的创建与删除

1.       创聚集索引

语句:create clustered index [聚集索引名]  on [表名](要创建聚集索引的列名asc|desc) with(drop_existing = on)

例如:create clustered index IX_CLU_Book_ID on Book(ID)

2.       创非集索引

语句:create index [非聚集索引名]  on [表名](要创建非聚集索引的列名 asc|desc) with(drop_existing = on)

例如:create index IX_ Book_Name on Book(Name)

3.       创复合索引

语句:create index [复合索引名]  on [表名](列名1 asc|desc, 列名2 asc|desc) with(drop_existing = on)

例如:create index IX_com_Book_IDName on Book (ID,Name)

4.       创建唯一索引

语句:create unique index index_name on table_name (column ASC|DESC[,.....])with (drop_existing = on)

例如:create unique index IX_Book_ID on Book (ID)

5.       创建覆盖索引

语句:create index index_name on table_Name (columnName ASC|DESC[,......]) include(column_Name_List)with (drop_existing = on)

例如:create index ix_cov_Book_ID_Name on Book (ID) include(Name)

说明:覆盖索引它只是非聚集索引的一种特别形式,是把数据加到非聚集索引上。

覆盖索引和普通非聚集索引的区别:

         1)非聚集索引不包涵数据,通过它找到的只是文件中数据行的引用(表是堆的情况下)或是聚集索引的引用,SQL Server要通这个引用去找到相应的数据行。

         2)正因为非聚集索引它没有数据,才引发第二次查找。

         3)覆盖索引就是把数据加到非聚集索引上,这样就不需要第二次查找了。这是一种以空间换性能的方法。

6.       筛选索引

语句:create index index_name on table_name(columName) where boolExpression

例如:create index IX_Book_ID on Book(ID) where ID>100 and ID< 200

说明:只对热点数据加索引,如果大量的查询只对ID 由 100 ~ 200 的数据感兴趣,就可以这样做。

      1)可以减小索引的大小

      2)为据点数据提高查询的性能

7.       删除索引

语句:drop index table_Name.Index_Name

例如:drop index Book. IX_ Book_Name

8.       查看表中索引存储过程

 execute sp_helpindex @objname = ‘表名‘

总结:

     BTree 索引有聚集与非聚集之分。

     就查看上到聚集索引性能比非聚集索引性能要好。

     非聚集索引分,覆盖索引,唯一索引,复合索引(当然聚集索引也有复合的,复合二字,只是说明索引,引用了多列),一般非聚集索引就查看上,非聚集索引中覆盖索引的性能比别的非聚集索引性能要好,它的性能和聚集索引差不多,可是它会用更多的磁盘空间。

最后说一下这个

     1)with (drop_existing = on|off),加上这个的意思是如果这个索引还在表上就drop 掉然后在create 一个新的。特别是在聚集索引上用使用这个就可以不会引起非聚集索引的重建。

     2)with (online = on|off) 创建索引时用户也可以访问表中的数据,

     3)with(pad_index = on|off fillfactor = 80); fillfactor 用来设置填充百分比,pad_index 只是用来连接fillfactor 但是它又不能少。

     4)with(allow_row_locks = on|off   |   allow_page_locks = on |off);  是否允许页锁 or 行锁

     5)with (data_compression = row | page );  这样可以压缩索引大小

以上是关于创建索引和主键的主要内容,如果未能解决你的问题,请参考以下文章

具有唯一索引和主键的列给出唯一约束违规

外键和主键的 Postgres 和索引

mysql里的range分区方式和主键冲突了怎么办?innodb中没有主键会造成啥影响?

oracle在建表时如何指定主键的索引名和主键的表空间

mysql——主键自动增长&唯一索引

数据库中的主键、关键字、索引