索引特征及概念

索引是最为常用的改善数据库性能的技术。SQL Server引入索引主要是为了提高查询的效率,它能够加速ORDER BY和GROUP BY子句的操作,保证数据的唯一性,并加快表连接的速度。

索引的概念和创建原则

索引就是一个指向表中数据的指针,如果我们把书比作数据,那么各个章节就相对于数据库中的表,而书的目录就是索引了。

索引是在基本表的列上建立的一种数据库对象,它和基本表分开存储,它的建立或撤销对数据的内容毫无影响。索引一经创建,就完全由系统自动选择和维护,不需要用户指定使用索引,也不需要用户执行打开索引或进行重新索引等操作。

在创建索引时,务必注意下列问题

(1)基本表的记录数量越多,记录越长,越有必要创建索引,这对加快查询速度十分有效。

(2)索引是为了加快查询速度而创建的,但同时会影响基本表的插入、删除或修改等更新活动的速度。因此只有那些对数据量大、查询频度高、实时性要求强的基本表才创建索引,且一张基本表上不要创建过多的索引。

(3)索引是建立在基本表列上的对象,对哪个列进行索引,通常根据列在WHERE、ORDER BY、GROUP BY子句中出现的频率决定。

不适合建索引的列的情况

(1)包含太多重复值的列

(2)查询中很少被引用的列

(3)值特别长的列

(4)具有很多null值的列

(5)需要经常插入、删除、修改的列

(6)记录较少的基本表

(7)需要进行频繁的大批量数据更新的基本表

索引的类型

从两个方面分类


1 、从列的使用角度可将索引分为单列索引、唯一索引、复合索引三类。

2 、从是否改变基本表记录的物理位置角度可分为聚集索引和非聚集索引两类。

分类




1 、单列索引



      是对基本表的某一单独的列进行索引,通常应对每个基本表的主关键字建立单列索引。



2 、唯一索引



      一旦在一个或多个列上建立了唯一索引,则不允许在表中相应的列上插入任何相同的取值。



3 、复合索引



      是针对基本表中两个或两个以上列建立的索引。



4 、聚集索引



      采用聚集索引会改变基本表中记录的物理存储顺序。



5 、非聚集索引



      采用非聚集索引,表中记录的物理顺序与索引顺序不同,即表中的记录仍按实际插入的先后顺序排列,不按索引列排序。

聚集和非聚集索引的对比



1 、存取速度



      从建立了聚集索引的表中取出数据要比建立了非聚集索引的表快,但相对而言,聚集索引会降低向表中插入、删除和修改数据的速度。



2 、索引的数据         



      对聚索引的主要限制是每个表只能建立一个聚集索引,但是一个表可以有不止一个非聚集索引。



3 、所需空间


      非聚集索引需要较多的硬盘空间和内存

创建和删除索引



1 、使用企业管理器方法



         (1)通过点击“钥匙”图标创建,这种方式将在所选定的一个或多个列上创建一个聚集索引,是表的主关键字索引。

         (2)即使用索引管理菜单创建、修改、撤销索引。

                     鼠标右击——〉所有任务——〉管理索引



2 、使用 Transact SQL 创建索引



     Transact SQL使用create index命令创建索引,常用的语法结构如下:

     create [unique]  [clustered|nonclustered] index <索引名> 

                 on   <表名> (<列名1> [次序] [,<列名2>[次序]]···)

     说明:

          unique:为表或视图创建唯一索引(不允许存在索引值相同的两行)。

          clustered:聚集索引。

          nonclustered:非聚集索引,默认值

          索引名:在实际使用时,,用户并不需要知道索引名,但在创建阶段,索引名应符合SQL Server的命名规则,并且在整个数据库中,索引名不能重复。

     例如:create unique clusteredindex myindex1

               on  成绩表(学号,课程号)



3 、使用 Transact SQL 删除索引



      语法结构:drop indextable_name.index_name [,···n]

约束


设计数据库完整性的目的是为了防止数据库存在不符合语义的数据,防止错误信息的输入和输出。SQL Server提供的用来实施数据完整性的途径主要是约束(Constraint)、标识列(Identity Column)、默认(Default)、规则(Rule)、触发器(Trigger)、数据类型(Data Type)、索引(Index)和存储过程(Stored Procedure)等

使用约束实施数据的完整性


约束的用途是限制用户输入到表中的数据的值的范围,一般分为列级约束和表级约束两种。要浏览某张表格上所有约束的信息,可以使用存储过程:

           sp_helpconstraint 表名


(1)  primary key  约束


     特征:

       a、创建primary key约束时,SQL Server会自动创建一个唯一的聚集索引;

       b、定义了primary key约束的字段的取值不能重复,并且不能取null值;

       c、每个表只能定义一个primary key约束;

       d、如果表中已经有了聚集索引,那么在创建primary key约束之前,要么指定所创建的是非聚集索引,要么删除已有的聚集索引




例 1  创建表级primary key约束。

      create table 学生表(

         学号  char(8)  not null,

         姓名 char(8) null,

        constraint  pk_学生表  primary key  (学号));

例 2  创建列级primary key 约束

      create table 学生表(

    学号 char(8)  not null,

    constraint pk_学号 primary keynonclustered(学号),

     姓名  char(8) null);


(2) Foreign  Key 约束


    特征:

     a、一旦Foreign Key约束定义了某个字段,则该字段的取值必须参照(Reference)同一表或另一表中的Primary Key约束或Unique约束。

     b、Foreign Key约束不能自动建立索引。

 例 3 

 create table  成绩表1(

       学号 char(8) not null constraintpk_no references 学生表(学号),

       成绩 int);


(3) default 约束


  特征:

      a.每一个字段只能有一个Default约束;

      b.default约束不能放在IDENTITY字段上或者timestamp字段上。

例 4 alter  table 成绩表

       add constraint df_成绩 default 0 for 成绩

例 5  create  table 成绩表2(

         学号 char(8) not null,

          课程代码 char(7) not null,

          成绩 float constraint  df_score default 0.00);


(4) Unique 约束 ( 用于不是主键但又要求不能有重复值出现的字段 )    特征:


    a.一个表可以有多个Unique 约束;

    b. 按照Unique约束的要求,在一个表中不允许受约束列的字段上有相同的null值,因此最好将被定义了Unique约束的列定义为非空(允许被约束列的值为空)

    c.创建Unique约束时,系统自动创建了非聚集索引。

例 6  alter table 学生表

         add constraint un_name unique(姓名)

例 7  create table abc(

          学号 char(8) not null  constraint un_no unique,

          姓名 char(8));

例 8  create table cbd(

                  学号 char(8) not null,

                  姓名 char(8),

                  constraint  un_xh unique(学号));


(5) Check 约束


     特征:

     a.限制了向特定的字段列输入数据的类型;

     b.表级定义的Check约束可以对多个字段列进行核查。

例 9  create table efg(

            学号 char(8)not null,

            姓名 char(8) not null,

            年龄 int,

           constraint  chk_age check (年龄>17 and 年龄<25));

例10  create table  efg1(

           学号 char(8) not null,

           姓名 char(8) not null,

          年龄 int constraint chk_age1 check(年龄>17 and 年龄<25));



(6) 删除约束


如果需要将某个约束删除,可以使用alter table约束,其语法格式是:

     alter table 表名

      drop constraint 约束名