程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 物化查詢表以及其他常用表的介紹

DB2 物化查詢表以及其他常用表的介紹

編輯:DB2教程

文章主要描述的是DB2 物化查詢表,同時也有對MQT、總結表(summary)和staging表的介紹,我們為了更好的對其進行解說,我們是以一些實用的例子展示如何創建和使用物化查詢表。 物化查詢表(MQT)的定義是以一次查詢的結果為基礎的。

MQT 可以顯著提高查詢的性能。本文將介紹 MQT、總結表(summary)和 staging 表,並通過一些實用的例子展示如何創建和使用物化查詢表。

物化查詢表(MQT)是一種以一次查詢的結果為基礎定義的表。包含在物化查詢表中的數據來自定義物化查詢表時所基於的一個或多個表。而 總結表(也稱自動總結表,AST)對於 IBM® DB2® Universal Database™(UDB)for Linux、 UNIX® 和 Windows®(DB2 UDB)的用戶來說應該感到比較熟悉,它們可以看作是特殊的 MQT。fullselect 是總結表定義的一部分,它包含一個 GROUP BY 子句,該子句總結 fullselect 中所引用表中的數據。

您可以將 MQT 看作一種物化的視圖。視圖和 MQT 都是基於一個查詢來定義的。每當視圖被引用時,視圖所基於的查詢便會運行。但是,MQT 實際上則是將查詢結果保存為數據,您可以使用 MQT 中的這些數據,而不是使用底層表中的數據。

物化查詢表可以顯著提高查詢的性能,尤其是提高復雜查詢的性能。如果優化器確定查詢或查詢的一部分可以用一個 MQT 來解決,那麼就會重寫查詢,以便利用 MQT。

MQT 可以在創建表時定義,或者定義為系統維護的 MQT,或者定義為用戶維護的 MQT。下面的幾個小節將介紹這兩種類型的 MQT,另外再介紹總結表和 staging 表。後面的例子要求連接到 SAMPLE 數據庫。如果您系統上還沒有創建 SAMPLE 數據庫,那麼可以通過在命令行提示符下輸入 db2sampl 命令來創建這個數據庫。

系統維護的 MQT

這種物化查詢表中的數據是由系統維護的。當創建這種類型的 MQT 時,可以指定表數據是 REFRESH IMMEDIATE 還是 REFRESH DEFERRED。通過 REFRESH 關鍵字可以指定如何維護數據。DEFERRED 的意思是,表中的數據可以在任何時候通過 REFRESH TABLE 語句來刷新。

不管是 REFRESH DEFERRED 還是 REFRESH IMMEDIATE 類型的系統維護的 MQT,對它們的 insert、update 或 delete 操作都是不允許的。但是,對於 REFRESH IMMEDIATE 類型的系統維護的 MQT,可以通過 對底層表的更改(即 insert、update 或 delete 操作)來更新。

清單 1 展示了一個創建 REFRESH IMMEDIATE 類型的系統維護的 MQT 的例子。這個表名為 EMP,它基於 SAMPLE 數據庫中的底層表 EMPLOYEE 和 DEPARTMENT。由於 REFRESH IMMEDIATE MQT 要求查詢的 select 列表中引用的每個表中至少有一個惟一鍵,所以我們首先在 EMPLOYEE 表的 EMPNO 列上定義一個惟一性約束,另外還在 DEPARTMENT 表的 DEPTNO 列上定義一個惟一性約束。

DATA INITIALLY DEFERRED 子句的意思是,在執行 CREATE TABLE 語句的時候,並不將數據插入到表中。MQT 被創建好之後,就處於檢查暫掛(check pending)狀態(請參閱 DB2 基礎: 闡明表和表空間的狀態),在對它執行 SET INTEGRITY 語句之前,不能查詢它。IMMEDIATE CHECKED 子句規定,根據用於定義該 MQT 的查詢對數據進行檢查,並刷新數據。

NOT INCREMENTAL 子句規定對整個表進行完整性檢查。通過查詢 EMP 物化查詢表發現,它現在已經填入了數據。

清單 1. 創建由系統維護的 MQT

  1. connect to sample   
  2. ...   
  3. alter table employee add unique (empno)   
  4. alter table department add unique (deptno)   
  5. create table emp as (select e.empno, e.firstnme, e.lastname, e.phoneno, d.deptno,   
  6. substr(d.deptname, 1, 12) as department, d.mgrno from employee e, department d   
  7. where e.workdept = d.deptno)   
  8. data initially deferred refresh immediate   
  9. set integrity for emp immediate checked not incremental   
  10. select * from emp   
  11. EMPNO FIRSTNME LASTNAME PHONENO DEPTNO DEPARTMENT MGRNO   
  12. ------ ------------ --------------- ------- ------ ------------ ------   
  13. 000010 CHRISTINE HAAS 3978 A00 SPIFFY COMPU 000010   
  14. 000020 MICHAEL THOMPSON 3476 B01 PLANNING 000020   
  15. 000030 SALLY KWAN 4738 C01 INFORMATION 000030   
  16. 000050 JOHN GEYER 6789 E01 SUPPORT SERV 000050   
  17. 000060 IRVING STERN 6423 D11 MANUFACTURIN 000060   
  18. 000070 EVA PULASKI 7831 D21 ADMINISTRATI 000070   
  19. 000090 EILEEN HENDERSON 5498 E11 OPERATIONS 000090   
  20. 000100 THEODORE SPENSER 0972 E21 SOFTWARE SUP 000100   
  21. 000110 VINCENZO LUCCHESSI 3490 A00 SPIFFY COMPU 000010   
  22. 000120 SEAN O'CONNELL 2167 A00 SPIFFY COMPU 000010   
  23. 000130 DOLORES QUINTANA 4578 C01 INFORMATION 000030   
  24. ...   
  25. 000340 JASON GOUNOT 5698 E21 SOFTWARE SUP 000100   
  26. 32 record(s) selected.   
  27. connect reset  

以上的相關內容就是對DB2 物化查詢表的介紹,望你能有所收獲。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved