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ể hoá đị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.
8 trang |
Chia sẻ: lylyngoc | Lượt xem: 1508 | Lượt tải: 1
Bạn đang xem nội dung tài liệu 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, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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
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ể hoá đị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 3978 A00 SPIFFY COMPU 000010
000020 MICHAEL THOMPSON 3476 B01 PLANNING 000020
000030 SALLY KWAN 4738 C01 INFORMATION 000030
000050 JOHN GEYER 6789 E01 SUPPORT SERV 000050
000060 IRVING STERN 6423 D11 MANUFACTURIN 000060
000070 EVA PULASKI 7831 D21 ADMINISTRATI 000070
000090 EILEEN HENDERSON 5498 E11 OPERATIONS 000090
000100 THEODORE SPENSER 0972 E21 SOFTWARE SUP 000100
000110 VINCENZO LUCCHESSI 3490 A00 SPIFFY COMPU 000010
000120 SEAN O'CONNELL 2167 A00 SPIFFY COMPU 000010
000130 DOLORES QUINTANA 4578 C01 INFORMATION 000030
...
000340 JASON GOUNOT 5698 E21 SOFTWARE SUP 000100
32 record(s) selected.
connect reset
Về đầu trang
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 toà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 toà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 LUCCHESSI A00 3490 Ontario 1995
000330 WING LEE E21 2103 Ontario 1995
006900 RUSS DYERS D44 1234 Ontario 1995
3 record(s) selected.
connect reset
Về đầu trang
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 15
GOUNOT Ontario-North 1
GOUNOT Ontario-South 10
GOUNOT Quebec 24
LEE Manitoba 23
LEE Ontario-North 8
LEE Ontario-South 34
LEE Quebec 26
LUCCHESSI Manitoba 3
LUCCHESSI Ontario-South 8
LUCCHESSI Quebec 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 26
...
11 record(s) selected.
connect reset
Về đầu trang
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 toà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