Các khái niệm cơ bản của DB2: Giới thiệu các bảng truy vấn cụ thể hóa
Roman Melnyk, Phát triển thơng tin DB2
Tóm tắt: Định nghĩa bảng truy vấn cụ thể hóa (MQT) dựa trên kết quả của một
truy vấn. MQT có thể cải thiện đáng kể hiệu suất của truy vấn. Bài viết này giới
thiệu cho bạn các MQT, các bảng tóm tắt, và bảng phân tầng, và bằng các ví dụ
đang làm việc, chỉ cho bạn cách để xây dựng và chạy các bảng truy vấn được cụ
thể hóa.
Bảng truy vấn cụ thể hóa (MQT) là một bảng được xác định dựa trên kết quả của
một truy vấn. Các dữ liệu được chứa trong MQT có nguồn gốc từ một hoặc nhiều
bảng mà dựa vào chúng, người ta cụ thể hố định nghĩa của bảng truy vấn. Bảng
Tóm tắt (hoặc bảng tóm tắt tự động, AST), quen thuộc với những người sử dụng
cơ sở dữ liệu thông dụng DB2 (UDB) của IBM trong Linux, UNIX, và Windows
(DB2 UDB), được coi là dạng đặc biệt của MQT. Việc chọn đầy đủ là một phần
của định nghĩa của một bảng tóm tắt, chứa mệnh đề GROUP BY để tổng hợp dữ
liệu từ các bảng được tham chiếu trong câu chọn này.
Bạn có thể nghĩ MQT như một loại khung nhìn cụ thể hóa. Cả khung nhìn lẫn các
MQT được xác định dựa trên một truy vấn. Truy vấn mà trên đó khung nhìn dựa
vào được chạy bất cứ khi nào một khung nhìn được tham chiếu; tuy nhiên, trên
thực tế MQT lưu giữ các kết quả truy vấn làm dữ liệu, và bạn có thể làm việc với
các dữ liệu ở trong MQT thay vì các dữ liệu ở trong các bảng nêu ra.
Các bảng truy vấn cụ thể hóa có thể cải thiện một cách đáng kể hiệu suất của các
truy vấn, đặc biệt là các truy vấn phức tạp. Nếu như trình tối ưu xác định rằng một
truy vấn hoặc một phần của một truy vấn có thể được giải bằng cách sử dụng một
MQT, thì truy vấn có thể được viết lại để tận dụng lợi thế của MQT này.
Có thể xác định MQT ở thời gian tạo bảng vì được hệ thống hay người dùng duy
trì. Các phần tiếp theo sẽ giới thiệu cho bạn hai loại MQT, cũng như bảng tóm tắt
và bảng phân tầng. Các ví dụ sau đây yêu cầu kết nối tới cơ sở dữ liệu SAMPLE;
nếu chưa có cơ sở dữ liệu SAMPLE trong hệ thống, thì bạn có thể tạo ra nó bằng
cách nhập lệnh db2sampl từ bất kỳ dấu nhắc lệnh nào.
Các MQT được duy trì bởi hệ thống
Các dữ liệu trong loại này của bảng truy vấn cụ thể hóa được duy trì bởi hệ thống.
Khi bạn tạo MQT loại này, thì bạn có thể xác định dữ liệu bảng sẽ là loại dữ liệu
REFRESH IMMEDIATE (làm mới ngay) hoặc REFRESH DEFERRED (làm mới
sau). Từ khóa REFRESH cho phép bạn xác định cách dữ liệu được được duy trì.
Làm mới sau có nghĩa là các dữ liệu trong bảng có thể được làm mới bất kỳ lúc
nào bằng cách sử dụng câu lệnh REFRESH TABLE. Các MQT, dù là làm mới
ngay hoặc về sau, được hệ thống duy trì, cũng khơng cho phép các hoạt động
chèn, cập nhật, hoặc xóa được thực hiện đối với chính chúng. Tuy nhiên, các MQT
với REFRESH IMMEDIATE được hệ thống duy trì được cập nhật với các thay
đổi trên bảng nêu ra như kết quả của các phép chèn, cập nhật, hoặc xóa.
Liệt kê 1 cho thấy ví dụ tạo ra một MQT REFRESH IMMEDIATE được hệ thống
duy trì. Bảng có tên EMP dựa trên các bảng EMPLOYEE và DEPARTMENT kể
ra trong cơ sở dữ liệu SAMPLE. Vì các MQT với REFRESH IMMEDIATE yêu
cầu rằng ít nhất một khóa đơn từ mỗi bảng được tham chiếu trong truy vấn xuất
hiện trong danh sách chọn, trước tiên ta xác định một ràng buộc đơn trên cột
EMPNO trong bảng EMPLOYEE và trên cột DEPTNO trong bảng
DEPARTMENT. Mệnh đề DATA INITIALLY DEFERRED đơn giản ngầm ý các
dữ liệu sẽ không được chèn vào bảng như là một phần của câu lệnh CREATE
TABLE. Sau khi được tạo, MQT ở trạng thái chờ kiểm tra (xem bảng
Demystifying và các trạng thái của không gian bảng), và không thể được truy vấn
cho đến khi câu lệnh SET INTEGRITY thực hiện đối với nó. Mệnh đề
IMMEDIATE CHECKED quy định rằng dữ liệu được kiểm tra đối với truy vấn
xác định của MQT và được làm mới; mệnh đề NOT INCREMENTAL định rằng
việc kiểm tra tính toàn vẹn được thực hiện trên toàn bộ bảng. Một truy vấn được
thực hiện đối với bảng truy vấn cụ thể hóa EMP cho thấy lúc này nó được điền
đầy đủ dữ liệu.
Liệt kê 1. Tạo một MQT được hệ thống duy trì
connect to sample
...
alter table employee add unique (empno)
alter table department add unique (deptno)
create table emp as (select e.empno, e.firstnme, e.lastname, e.phoneno, d.deptno,
substr(d.deptname, 1, 12) as department, d.mgrno from employee e, department d
where e.workdept = d.deptno)
data
initially deferred refresh immediate set integrity for emp immediate
checked not
incremental
select * from emp
EMPNO FIRSTNME
LASTNAME
PHONENO DEPTNO
DEPARTMENT MGRNO
------ ------------ --------------- ------- ------ ------------ -----000010 CHRISTINE
HAAS
000020 MICHAEL
THOMPSON
000030 SALLY
000050 JOHN
KWAN
3476
4738
C01
SPIFFY COMPU 000010
B01
PLANNING
000020
INFORMATION 000030
GEYER
6789
E01
STERN
6423
D11
MANUFACTURIN 000060
PULASKI
7831
D21
ADMINISTRATI 000070
000060 IRVING
000070 EVA
3978 A00
000090 EILEEN
HENDERSON
000100 THEODORE
SPENSER
000110 VINCENZO
LUCCHESSI
SUPPORT SERV 000050
5498
E11
OPERATIONS 000090
0972
E21
SOFTWARE SUP 000100
3490
A00
SPIFFY COMPU 000010
000120 SEAN
O'CONNELL
000130 DOLORES
2167 A00
QUINTANA
4578
SPIFFY COMPU 000010
C01
INFORMATION 000030
...
000340 JASON
GOUNOT
5698
E21
SOFTWARE SUP 000100
32 record(s) selected.
connect reset
Các MQT được duy trì bởi người dùng
Các dữ liệu trong loại này của bảng truy vấn cụ thể hóa được người dùng duy trì.
Chỉ có bảng truy vấn cụ thể hóa REFRESH DEFERRED có thể được định nghĩa là
MAINTAINED BY USER, được người dùng duy trì. Câu lệnh REFRESH
TABLE (sử dụng cho các MQT do hệ thống duy trì) khơng thể dùng với các MQT
do người sử dụng duy trì. Các MQT được người dùng duy trì cho phép thực hiện
các hoạt động chèn, cập nhật, hoặc xóa với chúng.
Liệt kê 2 cho thấy ví dụ tạo ra một MQT với REFRESH DEFERRED do người sử
dụng duy trì. Bảng tên là ONTARIO_1995_SALES_TEAM dựa trên các bảng
EMPLOYEE và SALES trong cơ sở dữ liệu SAMPLE. Như trên, mệnh đề DATA
INITIALLY DEFERRED ngầm ý dữ liệu sẽ không được chèn vào bảng như là
một phần của câu lệnh CREATE TABLE. Sau khi được tạo, MQT ở trạng thái chờ
kiểm tra (Xem bảng Demystifying và các tình trạng của không gian bảng), và
không thể được truy vấn cho đến khi thực hiện câu lệnh SET INTEGRITY với nó.
Mệnh đề MATERIALIZED QUERY IMMEDIATE UNCHECKED quy định
bảng phải bật chức năng kiểm tra tính tồn vẹn, nhưng là để được đưa ra khỏi tình
trạng chờ kiểm tra mà khơng bị kiểm tra việc vi phạm tính tồn vẹn.
Tiếp theo, để điền một số dữ liệu vào MQT, chúng ta sẽ đưa vào các dữ liệu được
xuất từ các bảng EMPLOYEE và SALES. Truy vấn xuất phù hợp với truy vấn xác
định cho MQT này. Sau đó chúng ta sẽ chèn bản ghi khác vào bảng
ONTARIO_1995_SALES_TEAM.
Truy vấn thực hiện đối với bảng truy vấn cụ thể hóa
ONTARIO_1995_SALES_TEAM cho thấy lúc này nó chưa được điền đầy đủ các
dữ liệu nhập vào và đưa vào, chứng tỏ rằng các MQT được người sử dụng duy trì
thực sự có thể được sửa đổi trực tiếp.
Liệt kê 2. Tạo một MQT do người sử dụng duy trì
connect to sample
...
create table ontario_1995_sales_team as (select distinct e.empno, e.firstnme,
e.lastname, e.workdept, e.phoneno, 'Ontario' as region,
year(s.sales_date) as year from employee e, sales s
where e.lastname = s.sales_person and year(s.sales_date) = 1995
and left(s.region, 3) = 'Ont')
data
initially deferred refresh deferred maintained by user set integrity for
ontario_1995_sales_team materialized query immediate
unchecked
export to ontario_1995_sales_team.del of del
select distinct e.empno, e.firstnme, e.lastname, e.workdept, e.phoneno,
'Ontario' as region, year(s.sales_date) as year from employee e,
sales s
where e.lastname = s.sales_person and year(s.sales_date) = 1995
and left(s.region, 3) = 'Ont'
...
Number of rows exported: 2
import from ontario_1995_sales_team.del of del insert into
ontario_1995_sales_team
...
Number of rows committed
=2
insert into ontario_1995_sales_team
values ('006900', 'RUSS', 'DYERS', 'D44', '1234', 'Ontario', 1995)
select * from ontario_1995_sales_team
EMPNO FIRSTNME
LASTNAME
WORKDEPT PHONENO REGION
YEAR
------ ------------ --------------- -------- ------- ------- ----------000110 VINCENZO
000330 WING
LUCCHESSI
LEE
E21
A00
3490
2103
Ontario
Ontario
1995
1995
006900 RUSS
DYERS
D44
1234
Ontario
1995
3 record(s) selected.
connect reset
Bảng tóm tắt
Bạn nhớ lại bảng tóm tắt là loại bảng MQT đặc biệt mà lựa chọn đầy đủ chứa
mệnh đề GROUP BY nhằm tóm tắt các dữ liệu từ các bảng được tham chiếu bằng
trong câu lựa chọn. Liệt kê 3 là một ví dụ đơn giản để tạo bảng tóm tắt. Bảng tên
là SALES_SUMMARY dựa trên bảng SALES nêu ra trong cơ sở dữ liệu
SAMPLE. Và mệnh đề DATA INITIALLY DEFERRED có nghĩa dữ liệu sẽ
không được chèn vào bảng như là một phần của câu lệnh CREATE TABLE.
Mệnh đề DATA INITIALLY DEFERRED ngầm định dữ liệu trong bảng có thể
được làm mới bất kỳ lúc nào bằng cách sử dụng câu lệnh REFRESH TABLE. Một
truy vấn cho MQT ngay sau khi nó được tạo, nhưng trước khi sử dụng câu
REFRESH TABLE sẽ gây lỗi. Sau khi câu lệnh REFRESH TABLE thực hiện,
truy vấn chạy thành cơng.
Hoạt động chèn sau đó vào bảng SALES, sau việc làm mới bảng tóm tắt và một
truy vấn đối với các bảng tóm tắt, cho thấy thay đổi đối với bảng nêu ra được thể
hiện trong bảng tóm tắt: tổng doanh số của nhân viên bán hàng Lee trong khu vực
Nam Ontario đã tăng lên 100. Ta có thể thấy hành vi tương tự ứng với việc cập
nhật hoặc xóa trong bảng SALES kể ra.
Ví dụ 3. Tạo một bảng tóm tắt
connect to sample
...
create table sales_summary as (select sales_person, region, sum(sales)
as total_sales
from sales group
by sales_person, region)
data initially deferred refresh
deferred
select * from sales_summary
SALES_PERSON
REGION
TOTAL_SALES
--------------- --------------- ----------SQL0668N Operation not allowed for reason code "1" on table
"MELNYK.SALES_SUMMARY". SQLSTATE=57016
refresh table sales_summary
select * from sales_summary
SALES_PERSON
REGION
TOTAL_SALES
--------------- --------------- ----------GOUNOT
Manitoba
GOUNOT
Ontario-North
1
GOUNOT
Ontario-South
10
GOUNOT
Quebec
LEE
Manitoba
LEE
Ontario-North
15
24
23
8
LEE
Ontario-South
LEE
Quebec
34
26
LUCCHESSI
Manitoba
LUCCHESSI
Ontario-South
LUCCHESSI
Quebec
3
8
3
11 record(s) selected.
insert
into
sales values ('06/28/2005', 'LEE', 'Ontario-South', 100)
refresh table sales_summary
select * from sales_summary
SALES_PERSON
REGION
TOTAL_SALES
--------------- --------------- ----------...
LEE
Ontario-North
8
LEE
Ontario-South
134
LEE
Quebec
26
...
11 record(s) selected.
update
sales set sales = 50 where sales_date = '06/28/2005' and
sales_person = 'LEE'
and region = 'Ontario-South'
refresh table sales_summary
select * from sales_summary
SALES_PERSON
REGION
TOTAL_SALES
--------------- --------------- ----------...
LEE
Ontario-North
8
LEE
Ontario-South
84
LEE
Quebec
26
...
11 record(s) selected.
delete
from
sales where sales_date = '06/28/2005' and sales_person = 'LEE'
and region = 'Ontario-South'
refresh table sales_summary
select * from sales_summary
SALES_PERSON
REGION
TOTAL_SALES
--------------- --------------- ----------...
LEE
Ontario-North
8
LEE
Ontario-South
34
LEE
Quebec
...
11 record(s) selected.
connect reset
26
Các bảng phân tầng
Bạn có thể làm mới nhiều lên với MQT có REFRESH DEFERRED nếu nó có một
bảng phân tầng gắn liền với nó. Bảng phân tầng thu thập những thay đổi cần được
áp dụng để đồng bộ MQT với các bảng đi kèm. Bạn có thể tạo bảng phân tầng
bằng cách sử dụng câu lệnh CREATE TABLE; rồi khi các bảng kể ra của MQT
được sửa đổi, các thay đổi được truyền và ngay lập tức nối vào bảng phân tầng. Ý
tưởng là sử dụng bảng phân tầng để từng bước làm mới MQT, hơn là tái tạo MQT
từ đầu. Sự bảo trì gia tăng đảm bảo hiệu suất được cải thiện đáng kể. Bảng phân
tầng được lược bớt đi khi các hoạt động làm mới hoàn tất.
Sau khi được tạo, bảng phân tầng ở trong trạng thái chờ (khơng bền); nó phải được
đưa ra khỏi trạng thái này trước khi nó có thể bắt đầu thu thập các thay đổi trên
các bảng nêu ra. Bạn có thể thực hiện điều này bằng cách sử dụng câu lệnh SET
INTEGRITY.
Liệt kê 4 cho thấy ví dụ về cách sử dụng bảng phân tầng với bảng tóm tắt. Bảng
tóm tắt tên là EMP_SUMMARY dựa trên bảng nêu ra EMPLOYEE trong cơ sở
dữ liệu SAMPLE. Bạn sẽ nhớ lại rằng mệnh đề DATA INITIALLY DEFERRED
có nghĩa là dữ liệu sẽ khơng được chèn vào bảng như là một phần của câu lệnh
CREATE TABLE. Mệnh đề REFRESH DEFERRED với nghĩa các dữ liệu trong
bảng có thể được làm mới bất kỳ lúc nào bằng cách sử dụng câu lệnh REFRESH
TABLE. Bảng phân tầng tên là EMP_SUMMARY_S kết hợp với bảng tóm tắt
EMP_SUMMARY. Mệnh đề PROPAGATE IMMEDIATE quy định rằng bất kỳ
thay đổi nào đối với bảng nêu ra như phần của chèn, cập nhật, hoặc xóa sẽ được
xếp tầng vào bảng phân tầng này. Câu lệnh SET INTEGRITY được dùng cho cả
hai bảng để đưa chúng ra khỏi trạng thái chờ.
Không bất ngờ khi truy vấn đối với bảng tóm tắt tại lúc này không cho về dữ liệu
nào. Câu lệnh REFRESH TABLE cho ra cảnh báo, nhắc rằng "tính tồn vẹn của
dữ liệu không gia tăng vẫn chưa được xác minh." Đây không là điều bất ngờ. Một
truy vấn khác đối với các bảng tóm tắt cũng khơng cho ra dữ liệu. Tuy nhiên, sau
khi chúng ta chèn một hàng mới của dữ liệu vào bảng EMPLOYEE nêu ra, truy
vấn đối với bảng phân tầng EMP_SUMMARY_S trả về một hàng, tương ứng với
dữ liệu vừa mới được chèn vào. Bảng phân tầng cũng có ba cột giống như bảng
tóm tắt bên dưới của nó, cộng thêm hai cột được hệ thống sử dụng:
GLOBALTRANSID (ID của sự giao tác tổng thể đối với mỗi hàng được nhân lên)
và GLOBALTRANSTIME (dấu thời gian của giao tác). Truy vấn khác đối với
bảng tóm tắt không cho ra dữ liệu, nhưng sau khi câu lệnh REFRESH TABLE
thực hiện lần này, thì truy vấn chạy thành công.
Liệt kê 4. Sử dụng bảng phân tầng với bảng tóm tắt
connect to sample
...
create table emp_summary as (select workdept, job, count(*) as count
from employee group
by workdept, job)
data initially deferred refresh deferred create table emp_summary_s
for emp_summary propagate immediate set integrity
for emp_summary materialized query immediate
unchecked set integrity for emp_summary_s staging immediate unchecked
select * from emp_summary
WORKDEPT JOB
COUNT
-------- -------- -----------
0 record(s) selected.
refresh table emp_summary
SQL1594W Integrity of non-incremental data remains unverified by the
database manager. SQLSTATE=01636
select * from emp_summary
WORKDEPT JOB
COUNT
-------- -------- -----------
0 record(s) selected.
insert into employee
values ('006900', 'RUSS', 'L', 'DYERS', 'D44', '1234', '1960-05-05',
'FIELDREP', 5, 'M', '1940-04-02', 10000, 100, 1000)
select * from emp_summary_s
WORKDEPT JOB
COUNT
GLOBALTRANSID
GLOBALTRANSTIME
-------- -------- ----------- -------------------... -----------------------------...
D44
FIELDREP
1 x'00000000000000CD'
x'20050822201344536158000000'
1 record(s) selected.
select * from emp_summary
WORKDEPT JOB
COUNT
-------- -------- -----------
0 record(s) selected.
refresh table emp_summary
SQL1594W Integrity of non-incremental data remains unverified by the database
manager. SQLSTATE=01636
select * from emp_summary
WORKDEPT JOB
COUNT
-------- -------- ----------D44
FIELDREP
1
1 record(s) selected.
connect reset
Tóm tắt
Khung nhìn của danh mục hệ thống SYSCAT.TABDEP chứa một hàng đối với
mỗi phụ thuộc mà bảng truy vấn cụ thể hóa có trên một vài đối tượng khác. Bạn có
thể truy vấn khung nhìn này để có bản tóm tắt các phụ thuộc cho các MQT mà ta
đã tạo (Liệt kê 5). Các MQT có giá trị DTYPE là 'S.' Cột TABNAME liệt kê tên
của các MQT, và cột BNAME liệt kê tên của các đối tượng cơ sở dữ liệu mà trên
đó các MQT tương ứng dựa vào. Cột BTYPE xác định các loại đối tượng: 'T' cho
bảng, "I" cho chỉ mục và 'F' cho cá thể chức năng.
Liệt kê 5. Truy vấn khung nhìn của danh mục hệ thống SYSCAT.TABDEP
để xem các phụ thuộc của MQT trên các đối tượng cơ sở dữ liệu khác.
connect to sample
...
select substr(tabname,1,24) as tabname, dtype, substr(bname,1,24) as bname,
btype
from syscat.tabdep where tabschema = 'MELNYK' and dtype = 'S'
TABNAME
DTYPE BNAME
BTYPE
------------------------ ----- ------------------------ ----EMP
S
DEPARTMENT
EMP
S
EMPLOYEE
EMP
S
SQL050829104058970
I
EMP
S
SQL050829104058800
I
EMP_SUMMARY
S
T
T
EMPLOYEE
T
ONTARIO_1995_SALES_TEAM S
LEFT1
F
ONTARIO_1995_SALES_TEAM S
SALES
T
ONTARIO_1995_SALES_TEAM S
EMPLOYEE
SALES_SUMMARY
S
SALES
T
T
9 record(s) selected.
connect reset
Chúng ta đã thấy rằng bảng truy vấn cụ thể hoá, được xác định theo kết quả của
một truy vấn, có thể được xem như là một loại khung nhìn cụ thể hóa. Các MQT
rất quan trọng bởi vì chúng có thể làm giảm đáng kể thời gian cần cho các truy vấn
phức tạp. Bài viết này đã giới thiệu cho bạn các khái niệm cơ bản về các MQT do
hệ thống duy trì và các MQT được duy trì bởi người sử dụng, cũng như bảng tóm
tắt và bảng phân tầng, và những khái niệm này được minh họa bằng cách ví dụ
đang làm việc mà bạn có thể tự chạy được. Để tìm hiểu thêm về các bảng truy vấn
cụ thể hóa hoặc để biết thêm thông tin chi tiết về bất cứ chủ đề nào được đề cập
trong bài viết này, xin truy cập Trung tâm Thông tin của DB2.
Mục lục
Các MQT được duy trì bởi hệ thống
Các MQT được duy trì bởi người dùng
Bảng tóm tắt
Các bảng phân tầng
Tóm tắt