Tải bản đầy đủ (.pdf) (24 trang)

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 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (166.93 KB, 24 trang )

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



×