DB2 中的对象视图、索引和触发器
视图
概述
•视图允许不同的用户或应用程序以不同的方式查看同一张表中的数据。
•除视图定义之外,视图在数据库内并不占用空间;视图中显示的数据来自另一个表。可以根据现有的一个表(或多个表)、另一个视图或者表和视图的任意组合创建一个视图。
创建视图
•创建视图可以使用CREATE VIEW 语句。SELECT 语句用于指定将在视图中显示哪些行与列。
删除视图
•删除视图可以使用DROP VIEW 语句。
•如果删除一个视图所基于的表或另一个视图,那么这个视图依然在数据库中被定义,但不会起作用。
•SYSCAT.VIEWS 的 VALID 列表明视图是有效的(‘Y’)还是无效的(‘X’)。
•即使重新创建基表,无效的视图仍然是无效的;必须也重新创建它。
修改视图
•视图不能修改;要更改视图定义,必须删除视图,然后重新创建它。**
•DB2 提供的 ALTER VIEW 语句只用于修改引用类型。
只读视图和可更新视图
•在创建一个视图时,可以将它定义为只读视图 或者可更新视图。视图的 SELECT 语句决定视图是只读的还是可更新的。一般情况下,如果视图中的行可以映射到基表中的行,那么该视图就是可更新的。
•创建可更新视图的规则很复杂,它们取决于查询的定义。例如,使用 VALUES、DISTINCT 或 JOIN 特性的视图是不可更新的。
•通过查看 SYSCAT.VIEWS的 READONLY 列很容易就能确定视图是不是可更新的:Y 表示只读,N 表示非只读。
索引
•索引是表的一个或多个列的键值的有序列表。
•如果没有索引:
——对表添加数据时,该数据将被追加到表的最后。不存在固有的数据顺序。搜索特定数据行时,必须检查从第一行到最后一行的所有行。
•创建索引的原因有两个:
①确保一个或多个列中值的惟一性。
②**提高表查询的性能**。DB2 优化器使用索引提高执行查询时的性能,或者以索引的顺序显示查询结果
•索引可以定义为惟一的或非惟一的。
①非惟一的索引允许重复的键值;
②惟一的索引只允许一个键值在列表中出现一次。惟一的索引允许出现单个空值。然而,第二个空值会导致重复现象,因此不允许。
•创建索引可以使用 CREATE INDEX语句。
•为表中的列指定 PRIMARY KEY 或 UNIQUE 约束,会隐式地创建索引。
•索引可以创建为升序、降序或双向。
创建索引
# 为员工ID创建索引
CREATE INDEX iemployee1 ON employee(id)
#在默认情况下,索引按升序创建,但也可以创建降序索引。甚至可以为索引中的各个列指定不同的顺序。
CREATE INDEX iemployee2 ON employee(id DESC,name ASC)
#升序索引利于 MIN 列函数的结果;降序索引利于 MAX 列函数的结果。如果应用程序还需要数据按与索引相反的顺
#序排序,那么 DB2 允许创建双向索引
CREATE INDEX iemployee3 ON employee(id) ALLOW REVERSE SCANS
•在创建索引时,可以选择包含额外的列数据,这些额外的列数据将与键存储在一起,但实际上它们不是键本身的一部分,所以不被排序。在索引中包含额外列的主要原因是为了提高某些查询的性能:因为索引页面中已经提供了数据值,DB2 就不需要访问数据页面。只能为惟一索引定义包含的列。
例如:
SELECT id,name FROM employee ORDER by id
•建议创建如下的索引
CREATE UNIQUE INDEX iemployeeid ON employee (id) INCLUDE(name)
•不能在索引中包含所有数据
— ①占用过多的物理存储空间,因为表数据和索引中的数据是重复的
— ②数据更新时,要发生多次更新
创建索引是需要注意:
•①创建一个索引花费的时间比较长。DB2 必须读取每一行来提取键,对这些键进行排序,然后将键值列表写到数据库中。如果表比较大,那么将使用临时表空间对键进行排序。
•②索引存储在表空间中。如果表驻留在数据库管理的表空间中,就可以选择将索引放在不同的表空间中。在创建表时,可以使用 INDEXES IN 子句指定索引放置的表空间。
•③索引是值的额外副本,所以当表中的数据被更新时,它们也必须被更新。如果表数据经常被更新,就要考虑额外的索引会对更新性能产生什么样的影响。
触发器
•触发器定义了一系列的操作,可以在对指定的表进行插入、更新或删除操作时自动执行这些操作。
•使用触发器的优点是:
— ①**更快地开发应用程序**:因为触发器存储在数据库中,所以不必编写触发器在每个应用程序中执行的操作。
— ②**更容易维护**:定义了某个触发器后,那么当访问创建它所基于的表时,会自动调用该触发器。
— ③**业务规则的全局实现**:如果业务策略更改,只需更改触发器而不必更改每个应用程序。
•创建触发器可以使用 CREATE TRIGGER 语句。
触发器分类:
•①前触发器(BEFORE触发器)
— 在更新或插入操作前运行。
•②后触发器(AFTER触发器)
— 在更新、插入或删除操作后运行。
•③BEFORE DELETE 触发器
— 在删除操作前运行。
•④INSTEAD OF 触发器
— INSTEAD OF 触发器描述如何对复杂视图执行插入、更新和删除操作。INSTEAD OF 触发器允许应用程序将视图用作所有 SQL 操作(插入、删除、更新和选择)的唯一界面。
例如:
CREATE TRIGGER min_salary NO CASCADE
BEFORE INSERT ON staff
REFERENCING NEW AS newstaff
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
SET newstaff.salary = CASE
WHEN newstaff.job = 'Mgr' AND newstaff.salary < 17000.00
THEN 17000.00
WHEN newstaff.job = 'Sales' AND newstaff.salary < 14000.00 THEN 14000.00
WHEN newstaff.job = 'Clerk' AND newstaff.salary < 10000.00 THEN 10000.00
ELSE newstaff.salary
END;
END