SQL Server 索引和视图

166 阅读5分钟

一、索引

  1. 索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度。
  2. 数据库中索引主要分为两类:聚集索引和非聚集索引SQL Server 2005还提供了唯一索引、索引视图、全文索引、xml索引等等。聚集索引和非聚集索引是数据库引擎中索引的基本类型,是理解其他类型索引的基础。
  • 聚集索引是值表中数据行的物理存储顺序和索引的存储顺序完全相同。聚集索引根据索引顺序物理地重新排列了用户插入到表中的数据,因此,每个表只能创建一个聚集索引。聚集索引经常创建在表中经常被搜索到的列或按顺序访问的列上。在默认情况下,主键约束自动创建聚集索引。

  • 非聚集索引不改变表中数据列的物理存储位置,数据与索引分开存储,通过索引指向的地址与表中的数据发生关系。非聚集索引没有改变表中物理行的位置,索引可以在以下情况下使用非聚集索引:

    (1) 如果某个字段的数据唯一性比较高

    (2) 如果查询所得到的数据量比较少

    聚集索引和非聚集索引的区别:

    聚集索引非聚集索引
    每个表只允许创建一个聚集索引最多可以有249个非聚集索引
    物理的重排表中的数据以符合索引约束创建一个键值列表,键值指向数据在数据页中的位置
    用于经常查找数据的列用于从表中查找单个值的列
  • 除了以上索引,还有以下类型索引:

    a、 唯一索引:如果希望索引键都不同,可以创建唯一索引。聚集索引和非聚集索引都可以是唯一索引。

    b、 包含新列索引:索引列的最大数量是16个,索引列的字节总数的最高值是900。如果当多个列的字节总数大于900,切又想在这些劣种都包含索引是,可以使用包含性列索引

    c、 视图索引:提供视图查询效率,可以视图的索引物理化,也就是说将结果集永久存储在索引中,可以创建视图索引。

    d、 XML索引:是与xml数据关联的索引形式,是XML二进制blob的已拆分持久表示形式

    e、 全文索引:一种特殊类型的基于标记的功能性功能,用于帮助在字符串中搜索赋值的词

二、创建索引

 # 语法
 create [unique] [clustered | noclustered]
 index index_name
 on table_name (column_name ...)
 [with fillfactor = x]
  • unique唯一索引
  • clustered聚集索引
  • noclustered非聚集索引
  • fillfactor填充因子,范围在0~100直接,表示索引页填满的空间所占的百分比。
 # 示例
 if (exists (select * from sys.indexes where name = 'idx_stu_name'))
     drop index student.idx_stu_name
 go
 create index idx_stu_name
 on student(name);
 # 联合索引
 if (exists (select * from sys.indexes where name = 'idx_uqe_clu_name_age'))
     drop index student.idx_uqe_clu_stu_name_age
 go
 create unique clustered index idx_uqe_clu_stu_name_age
 on student(name, age);
 ​
 if (exists (select * from sys.indexes where name = 'idx_cid'))
     drop index student.idx_cid
 go
 # 非聚集索引
 create nonclustered index idx_cid
 on
 student(cid)
 with fillFactor = 30; -- 填充因子
 ​
 # 聚集索引
 if (exists (select * from sys.indexes where name = 'idx_sex'))
     drop index student.idx_sex
 go
 create clustered index idx_sex
 on
 student(sex);
 ​
 # 聚集索引
 if (exists (select * from sys.indexes where name = 'idx_name'))
     drop index student.idx_name
 go
 create unique index idx_name
 on
 student(name);
  • 当数据库的某一列被频繁的用于数据库查询时,或者该列用于数据库进行排序时可以创建成索引,适合的创建索引。
  • 如果列中有几个不同的值,或者表中仅包含几行值,则不推荐为其创建索引。因为索引在搜索数据所花的时间比在表中逐行搜索话的时间更长,不适合创建索引。

三、视图

视图就是一个虚拟的数据表,该数据表中的数据记录是有一条查询语句的查询结果得到的。

  1. 创建视图需要考虑一下准则:

    视图名称必须遵循标识符的规则,该名称不得与该架构的如何表的名称相同。

    你可以对其他视图创建视图。允许嵌套视图,但嵌套不得超过32层。视图最多可以有1024个字段。

    不能将规则和default定义于视图相关联。

    视图的查询不能包含compute子句、compute by子句或into关键字。

    定义视图的查询不能包含order by子句,除非在select 语句的选择列表中还有top子句。

  2. 下列情况必须指定视图中每列的名称:

    视图中的如何列都是从算术表达式、内置函数或常量派生而来。

    视图中有两列或多列具有相同名称(通常由于视图定义包含联接,因此来自两个或多个不同的列具有相同的名称)。

    希望视图中的列指定一个与其原列不同的名称(也可以在视图中重命名列)。无论是否重命名,视图列都回继承原列的数据类型。

 # 创建视图
 if (exists (select * from sys.objects where name = 'v_stu'))
     drop view v_stu
 go
 create view v_stu as select id, name, age, sex from student;
 ​
 # 修改视图
 alter view v_stu
 as
 select id, name, sex from student;
 ​
 alter view v_stu(编号, 名称, 性别)
 as
     select id, name, sex from student
 go
 select * from v_stu;
 select * from information_schema.views;
 ​
 # 加密视图
 if (exists (select * from sys.objects where name = 'v_student_info'))
     drop view v_student_info
 go
 create view v_student_info
 with encryption
 as 
     select id, name, age from student
 go
 -- view_difinition is null
 select * from information_schema.views
 where table_name like 'v_stu';