DB2信息约束

DB2信息约束

至此,我们定义的所有约束都是在插入或更新记录时,由 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.

 

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24177460/viewspace-706654/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值