atpeace331
作者atpeace331·2019-04-25 16:16
数据库管理员·银行

DB2 NOT ENFORCED 信息约束

字数 2244阅读 3091评论 0赞 3

NOT ENFORCED 信息约束是一种约束属性, SQL 编译器可使用它来改善对数据的访问 。信息约束 不是由数据库管理器 强制执行的,并且不用于数据的附加验证 ;它们用来提高 SQL查询性能

个人心得总结:

NOT ENFORCED 信息约束
应用的前提条件:
应用程序必须保证业务数据符合约束,才可以使用 NOT ENFORCED!否则,插入或更新后产生约束违例的数据,在应用查询时,会产生不确定的、出乎意料的结果,导致业务系统出错。

技术优点:
1、与 ENFORCED 主键或唯一约束不同,NOT ENFORCED 主键 或 唯一约束 不会在数据上创建索引。避免了表中 insert、update、delete时的索引维护开销。节省了相应的存储空间。

2、相对于 ENFORCED 约束,信息约束在执行 IUD操作时,省去了DB2编译器进行相关列约束检查时的开销。

3、NOT ENFORCED 信息约束与约束属性“ENABLE QUERY OPTIMIZATION” 一起使用时,可以被 DB2优化器使用进行查询优化。信息约束会告诉 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 中?
使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广