Posted on 2010-05-18 23:16
Prayer 閱讀(439)
評論(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.