数据库10-视图与索引

视图

创建视图

特点:

  • 虚表,从一个或几个基本表导出的表;
  • 只存放视图的定义,不会出现数据冗余
  • 基表中数据发生变化,从视图查询出数据也随之改变
  • 视图建立后,用户可以像基表一样对视图查询

优点:

  • 限制用户直接存取基表的某些列或记录,从而为基表带来附加的安全性;
  • 视图可定义在多个基表上或其他视图上,通过视图可得到多个表经计算后的数据,从而隐藏数据的复杂性;

作用:

  • 视图能够简化用户的操作:当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作
    • 基于多张表连接形成的视图
    • 基于复杂嵌套查询的视图
    • 含导出属性的视图
  • 视图使用户能以多种角度看待同一数据:视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要
  • 视图能够对机密数据提供安全保护
    • 对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
    • 通过WITH CHECK OPTION对关键数据定义操作时间限制
  • 利用视图可以清晰地表达查询:复杂查询分步实现;

创建视图

1
CREATE VIEW <视图名> [列名1,…] AS <子查询>
  • 省略列名时,则由子查询中SELECT目标列中的诸字段组成
  • 明确指定视图的所有列名:
  • DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。
  • 在对视图查询时,按视图的定义从基本表中将数据查出。
  • 子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语

删除视图

语法:

1
DROP VIEW <视图表>

更新视图

由于视图是不存储数据的虚表,数据是来自其他基表部分数据,对视图的更新最终是对基表的更新。

  • 对于直接CURD生成的基表,其视图只读;
  • 对于采取统计查询/聚集查询的基表,其视图可删除,不可修改;
  • 对于采取表达式计算的列,其更新不允许;

索引

概念

类似于词典的索引,索引是关于数据位置信息的关键字表。

  • 数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的记录所在的存储位置。
  • 可以为表中的单列或多列创建索引;
  • 索引通常采用采用B树,B+树或哈希表等结构。
  • 数据库系统检索数据时,根据索引提供的信息,可以直接找到与该条件临近的数据区,而不是一条一条记录地比较,因此可提高查询速度;

使用索引

  • 建立索引是加快查询速度的有效手段
  • 索引由DBMS内部实现,属于内模式范畴
  • 建立索引:DBA或表的属主根据需要建立,有些DBMS自动建立以下列上的索引: PRIMARY KEY和 UNIQUE
  • 维护索引:DBMS自动完成
  • 使用索引:DBMS自动选择是否使用索引以及使用哪些索引

聚簇索引

建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。

  • 在一个基本表上最多只能建立一个聚簇索引
  • 用途:对于某些类型(范围查找)的查询,可以提高查询效率
  • 适用范围:很少对基表进行增删操作,很少对其中的变长列进行修改操作
    语法:
1
CREATE CLUSTERED INDEX Stusname ON Student(Sname);

非聚簇索引

  • 数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置;
  • 索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(也可以由聚簇索引规定)。
  • 在搜索数据值时,先对非聚集索引进行搜索,找到数据值在表中的位置,然后从该位置直接检索数据。
  • 由于索引包含描述查询所搜索的数据值在表中的精确位置的条目,这使非聚集索引成为精确匹配查询的最佳方法。
  • 关键字为NONCLUSTERED

单列索引

  • 普通索引:允许在定义索引的列中插入重复值和空值;
  • 唯一值索引:唯一索引确保索引列不包含重复值,在多列唯一索引的情况下,该索引可以确保索引列中每个值组合是唯一的
  • 主键索引:不允许为空的唯一索引;

组合索引

在表中的多个字段组合上创建索引;

1
CREATE [UNIQUE][CLUSTERED / NONCLUSTERED] INDEX <索引名> ON <表名> (列名1);

删除索引

删除索引语法:DROP INDEX <索引名>
删除索引实例:DROP INDEX <索引名>

索引的原则

  • 选择数据量较大的表建立索引
  • 选择列中的数据多而杂的列建立索引
  • 建立索引的数量要适量
    • 索引要占用磁盘空间
    • 维护索引结构系统要花费一定的开销
    • 仅用来查询的表来讲课建立多个索引,对更新操作比较频繁的表少建立索引
  • 优先考虑主键列建立索引
  • 选择合适的时机建立索引
    • 建立索引应选择在表中装入数据之后
    • 如果要保证装入数据的唯一性,在装入数据前建立唯一性索引