Posted on 2010-05-18 23:16
Prayer 阅读(425)
评论(0) 编辑 收藏 引用 所属分类:
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 选项
若表包含 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 中放置的定义。
ENABLE QUERY OPTIMIZATION 选项
在上一屏运行的插入之后,如果再对 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.