至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。
如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:
CREATE TABLE EMPDATA ( EMPNO INT NOT NULL, SEX CHAR(1) NOT NULL CONSTRAINT SEXOK CHECK (SEX IN ('M','F')) NOT ENFORCED ENABLE QUERY OPTIMIZATION, SALARY INT NOT NULL, CONSTRAINT SALARYOK CHECK (SALARY BETWEEN 0 AND 100000) NOT ENFORCED ENABLE QUERY OPTIMIZATION ) |
本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。
若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:
INSERT INTO EMPDATA VALUES (1, 'M', 54200), (2, 'F', 28000), (3, 'M', 21240), (4, 'F', 89222), (5, 'Q', 34444), (6, 'K',132333) |
编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。
在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:
SELECT * FROM EMPDATA WHERE SEX = 'Q'; EMPNO SEX SALARY ----------- --- ----------- 0 record(s) selected. |
DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:
ALTER TABLE EMPDATA ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION |
现在,再重新执行之前的查询。结果如下所示:
SELECT * FROM EMPDATA WHERE SEX = 'Q'; EMPNO SEX SALARY ----------- --- ----------- 5 Q 34444 1 record(s) selected. |
信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24177460/viewspace-706654/,如需转载,请注明出处,否则将追究法律责任。