Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
ĐẠI HỌC HUẾ
TRƯỜNG ĐẠI HỌC KHOA HỌC
Đề tài:
CÁC THUẬT TOÁN XỬ LÝ
VÀ
TỐI ƯU HÓA TRUY VẤN
Giáo viên hướng dẫn: Nhóm học viên thực hiện:
TS. Hoàng Quang Trần Như Đăng Tuyên
Nguyễn Vũ Cát Trường
Nguyễn Thị Thanh Tâm
Trần Thị Thành
Lê Bá Minh Phong
HUẾ 11/2011
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
TS. Hoàng Quang Trần Như Đăng Tuyên 1
A.MỞ ĐẦU 1
B. NỘI DUNG 4
1. Chuyển các câu truy vấn SQL sang đại số quan hệ 4
2. Các thuật toán cho việc sắp xếp ngoài 5
3. Các giải thuật đối với phép chọn (select) và phép nối (join) 7
4. Các giải thuật đối với phép chiếu (project) và các phép toán trên tập hợp 22
5. Sự thực hiện của các phép toán kết hợp và các phép nối ngoài 24
6. Sự kết hợp các phép toán bằng kỹ thuật đường ống 28
7. Tối ưu hóa câu truy vấn bằng heuristic 29
8. Sử dụng sự lựa chọn và ước lượng chi phí trong tối ưu hóa câu truy vấn 41
9. Tổng quan về tối ưu hoá truy vấn trong Oracle 54
10. Tối ưu hoá truy vấn ngữ nghĩa 55
C. BÀI TẬP 56
D. KẾT LUẬN 59
E. TÀI LIỆU THAM KHẢO 60
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
A. MỞ ĐẦU
Tiểu luận này sẽ trình bày các kỹ thuật dùng Hệ quản trị cơ sở dữ liệu (DBMS)
để xử lý, tối ưu hóa và thực hiện truy vấn mức cao. Một truy vấn biểu diễn trong
ngôn ngữ truy vấn bậc cao như SQL đầu tiên phải được kiểm tra, phân tích cú
pháp, làm cho hợp lệ. Việc kiểm tra là nhận dạng các dấu hiệu ngôn ngữ như là
các từ khóa SQL, tên thuộc tính, tên quan hệ - trong phần chữ của câu truy vấn,
ngược lại, việc phân tích cú pháp kiểm tra cú pháp câu truy vấn để xác định nó có
được lập công thức theo các qui tắc cú pháp (các qui tắc ngữ pháp) của ngôn ngữ
truy vấn không. Truy vấn cũng phải được phê chuẩn, bằng cách kiểm tra tất cả các
tên thuộc tính và quan hệ hợp lý, về ngữ nghĩa, ý nghĩa của tên trong lược đồ của
cơ sở dữ liệu đang được truy vấn. Sau đó, mô tả câu truy vấn. Cũng như cấu trúc
dữ liệu dạng cây, ở đây gọi là cây truy vấn. Nó cũng có thể biểu diễn câu truy vấn
bằng cách sử dụng một cấu trúc dữ liệu đồ họa gọi là đồ thị truy vấn. Sau đó một
DBMS phải đặt ra cách lấy kết quả các câu hỏi từ các tập tin cơ sở dữ liệu. Đặc
trưng của một câu truy vấn là có nhiều cách để thực hiện, và việc chọn lựa cách xử
lý truy vấn thích hợp đối với việc xử lý truy vấn được xem là tối ưu hóa truy vấn.
Hình 1 thể hiện các bước khác nhau của việc xử lí truy vấn bậc cao. Tối ưu hóa
truy vấn có nhiệm vụ đưa ra sơ đồ thực hiện, và sinh ra mã để thực hiện sơ đồ đó.
Quản trị cơ sở dữ liệu hiện tại có nhiệm vụ chạy mã truy vấn, mỗi khi trong chế độ
biên dịch hoặc trình diễn, để đưa ra kết quả truy vấn. Khi kết quả chạy lỗi, thông
báo lỗi sẽ được đưa ra bởi hệ quản trị cơ sở dữ liệu .
Tối ưu hóa toán hạng thực ra là chưa chích xác bởi vì trong một số trường hợp
việc thực hiện sơ đồ đã chọn không là chiến lược tối ưu, nó thật sự là chiến lược
hiệu quả hợp lí đối với việc thực hiện truy vấn. Việc tìm ra chiến lược tối ưu
thường mất nhiều thời gian đối với các câu truy vấn đơn giản nhất và có thể đòi
hỏi thông tin có bao nhiêu tập tin được thực hiện và ngay cả các tập tin mà thông
tin có thể không có sẵn đầy đủ trong danh mục DBMS. Vì vậy việc lập sơ đồ thực
hiện chiến lược có thể mô tả chính xác hơn việc tối ưu hóa truy vấn.
1
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
Tiểu luận sẽ chỉ tập trung biểu diễn tối ưu hóa truy vấn trong ngữ cảnh của một
RDBMS. Một hệ quản trị cơ sở dữ liệu quan hệ phải định giá các chiến lược thực
hiện truy vấn khác một cách có hệ thống và chọn chiến lược khá hiệu quả hoặc
chiến lược tối ưu.
Mỗi DBMS có số thuật toán truy cập cơ sở dữ liệu chung thực hiện các phép
toán quan hệ như là SELECT hoặc JOIN hoặc kết hợp các phép toán này. Chỉ có
việc thực hiện các chiến lược mà có thể thực hiện bằng các thuật toán truy cập cơ
sở dữ liệu và áp dụng cho truy vấn riêng và thiết kế cơ sở dữ liệu vật lý riêng có
thể mô tả bằng module tối ưu hóa truy vấn.
Tổng quát nội dung tiểu luận như sau:
Phần 1: Các truy vấn SQL được chuyển sang các truy vấn đại số quan hệ và sau
đó được tối ưu hóa như thế nào. Từ phần 2 đến 6 giới thiệu các thuật toán đối với
2
Truy vấn trong ngôn ngữ bậc cao
Kiểm tra, phân tích cú pháp và làm cho hợp lệ
Dạng gần với truy vấn
Tối ưu hóa truy vấn
Thực hiện vẽ sơ đồ
Tạo mã truy vấn
Viết mã cho việc thực hiện truy vấn
Xử lý cơ sở dữ liệu hiện thời
Kết quả truy vấn
Hình 1. Các bước đặc trưng khi xử lí truy vấn mức cao
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
việc thi hành các phép toán quan hệ. Sau đó, giới thiệu tổng quan về các chiến
lược tối ưu hóa truy vấn. Có hai kỹ thuật chính để thực hiện tối ưu hóa truy vấn.
Kỹ thuật đầu tiên dựa vào các qui tắc Heuristic (quy tắc mang tính kinh nghiệm)
nhằm sắp xếp các phép toán trong một chiến lược thực hiện truy vấn. Heuristic là
một qui tắc áp dụng tốt trong hầu hết các trường hợp nhưng không đảm bảo áp
dụng tốt trong mọi trường hợp. Các qui tắc này thường sắp xếp lại các phép toán
trong một cây truy vấn. Kỹ thuật thứ hai gồm việc đánh giá một cách có hệ thống
chi phí các chiến lược thực hiện khác nhau và chọn kế hoạch thực hiện có ước
lượng chi phí thấp nhất. Các kỹ thuật này thường được kết hợp trong một tối ưu
hóa truy vấn.
Phần 7: Trình bày sự tối ưu hóa bằng Heuristic.
Phần 8: Trình bày sự tối ưu hóa bằng ước lượng chi phí
Phần 9: Một mô tả tóm tắt các yếu tố được xem xét trong suốt quá trình tối ưu
hóa truy vấn trong hệ quản trị CSDL quan hệ thương mại Oracle.
Phần 10: Giới thiệu chủ đề về tối ưu hóa truy vấn ngữ nghĩa, trong đó biết các
ràng buộc được sử dụng để tạo ra các chiến lược thực hiện truy vấn hiệu quả.
3
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
B. NỘI DUNG
1. Chuyển các câu truy vấn SQL sang đại số quan hệ
Trong thực tiễn, SQL là ngôn ngữ truy vấn được sử dụng trong hầu hết hệ quản
trị cơ sở dữ liệu. Đầu tiên một câu truy vấn được chuyển đổi sang một biểu thức
đại số quan hệ mở rộng tương đương- biểu diễn dưới dạng cấu trúc cây truy vấn -
sau đó tối ưu. Đặc biệt, các câu truy vấn SQL được phân tích thành các khối truy
vấn, nó tạo thành các đơn vị cơ sở mà có thể chuyển đổi sang các phép toán quan
hệ và tối ưu hóa. Một khối truy vấn bao gồm một biểu thức đơn SELECT-FROM-
WHERE, cũng như các mệnh đề GROUP BY và HAVING nếu chúng là bộ phận
của block. Vì vậy, các truy vấn lồng nhau được xác định như là các khối truy vấn
riêng biệt. Bởi vì SQL bao gồm tập hợp các phép toán – như là MAX, MIN, SUM
và COUNT – các phép toán này cũng được chứa trong đại số mở rộng.
Xét câu truy vấn SQL trên lược đồ quan hệ EMPLOYEE sau đây:
EMPLOYEE(Fname, Minit, Lname, Ssn, Bdate, Address, Sex, Salary, Super_ssn,
Dno)
SELECT Lname, Fname
FROM EMPLOYEE
WHERE Salary > ( SELECT MAX(Salary)
FROM EMPLOYEE
WHERE Dno = 5);
Câu truy vấn này bao gồm một truy vấn con lồng và vì vậy sẽ được phân tích
thành hai khối. Khối bên trong là:
( SELECT MAX(Salary)
FROM EMPLOYEE
WHERE Dno = 5);
Và khối ngoài là
SELECT Lname, Fname
FROM EMPLOYEE
WHERE Salary > C
4
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
Trong đó C biểu diễn kết quả trả về từ khối trong. Khối trong có thể được
chuyển sang biểu thức đại số quan hệ mở rộng
ℑ
MAX
Salary
(σ
Dno=5
(EMPLOYEE))
Trong đó ℑ là phép kết hợp hàm (AGGREGATE FUNCTION: SUM,
AVERAGE, MAXIMUM, MINIMUM, COUNT)
Và block ngoài sang biểu thức
Л
Lname,Fname
(σ
Salary>c
(EMPLOYEE))
Tối ưu hóa câu truy vấn chọn một cách thực hiện đối với mỗi khối. Chúng ta
lưu ý rằng trong ví dụ trên, chỉ khối trong cần được định giá để đưa ra lương tối
đa, sau đó nó được dùng như hằng số C cho khối ngoài.
2. Các thuật toán cho việc sắp xếp ngoài.
Sắp xếp là một trong những thuật toán đầu tiên sử dụng trong xử lý truy vấn.
Ví dụ như mỗi khi một câu truy vấn SQL có mệnh đề ORDER BY, kết quả truy
vấn phải được sắp xếp. Việc sắp xếp cũng là một kỹ thuật bộ phận trong các giải
thuật sắp trộn sử dụng cho phép JOIN và các phép khác (như là UNION và
INTERSECTION), và trong các giải thuật loại trừ giống nhau đối với phép
PROJECT (khi một câu truy vấn SQL có tùy chọn DISTINCT trong mệnh đề
SELECT). Chúng ta sẽ thảo luận một trong các giải thuật này trong phần này. Lưu
ý rằng, việc sắp xếp có thể không dùng nếu một chỉ mục thích hợp tồn tại cho phép
truy cập thứ tự đến các bản ghi.
Sắp xếp ngoài dựa vào các giải thuật sắp xếp thích hợp với các tập tin lớn của
các bản ghi được lưu trữ trên đĩa mà không hoàn toàn đủ trong bộ nhớ chính, như
là các tập tin cơ sở dữ liệu lớn.
Giải thuật sắp xếp ngoài đặc trưng sử dụng một chiến lược sắp trộn bắt đầu
bằng việc sắp xếp các file con – gọi là runs của file chính và sau đó trộn các runs,
tạo các file con đã sắp lớn hơn được trộn lần lượt. Giải thuật sắp trộn, giống như
các giải thuật cơ sở dữ liệu khác, đòi hỏi bộ đệm trong bộ nhớ chính, thực tế việc
sắp xếp và trộn của các runs được thực hiện tại đó. Thuật toán cơ sở trình bày
trong hình 2, bao gồm 2 giai đoạn: một giai đoạn sắp và một giai đoạn trộn.
5
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
Hình 2. Tổng quan thuật toán sắp trộn đối với sắp xếp ngoài
6
Set i ←1;
j ←b; {kích thước của file trong các khối}
k ←n
B
; {kích thước của vùng đệm trong các khối }
m ←[(j/k)];
{Phần sắp xếp}
While (i<=m)
do {
đọc k blocks tiếp theo của file vào bộ đệm hoặc nếu có ít hơn k các
khối còn lại thì đọc vào các khối còn lại;
sắp xếp các bản ghi trong bộ đệm và ghi như là một file con tạm thời;
i ←i + 1;
}
{Phần trộn: trộn các file con cho đến khi chỉ còn lại một file}
Set i ←1;
p ←[log
k-1
m] {p là số lần đối với phần trộn}
j ←m;
While (i<=p)
Do {
n ←1;
q ←[(j/(k-1)] {số file con để ghi trong lần này}
While (n<=q)
Do {
Đọc k-1 file con tiếp theo hoặc các file con còn lại (từ lần trước)
một khối tại một thời điểm;
Trộn và ghi như file con mới một khối tại một thời điểm.
n← n+1;
}
j←q;
i←i+1;
}
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
Trong giai đoạn sắp, runs (phần chia, mảnh) của file có thể vừa với bộ đệm có
sẵn được đọc vào bộ nhớ chính, sắp xếp bằng giải thuật sắp xếp bên trong và ghi
lại trên đĩa như các file con tạm thời (hoặc runs). Kích thước của một run và số
runs ban đầu (n
R
) được cho bởi số khối file (b) và vùng nhớ có sẵn (n
B
). Ví dụ, nếu
n
B
= 5 khối và kích thước của file b=1024 khối thì n
R
= [(b/n
B
)] hoặc 205 runs ban
đầu kích thước 5 khối (trừ ra run cuối cùng có 4 khối). Vì vậy, sau đoạn sắp xếp,
205 runs đã sắp được sắp như là các file con tạm thời trên đĩa.
Trong đoạn trộn, các runs đã sắp được trộn với nhau bằng một hoặc nhiều lần
thực hiện (pass). Bậc trộn d
M
là số các runs có thể được trộn trong mỗi lần thực
hiện. Khi đó cần một khối đệm để chứa một khối từ mỗi runs đang được trộn, và
một khối cần cho việc chứa một một khối của kết quả trộn. Vì vậy, d
M
là giá trị
nhỏ hơn trong hai giá trị (n
B
-1) và n
R
, và số lần thực hiện trộn là
))(log
RdM
n
.
Trong ví dụ trên, d
M
=4 do đó 205 runs đã sắp ban đầu sẽ được trộn thành 52 tại
cuối cùng của những lần đầu tiên, rồi nó được trộn thành 13, rồi 4, rồi 1 run, điều
đó có nghĩa là cần 4 lần. Tối thiểu d
M
cho trường hợp tốt nhất của thuật toán, đó là:
(2*b) + (2*(b*log
2
b)))
Trong đó:
(2*b) biểu diễn số khối truy cập đối với đoạn sắp xếp, vì mỗi khối của tệp được
truy xuất 2 lần: một cho việc đọc vào bộ nhớ và một cho việc ghi các bản ghi này
lên đĩa sau khi sắp xếp.
(2*(b*log
2
b))) biểu diễn số truy xuất khối trong giai đoạn trộn, giả sử trường
hợp xấu nhất d
M
=2 .
Tổng quát, log được tính dựa trên d
M
và biểu thức đối với số khối truy cập trở
thành: (2*b)+(2*(b*(log
dM
n
R
)))
3. Các giải thuật đối với phép chọn (select) và phép nối (join).
3.1 Thực hiện phép chọn (Select)
Có nhiều tùy chọn cho việc thực hiện phép toán SELECT. Một số tùy chọn phụ
thuộc vào file có chỉ rõ đường dẫn truy cập và có thể chỉ áp dụng cho các kiểu điều
kiện lựa chọn. Chúng ta thảo luận một số thuật toán cho việc thực hiện chọn trong
phần này. Chúng ta sẽ sử dụng các phép sau, trên lược đồ cơ sở dữ liệu quan hệ
dưới đây để minh họa thảo cho phần này.
7
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
OP1: σ
Ssn= ‘123456789’
(EMPLOYEE)
OP2: σ
Dnumber > 5
(DEPARTMENT)
OP3: σ
Dno = 5
(EMPLOYEE)
OP4: σ
Dno= 5 AND Salary>3000 AND Sex= ‘F’
(DEPARTMENT)
OP5: σ
Essn= ‘123456789’AND Pno =10
(WORKS_ON)
Các phương thức tìm đối với lựa chọn đơn giản. Một số giải thuật tìm kiếm có
khả năng chọn các bản ghi từ file. Các giải thuật này cũng được biết như là duyệt
file, bởi vì chúng duyệt hết các bản ghi của file để tìm kiếm và lấy các bản ghi thỏa
mãn điều kiện chọn. Nếu giải thuật tìm kiếm có sử dụng chỉ mục thì tìm kiến theo
chỉ mục được gọi là index scan (phép duyệt theo chỉ mục). Các phương thức tìm
sau đây (từ S1 đến S6) là các ví dụ về một số thuật toán tìm kiếm mà có thể được
sử dụng để thực hiện phép chọn:
S1- Tìm kiếm tuyến tính (Linear search). Duyệt từng bản ghi trong file, và
kiểm tra giá trị thuộc tính của nó có thỏa mãn điều kiện chọn hay không.
S2- Tìm kiếm nhị phân (Binary search). Nếu điều kiện chọn gồm một so sánh
bằng trên thuộc tính khóa trên file được sắp xếp, tìm kiếm nhị phân có thể hiệu quả
8
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
hơn tìm kiếm tuyến tính. Một ví dụ là OP1 khi Ssn là thuộc tính sắp xếp đối với
file EMPLOYEE.
S3- Sử dụng chỉ mục sơ cấp (hoặc hash key). Nếu điều kiện chọn bao gồm so
sánh bằng trên một thuộc tính khóa với một chỉ mục sơ cấp (hoặc hash key) – ví
dụ như, Ssn = ‘123456789’ trong OP1- sử dụng chỉ mục sơ cấp để lấy bản ghi.
Lưu ý rằng điều kiện này truy tìm bản ghi đơn.
S4- Sử dụng chỉ mục sơ cấp để lấy nhiều bản ghi. Nếu điều kiện so sánh là <,
>=, < hoặc <= trên trường khóa với chỉ mục sơ cấp. Ví dụ như, Dnumber>5 trong
OP2 – sử dụng chỉ mục để tìm các bản ghi thỏa mãn điều kiện bằng tương ứng
(Dnumber=5) sau đó lấy tất cả các bản ghi tiếp theo trong file (đã sắp xếp). Đối
với điều kiện Dnumber<5, lấy hết tất cả các bản ghi có trước.
S5- Sử dụng chỉ mục bó cụm để lấy nhiều bản ghi. Nếu điều kiện chọn gồm
một so sánh bằng trên thuộc tính không khóa với một chỉ mục cụm. Ví dụ như,
Dno=5 trong OP3 – sử dụng chỉ mục để lấy tất cả các bản ghi thỏa mãn điều kiện.
S6- sử dụng chỉ mục thứ cấp (B
+_
tree) trên so sánh bằng. Phương pháp tìm
kiếm này có thể được sử dụng để truy tìm bản ghi đơn nếu trường chỉ mục là một
khóa (có giá trị duy nhất) hoặc để lấy nhiều bản ghi nếu trường chỉ mục không là
khóa. Điều này có thể được dùng đối với các so sánh bao gồm >, >=, <, <=.
Trong phần 8 chúng ta sẽ thảo luận làm cách nào để trình bày công thức ước
lượng chi phí truy cập của các phương pháp tìm kiếm này theo số các truy cập
khối và thời gian truy cập. Phương pháp S1 áp dụng cho bất kỳ tệp nào nhưng tất
cả các phương pháp khác phụ thuộc vào việc có đường dẫn truy cập thích hợp trên
thuộc tính được sử dụng trong điều kiện chọn hay không. Phương pháp S4 và S6
có thể được dùng để truy lục các bản ghi trong một vùng nào đó. Ví dụ, 30000<=
Salary<= 35000. Các truy vấn bao gồm các điều kiện như vậy được gọi là truy vấn
theo vùng (range query).
Các phương pháp tìm kiếm với sự lựa chọn phức tạp. Nếu một điều kiện
của phép toán SELECT là một điều kiện liên kết (conjunctive condition) (tức là nó
được xây dựng từ một số điều kiện đơn giản được kết nối với nhau bằng toán tử
logic AND) thì DBMS có thể sử dụng các phương pháp bổ sung sau đây để thực
hiện phép toán:
9
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
S7-Sự lựa chọn liên kết sử dụng chỉ mục riêng biệt. Nếu một thuộc tính trong
bất kỳ điều kiện đơn giản đơn nào trong điều kiện liên kết có một đường dẫn truy
cập cho phép sử dụng một trong số các phương pháp từ S2 đến S6 thì sử dụng điều
kiện đó để truy lục các bản ghi và sau đó kiểm tra xem mỗi bản ghi đã truy lục có
thỏa mãn các điều kiện đơn giản còn lại trong điều kiện liên kết hay không.
S8-Sự lựa chọn liên kết sử dụng chỉ mục phức hợp. Nếu hai hoặc nhiều thuộc
tính trong các điều kiện bằng của điều kiện liên kết và một chỉ mục phức (hoặc cấu
trúc băm) tồn tại trên các trường kết hợp (ví dụ: nếu một chỉ mục được tạo trên
khóa phức (Essn, Pno) của tệp WORKS_ON như trong OP5) thì chúng ta có thể sử
dụng chỉ mục một cách trực tiếp.
S9- Sự lựa chọn liên kết bằng sự giao nhau của các con trỏ bản ghi. Nếu
các chỉ mục thứ cấp (hoặc các đường dẫn truy cập khác) có giá trị trên nhiều hơn
một trong số các trường trong các điều kiện đơn giản của điều kiện liên kết, và nếu
các chỉ mục bao gồm các con trỏ bản ghi (thường là con trỏ khối) thì mỗi chỉ mục
có thể được dùng để truy lục tập các con trỏ bản ghi thỏa mãn điều kiện riêng biệt.
Sự giao nhau của các tập con trỏ bản ghi này chính là các con trỏ bản ghi thỏa mãn
điều kiện liên kết, sau đó chúng được sử dụng để truy lục các bản ghi một cách
trực tiếp. Nếu chỉ một số các điều kiện có chỉ mục thứ cấp thì mỗi bản ghi đã truy
lục được tiếp tục kiểm tra nhằm xác định xem nó có thỏa mãn các điều kiện còn lại
hay không.
Bất cứ khi nào một điều kiện đơn chỉ định sự chọn lựa (như OP1, OP2 hoặc
OP3) thì chúng ta có thể chỉ cần kiểm tra xem có hay không một đường dẫn truy
cập tồn tại trên thuộc tính bao hàm trong điều kiện đó. Nếu một đường dẫn truy
cập tồn tại thì phương pháp tương ứng với đường dẫn truy cập được sử dụng; trái
lại, phương pháp tìm kiếm tuyến tính có thể được sử dụng. Tối ưu hóa câu truy vấn
đối với phép toán SELECT chủ yếu là cần cho các điều kiện chọn kết hợp bất cứ
khi nào có nhiều hơn một thuộc tính trong điều kiện có đường dẫn truy cập. Bộ tối
ưu hóa sẽ chọn đường dẫn truy cập sao cho truy lục ít bản ghi nhất, theo cách hiệu
quả nhất bằng cách ước lượng các chi phí khác nhau và chọn ra phương pháp có
chi phí ước lượng thấp nhất.
10
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
Khi bộ tối ưu đang chọn giữa nhiều điều kiện đơn giản trong một điều kiện
chọn liên kết thì nó thường xem xét độ chọn lọc (selectivity) của mỗi điều kiện. Độ
chọn lọc được định nghĩa là tỉ lệ giữa số bản ghi (các bộ) thõa điều kiện với tổng
số bản ghi (các bộ) trong tệp (quan hệ) nên đó là một số giữa 0 và 1 (0 nghĩa là
không có bản ghi nào thỏa mãn điều kiện và 1 nghĩa là tất cả bản ghi đều thõa điều
kiện. Mặc dù các độ chọn lọc chính xác của tất cả điều kiện có thể không có giá trị
nhưng ước lượng các độ chọn lọc thường được lưu giữ trong danh mục của DBMS
và được sử dụng bởi bộ tối ưu hóa. Ví dụ, đối với điều kiện bằng trên một thuộc
tính khóa của quan hệ r(R), s=1/|r(R)|, trong đó |r(R)| là số bộ trong quan hệ r(R).
Đối với điều kiện bằng trên một thuộc tính với i giá trị riêng biệt, s có thể được
ước lượng bởi (|r(R)|/i)/|r(R)| hoặc 1/i, giả sử rằng các bản ghi được phân phối giữa
các giá trị riêng biệt. Theo giả thiết này, |r(R)|/i bản ghi sẽ thỏa mãn một điều kiện
bằng trên thuộc tính này. Tổng quát, số bản ghi thỏa một điều kiện chọn với độ
chọn lọc s được ước lượng là |r(R)|*s. Ước lượng này càng nhỏ thì việc muốn dùng
các điều kiện đó trước tiên để lấy các bản ghi càng cao.
So với một điều kiện chọn liên kết thì điều kiện chọn không liên kết (trong đó
các điều kiện đơn giản được kết nối với nhau bằng OR nhiều hơn bằng AND) khó
hơn nhiều để xử lý và tối ưu. Ví dụ:
OP4’: σ
Dno = 5 OR Salary > 30000 OR Sex = ‘F’
(EMPLOYEE)
Với điều kiện như vậy, có thể thực hiện sự tối ưu hoá nhỏ bởi vì các bản ghi
thỏa mãn điều kiện liên kết là hợp của các bản ghi thỏa mãn các điều kiện riêng
biệt. Vì vậy, nếu một trong các điều kiện không có đường dẫn truy cập thì chúng ta
buộc phải dùng phương pháp tìm kiếm tuyến tính. Chỉ khi nào một đường dẫn truy
cập tồn tại trên mọi điều kiện thì chúng ta có thể tối ưu việc lựa chọn bằng cách
truy lục tất cả các bản ghi thỏa mãn mỗi điều kiện và sau đó áp dụng phép hợp để
loại bỏ các bản ghi trùng lặp.
Một DBMS sẽ có sẵn nhiều phương pháp như trình bày ở trên và thường có
nhiều phương pháp bổ sung. Bộ tối ưu hóa truy vấn phải chọn phương pháp thích
hợp để thực hiện mỗi phép SELECT trong một câu truy vấn. Sự tối ưu hoá này sử
11
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
dụng công thức ước lượng chi phí cho mỗi phương pháp truy cập và bộ tối ưu hoá
chọn phương pháp truy cập có chi phí ước lượng thấp nhất.
3.2 Thực hiện phép nối (join)
Phép toán JOIN là một trong những phép toán tiêu tốn thời gian nhất trong xử
lý truy vấn. Nhiều phép nối dùng trong các truy vấn là của các loại EQUIJOIN và
NATURAL JOIN, do đó ở đây chúng ta chỉ xét hai loại này. Có nhiều cách để
thực hiện một phép nối hai chiều (two-way join), đó là phép nối trên hai tệp. Các
phép nối gồm nhiều hơn hai tệp được gọi là các phép nối đa chiều. Số. Trong phần
này chúng ta chỉ trình bày các kỹ thuật thực hiện phép nối hai chiều (dựa vào lược
đồ quan hệ Hình 2), xét thuật toán đối với phép nối có dạng:
R
A=B
S
Trong đó, A và B lần lượt là các thuộc tính tương thích miền (domain-
compatible) của R và S. Các phương pháp thảo luận ở đây có thể được mở rộng
thành các dạng phép nối tổng quát hơn. Chúng ta minh họa bốn kỹ thuật phổ biến
nhất để thực hiện một phép nối, sử dụng các phép nối sau:
OP6: EMPLOYEE
Dno=Dnumber
DEPARTMENT
OP7: DEPARTMENT
Mgr_Ssn=Ssn
EMPLOYEE
Các phương pháp thực hiện phép nối.
J1. Nested–loop join (phép nối vòng lặp lồng nhau). Đối với mỗi bản ghi t
trong R (vòng lặp ngoài), truy lục mỗi bản ghi s từ S (vòng lặp trong) và kiểm tra
xem hai bản ghi có thõa mãn điều kiện nối t[A]=s[B] hay không?
J2- Single – loop join (phép nối vòng lặp đơn) (sử dụng một cấu trúc truy xuất
để truy lục các bản ghi phù hợp). Giả sử một chỉ mục (hoặc khóa băm) tồn tại đối
với thuộc tính nối B của S, tại một thời điểm (vòng lặp đơn) truy lục một bản ghi t
trong R và sau đó sử dụng cấu trúc truy cập để truy lục trực tiếp tất cả các bản ghi
phù hợp s từ S thỏa mãn s[B] = t[A].
J3- Sort-merge join (phép nối sắp xếp trộn). Nếu các bản ghi của R và S được
sắp xếp vật lý theo giá trị của các thuộc tính nối A và B thì chúng ta có thể thực
12
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
hiện phép nối bằng cách hiệu quả nhất có thể. Cả hai tệp được duyệt đồng thời
theo thứ tự của các thuộc tính nối, kết nối các bản ghi có cùng giá trị đối với thuộc
tính A và B. Nếu các tệp chưa được sắp xếp thì trước tiên chúng phải được sắp
bằng cách sử dụng sắp xếp ngoài (xem phần 2). Trong phương pháp này, từng cặp
khối của tệp được sao chép vào các bộ đệm theo thứ tự và các bản ghi của mỗi tệp
được duyệt chỉ một lần để kết nối phù hợp với tệp khác. Nếu cả A và B là các
thuộc tính không khóa thì trong trường hợp đó phương pháp cần được sửa đổi
(mức độ sửa đổi không đáng kể). Thuật toán sort-merge join được tóm tắt như
Hình 4(a). Chúng ta sử dụng R(i) để chỉ bản ghi thứ i trong R. Một biến thể của
thuật toán sort-merge join có thể được sử dụng khi các chỉ mục thứ cấp tồn tại trên
cả hai thuộc tính nối. Các chỉ mục này cung cấp khả năng truy cập (duyệt) các bản
ghi theo thứ tự của các thuộc tính nối, nhưng về mặt vật lí bản thân các bản ghi
được phân bố trên tất cả các khối tệp, vì vậy phương pháp này có thể không hiệu
quả lắm khi truy xuất bản ghi có thể cần phải truy xuất một khối đĩa khác nhau.
(a) Sắp xếp các bộ trong R theo thuộc tính A; (*giả sử R có n bộ
(các bản ghi)*)
Sắp xếp các bộ trong S theo thuộc tính B; (*giả sử S có m bộ
(các bản ghi)*)
Set i
1, j
1;
While (i ≤ n) and (j ≤ m) do
{ if R(i)[A] > S(j)[B] then set j
j +1
elseif R(i)[A] < S(j)[B] then set i
i +1
else { (*R(i)[A] = S(j)[B], do đó chúng ta đưa ra một bộ
tương ứng*)
đưa bộ kết hợp <R(i), S(j)> vào T;
(*đưa ra các bộ khác phù hợp R(i), nếu có*)
set l
j+1;
while (l ≤ m) and (R(i)[A]=S(l)[B]) do
{ đưa ra bộ kết hợp <R(i), S(l)> vào T;
set l
l+1
13
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
}
(*đưa ra các bộ khác phù hợp S(j), nếu có*)
Set k
i+1;
while (k ≤ n) and (R(k)[A]= S(j)[B]) do
{ đưa các bộ kết hợp <R(k),S(j)> vào T;
set k
k + 1
}
set i
k, j
l
}
}
(b) Tạo một bộ t[<danh sách thuộc tính>] trong T’ cho mỗi bộ t trong R;
(* T’ chứa kết quả phép chiếu trước khi loại bỏ các bản ghi trùng lặp*)
If <danh sách các thuộc tính> bao gồm một khóa của R Then T
T’
Else
{ sắp xếp các bộ trong T’;
Set i
1, j
2;
While i ≤ n do
{ đưa bộ T’[i] vào T;
While T’[i]=T’[j] and j ≤ n do j
j+1; (*loại bỏ các bản ghi
trùng lặp*)
i
j; j
i+1
}
}
(* T chứa kết quả phép chiếu sau khi loại bỏ các bản ghi trùng lặp*)
(c) Sắp xếp các bộ trong R và S bằng cách sử dụng cùng các thuộc tính
sắp xếp duy nhất ;
Set i
1, j
1;
While (i ≤ n) and ( j≤ m) do
{ if R(i) > S(i) then
14
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
{ đưa S(j) vào T
Set j
j+ 1
}
Elseif R(i) < S(j) then
{ đưa R(i) vào T;
set i
i+ 1
}
Else set j
j+1 (* R(i) = S(j), vì vậy chúng ta bỏ qua một trong các
bộ trùng lặp*)
}
If (i ≤ n) then thêm các bộ từ R(i) đến R(n) vào T;
If (j ≤ m) then thêm các bộ từ S(j) đến R(m) vào T;
(d) Sắp xếp các bộ trong R và S bằng cách sử dụng cùng các thộc tính sắp
xếp duy nhất.
Set i
1, j
1;
While (i ≤ n) and (j ≤ m) do
{ if R(i) > S(j) then set j
j+1
Elseif R(i) < S(j) then set i
i+1
Else
{đưa R(j) vào T; (*vì R(i)= S(j), vì vậy chúng ta đưa ra bộ này*)
Set i
i+1, j
j+1
}
}
(e) Sắp xếp các bộ trong R và S bằng cách sử dụng cùng các thộc tính sắp
xếp duy nhất.
Set i
1, j
1;
While (i ≤ n) and (j ≤ m) do
{ if R(i) > S(j) then set j
j+1
Elseif R(i) < S(j) then
15
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
{ đưa R(j) vào T; (*R(i) không phù hợp với S(j), vì vậy đưa
ra R(i)*)
Set i
i+1
}
Else set i
i+1, j
j+1
}
If (i ≤ n) then thêm các bộ từ R(i) đến R(n) vào T;
Hình 4: Thực hiện phép JOIN,PROJECT, UNION, INTERSECTION và SET
DIFFERENCE bằng cách sử dụng Sort-merge, trong đó R có n bộ và S có m bộ
(a) Thực hiện phép T
R
A=B
S
(b) Thực hiện phép T
Л
<attribute list>
(R)
(c) Thực hiện phép T
R
∪
S
(d) Thực hiện phép
SRT ∩←
(e) Thực hiện phép T
R - S
J4-Hash – join (phép nối băm). Các bản ghi của tệp R và S cả hai được băm
đến cùng tệp băm bằng cách sử dụng hàm băm giống nhau trên các thuộc tính nối
A của R và B của S như là các khóa băm. Đầu tiên, băm các bản ghi của tệp có ít
bản ghi hơn (giả sử là R) đến các bucket tệp băm; đây được gọi là giai đoạn phân
chia do đó các bản ghi của R được phân chia vào các bucket băm. Trong giai đoạn
thứ hai gọi là giai đoạn tìm kiếm, một thực hiện đơn qua tệp khác (S) sau đó băm
mỗi bản ghi của nó để dò tìm bucket thích hợp và bản ghi đó được nối với tất cả
các bản ghi phù hợp từ R trong bucket đó. Sự mô tả đơn giản phép nối băm này giả
sử rằng tệp nhỏ hơn trong số hai tệp vừa khớp hoàn toàn trong các bucket bộ nhớ
(memory buckets) sau giai đoạn đầu tiên. Chúng ta sẽ tìm hiểu các biến thể của
phép nối băm mà không cần giả thiết này.
Trong thực tế, các kỹ thuật J1 đến J4 được thực hiện bằng cách truy cập toàn
bộ các khối trên đĩa của một tệp hơn là truy cập các bản ghi riêng biệt. Phụ thuộc
vào không gian bộ đệm khả dụng trong bộ nhớ, số khối đọc vào từ tệp có thể được
điều chỉnh.
16
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
Ảnh hưởng của không gian bộ đệm khả dụng và hệ số chọn nối khi thực
hiện phép nối (Effects of Available Buffer Space and Join Selection Factor on
Join Performance). Không gian bộ đệm khả dụng có ảnh hưởng quan trọng đối với
các thuật toán nối khác nhau. Trước tiên chúng ta hãy xét phương pháp nested-
loop (J1). Xem lại phép toán OP6 ở trên, giả sử rằng số bộ đệm khả dụng trong bộ
nhớ chính cho việc thực hiện nối là n
B
=7 blocks (các bộ đệm). Để minh họa, giả sử
rằng tệp DEPARTMENT gồm có r
D
= 50 bản ghi lưu trữ trong b
D
= 10 khối đĩa và
tệp EMPLOYEE gồm có r
E
= 6000 bản ghi lưu trữ trong b
E
= 2000 khối đĩa. Nó
thuận tiện để đọc nhiều khối từ tệp vào bộ nhớ tại một thời điểm từ tệp và các bản
ghi của tệp được sử dụng cho vòng lặp ngoài (tức là, n
B
- 2 khối). Sau đó thuật toán
có thể đọc một khối tại một thời điểm đối với tệp dùng làm vòng lặp trong và sử
dụng các bản ghi của nó để dò tìm (tìm kiếm) các khối vòng lặp ngoài trong bộ
nhớ để kết nối các bản ghi phù hợp. Điều này làm giảm tổng số truy cập khối. Cần
thêm một khối bộ đệm để chứa các bản ghi kết quả sau khi chúng được nối và nội
dung của khối bộ đệm này được bổ sung vào tệp kết quả (tệp trên đĩa chứa kết quả
phép nối) bất cứ khi nào nó (khối bộ đệm) bị đầy. Sau đó khối bộ đệm này được sử
dụng lại để lưu giữ thêm các bản ghi kết quả.
Trong phép nối vòng lặp lồng nhau (nested-loop join), có sự khác biệt khi chọn
tệp nào dùng làm vòng lặp ngoài và tệp nào dùng làm vòng lặp trong. Nếu
EMPLOYEE được dùng cho vòng lặp ngoài thì mỗi khối của EMPLOYEE được
đọc một lần và toàn bộ tệp DEPARTEMENT (mỗi khối) được đọc một lần vào
mỗi thời điểm chúng ta đọc (n
B
-2) khối tệp từ EMPLOYEE vào bộ nhớ đệm.
Chúng ta có như sau:
Tổng số khối truy cập đối với tệp ngoài = b
E
Số lần (n
B
-2) khối của tệp ngoài được nạp = b
E
/(n
B
-2)
Tổng số khối đã truy cập đối với tệp trong = b
D
*b
E
/(n
B
-2)
Vì vậy chúng ta có tổng số truy cập khối như sau:
b
E
+ (b
E
/(n
B
-2) * b
D
) = 2000 + ( 2000/5 *10) = 6000 truy cập khối
17
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
Mặt khác, nếu chúng ta sử dụng các bản ghi DEPARTMENT trong vòng lặp ngoài
thì tổng số truy cập khối là:
b
D
+ ( b
D
/(n
B
- 2) * b
E
) = 10 + ( 10/5 * 2000) = 4010 truy cập khối.
Thuật toán nối sử dụng một bộ đệm để lưu giữ các bản ghi đã nối kết của tệp kết
quả. Mỗi lần bộ đệm bị đầy thì nó được ghi vào đĩa và được sử dụng lại.
Nếu tệp kết quả của phép nối có b
RES
khối đĩa thì mỗi khối được ghi một lần,
vì vậy thêm b
RES
truy cập khối vào công thức có trước nhằm ước lượng tổng chi
phí của phép nối. Như ví dụ cho thấy nên sử dụng tệp có số khối ít hơn làm tệp
vòng lặp ngoài trong phép nối vòng lặp lồng nhau.
Một hệ số khác có ảnh hưởng đến việc thực hiện phép nối, đặc biệt là phương
pháp vòng lặp đơn (single-loop) J2, là tỉ lệ phần trăm các bản ghi trong tệp sẽ được
nối với các bản ghi trong tệp khác. Chúng ta gọi đây là hệ số chọn nối (the join
selection factor) của tệp với chú ý đến điều kiện nối bằng (equijoin) với tệp khác.
Hệ số này phụ thuộc vào điều kiện nối bằng riêng biệt giữa hai tệp. Để minh họa
điều này, xét toán OP7 nối mỗi bản ghi DEPARTMENT với bản ghi EMPLOYEE.
Ở đây, mỗi bản ghi DEPARTMENT (có 50 bản ghi như vậy trong ví dụ) muốn
được nối với một bản ghi EMPLOYEE đơn, nhưng nhiều bản ghi EMPLOYEE sẽ
không được nối.
Giả sử rằng các chỉ mục thứ cấp tồn tại trên cả hai thuộc tính Ssn của
EMPLOYEE và Mgr_ssn của DEPARTMENT, với số mức chỉ mục lần lượt là
x
Ssn
=4 và x
Mgr_ssn
=2. Chúng ta có hai tùy chọn đối với việc thực hiện phương pháp
J2. Đầu tiên truy lục mỗi bản ghi EMPLOYEE và sau đó sử dụng chỉ mục trên
Mgr_ssn của DEPARTMENT để tìm bản ghi DEPARTMENT phù hợp. Trong
trường hợp này, không tìm thấy bản ghi phù hợp đối với các EMPLOYEE không
quản lí một DEPARMENT nào. Số truy cập khối đối với trường hợp này là
khoảng chừng:
b
E
+ (r
E
* (x
Mgr_ssn
+1)) = 2000 + (6000*3) = 20,000 truy cập khối
Tùy chọn thứ hai truy lục mỗi bản ghi DEPARTMENT và sau đó sử dụng chỉ
mục trên Ssn của EMPLOYEE để tìm ra bản ghi EMPLOYEE phù hợp. Trong
18
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
trường hợp này, mọi bản ghi DEPARTMENT sẽ có một bản ghi EMPLOYEE phù
hợp. Số truy cập khối đối với trường hợp này là vào khoảng:
b
D
+ (r
D
* (x
Ssn
+1)) = 10 + (50*5) = 260 truy cập khối
Tùy chọn thứ 2 hiệu quả hơn vì hệ số chọn nối của DEPARTMENT với sự
chú ý đến điều kiện nối Ssn = Mgr_ssn là 1, ngược lại hệ số chọn nối của
EMPLOYEE với sự chú ý đến cùng điều kiện nối là (50/6000) hoặc 0.008. Với
phương pháp J2, hoặc tệp nhỏ hơn hoặc tệp có sự phù hợp đối với mọi bản ghi (tức
là, tệp có hệ số chọn nối cao) sẽ được sử dụng trong vòng lặp nối (ngoài). Cũng có
thể tạo một chỉ mục riêng đối với việc thực hiện phép nối nếu nó chưa tồn tại.
Phép nối sắp xếp-trộn (Sort-merge join) J3 khá hiệu quả nếu cả hai tệp được
sắp xếp bởi thuộc tính nối của chúng. Chỉ một lần thực hiện đơn qua mỗi tệp. Do
đó số khối truy cập bằng với tổng số khối trong cả hai tệp. Đối với phương pháp
này, cả hai OP6 và OP7 có thể cần b
E
+ b
D
= 2000 + 10 = 2010 truy cập khối. Tuy
nhiên, cả hai tệp phải được sắp thứ tự theo các thuộc tính nối; nếu một hoặc cả hai
tệp không sắp thứ tự thì chúng có thể được sắp xếp riêng đối với việc thực hiện
phép nối. Nếu chúng ta ước lượng chi phí sắp xếp một tệp ngoài bằng (b*log
2
b)
truy cập khối và nếu cả hai tệp cần được sắp xếp thì tổng chi phí một phép nối sắp
xếp-trộn có thể được ước lượng bằng (b
E
+ b
D
+ b
E*
log
2
b
E
+ b
D*
log
2
b
D
).
Phép nối băm phân chia và phép nối băm hỗn hợp (Partition Hash Join and
Hybrid Hash Join). Phương pháp nối băm J4 cũng khá hiệu quả. Trong trường hợp
này chỉ một lần thực hiện đơn qua mỗi tệp dù các tệp đó có được sắp xếp hay
không. Nếu bảng băm của tệp nhỏ hơn (trong hai tệp) có thể được lưu giữ hoàn
toàn trong bộ nhớ chính sau khi băm (phân chia) trên thuộc tính nối của nó thì việc
thực hiện là dễ dàng. Tuy nhiên, nếu các phần của tệp băm phải được lưu trữ trên
đĩa thì phương pháp trở nên phức tạp hơn và một số phương án nhằm cải tiến hiệu
quả đã được đề xuất. Chúng ta sẽ thảo luận hai kỹ thuật được xem là khá hiệu quả:
nối băm phân chia (Partition Hash Join) và nối băm hỗn hợp (Hybrid Hash Join).
Trong thuật toán nối băm phân chia, trước tiên mỗi tệp được phân chia thành
M phần bằng cách sử dụng một hàm băm phân chia trên các thuộc tính nối. Sau
19
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
đó, mỗi cặp phần (đã phân chia ở trên) được nối với nhau. Ví dụ, giả sử chúng ta
đang nối hai quan hệ R và S trên các thuộc tính nối R.A và S.B:
R
A=B
S
Trong giai đoạn phân chia, R được phân thành M phần R
1
, R
2
,…R
M
và S
thành M phần S
1
, S
2
,…S
M
. Tính chất (property) của mỗi cặp phân chia tương ứng
R
i
, S
i
là các bản ghi trong R
i
chỉ cần được nối với các bản ghi trong S
i
và ngược lại.
Tính chất này được bảo đảm bằng việc sử dụng cùng hàm băm để phân chia cả hai
tệp trên các thuộc tính nối của chúng. Số bộ nhớ đệm tối thiểu cần cho giai đoạn
phân chia là M+1. Mỗi tệp R và S được phân chia tách biệt nhau. Đối với mỗi
phần phân chia, một bộ nhớ đệm đơn (có kích thước là một khối đĩa) được cấp
phát để lưu trữ các bản ghi băm đến phân chia này. Bất cứ khi nào bộ nhớ đệm cho
một phân chia bị đầy thì dữ liệu chứa trong nó được bổ sung vào một tệp con trên
đĩa (disk subfile) lưu trữ phần phân chia này. Giai đoạn phân chia có hai lần lặp.
Sau lần lặp thứ nhất, tệp R được phân chia thành các tệp con R
1
, R
2
, …, R
M
, trong
đó các bản ghi băm đến cùng bộ nhớ đệm sẽ thuộc cùng phần phân chia. Sau lần
lặp thứ hai, tệp S được phân chia tương tự.
Trong giai đoạn thứ 2, gọi là giai đoạn dò tìm và nối , cần M lần lặp. Trong
suốt lần lặp thứ i, hai phần phân chia R
i
và S
i
được nối với nhau. Số bộ đệm tối
thiểu cần cho lần lặp thứ i bằng số khối của phần phân chia nhỏ hơn trong hai phần
phân chia R
i
và S
i
(giả sử là R
i
) cộng với hai bộ đệm thêm vào. Nếu chúng ta dùng
một phép nối vòng lặp lồng nhau trong suốt lần lặp thứ i thì các bản ghi của phần
phân chia nhỏ hơn (R
i
) được sao chép vào các bộ đệm của bộ nhớ; sau đó tất cả
các khối từ phần phân chia khác (S
i
) được đọc (một khối tại một thời điểm) và mỗi
bản ghi được dùng để dò tìm (tìm kiếm) phần phân chia R
i
nhằm kết nối
(matching) các bản ghi phù hợp. Bất kỳ các bản ghi nào phù hợp đều được nối và
ghi vào tệp kết quả. Để cải tiến hiệu quả việc dò tìm trong bộ nhớ, thường sử dụng
một bảng băm trong bộ nhớ để lưu trữ các bản ghi trong phần phân chia R
i
bằng
cách sử dụng một hàm băm khác với hàm băm phân chia.
Chúng ta có thể xấp xỉ chi phí của phép nối băm phân chia này bằng 3*(b
R
+b
S
)
+ b
RES
do mỗi bản ghi được đọc một lần và ghi lại vào đĩa một lần trong suốt giai
20
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
đoạn phân chia. Trong giai đoạn nối (dò tìm), mỗi bản ghi được đọc để thực hiện
phép nối. Khó khăn chính của thuật toán này là bảo đảm rằng hàm băm phân chia
là không thay đổi, nghĩa là các kích cỡ phần phân chia gần bằng nhau. Nếu hàm
phân chia bị lệch (thay đổi) thì một số phần phân chia có thể quá lớn để vừa với
không gian bộ nhớ khả dụng đối với giai đoạn nối thứ hai.
Lưu ý rằng, nếu không gian bộ nhớ đệm n
B
> (b
R
+2), trong đó b
R
là số khối của
tệp nhỏ hơn trong hai tệp đang được nối (giả sử là R) thì không có lí do gì để thực
hiện phân chia vì trong trường hợp này, phép nối có thể được thực hiện hoàn toàn
trong bộ nhớ bằng cách sử dụng một số biến thể của phép nối vòng lặp lồng nhau
(nested-loop) dựa trên băm và dò tìm. Để minh họa, giả sử chúng ta thực hiện phép
nối OP6:
OP6: EMPLOYEE
Dno=Dnumber
DEPARTMENT
Trong ví dụ này, tệp nhỏ hơn là tệp DEPARTMENT; Do đó, nếu số bộ đệm
trong bộ nhớ khả dụng có n
B
> (b
D
+2) thì toàn bộ tệp DEPARTMENT có thể được
đọc vào bộ nhớ chính và được tổ chức thành bảng băm trên thuộc tính nối. Sau đó
mỗi khối EMPLOYEE được đọc vào một bộ đệm và mỗi bản ghi EMPLOYEE
trong bộ đệm được băm trên thuộc tính nối của nó và được sử dụng để dò tìm
bucket trong bộ nhớ tương ứng trong bảng băm DEPARTMENT. Nếu một bản ghi
phù hợp được tìm thấy thì các bản ghi được nối với nhau và các bản ghi kết quả
được ghi vào bộ đệm kết quả và cuối cùng là ghi vào tệp kết quả trên đĩa. Vì vậy
chi phí tính theo số truy cập khối là (b
D
+ b
E
) cộng thêm b
RES
(chi phí của việc ghi
tệp kết quả).
Thuật toán nối băm hỗn hợp (hybrid hash-join algorithm) là một biến thể
của phép nối băm phân chia, trong đó giai đoạn nối đối với một trong số các phân
chia được bao gồm trong giai đoạn phân chia. Để minh họa, giả sử rằng kích thước
của bộ đệm là một khối đĩa; có n
B
bộ đệm khả dụng như vậy và hàm băm được sử
dụng là h(K) = K mod M sao cho M phần phân chia được tạo, trong đó M < n
B
.
Để minh họa, giả sử chúng ta đang thực hiện phép nối OP6. Trong lần thực hiện
đầu tiên của giai đoạn phân chia, khi thuật toán nối băm hỗn hợp đang phân chia
tệp nhỏ hơn trong hai tệp (DEPARTMENT trong OP6), thuật toán chia không gian
21
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
bộ đệm thành M phần sao cho tất cả các khối của phần phân chia đầu tiên của
DEPARTMENT hoàn toàn nằm trong bộ nhớ chính. Với mỗi phần phân chia khác,
chỉ một bộ đệm đơn trong bộ nhớ (có kích thước là một khối đĩa) được cấp phát;
phần còn lại của sự phân chia được ghi vào đĩa như phép nối băm phân chia thông
thường. Do đó, vào cuối của lần thực hiện đầu tiên của giai đoạn phân chia, phần
phân chia đầu tiên của DEPARTMENT nằm hoàn toàn trong bộ nhớ chính, trái lại
mỗi phần phân chia khác của DEPARTMENT nằm trong một tệp con của đĩa.
Đối với lần thực hiện thứ hai của giai đoạn phân chia, các bản ghi của tệp thứ
hai đang được nối (tệp lớn hơn, EMPLOYEE trong OP6) bị phân chia. Nếu một
bản ghi băm tới phần phân chia đầu tiên thì nó được nối với bảng ghi phù hợp
trong DEPARTMENT và các bản ghi đã nối được ghi vào bộ đệm kết quả (và cuối
cùng ghi vào đĩa). Nếu một bản ghi EMPLOYEE băm đến một phần phân chia
khác với phần đầu tiên thì nó được phân chia bình thường. Vì vậy, vào cuối lần
thực hiện thứ hai của giai đoạn phân chia, tất cả các bản ghi băm đến phần đầu tiên
đã được nối. Bây giờ có M-1 cặp phân chia trên đĩa. Vì vậy, trong suốt giai đoạn
nối hoặc dò tìm lần hai, cần M-1 lần lặp thay vì M lần. Mục đích là nối nhiều bản
ghi trong suốt giai đoạn phân chia nhằm tiết kiệm chi phí lưu trữ các bản ghi đó
vào lại đĩa và đọc chúng lần thứ hai trong giai đoạn nối.
4. Các giải thuật đối với phép chiếu (project) và các phép toán
trên tập hợp.
Phép chiếu
)(
_
R
listattribute ><
π
thực hiện dễ dàng nếu <attribute list> bao gồm khóa
của quan hệ R, bởi vì kết quả phép toán sẽ có cùng số bộ như R, nhưng với chỉ các
giá trị đối với các thuộc tính trong <attribute list> trong mỗi bộ. Nếu <attribute
list> không bao gồm cả khóa của R, các bộ giống nhau (sao lại) sẽ bị loại. Điều
này luôn được thực hiện bằng cách sắp xếp các phép toán và loại các bộ bản sao,
các bộ này sẽ xuất hiện liên tiếp sau khi sắp. Tóm tắt thuật toán được cho ở hình
15.3 (b). Băm cũng có thể được sử dụng để loại bỏ giống nhau: mỗi bản ghi được
băm và được chèn vào một bucket của file băm trong bộ nhớ, nó đã được kiểm tra
lại tại bucket. Nếu nó là bản sao thì nó không được chèn vào. Thật là cần thiết khi
nhắc lại điều đó ở đây trong câu truy vấn SQL, mặc định nó không loại bỏ các bản
22
Các thuật toán xử lý và tối ưu hoá truy vấn - Nhóm 4 Lớp KHMT 2010-2012
sao từ kết quả truy vấn; chỉ khi có từ khóa DISTINCT thì loại bỏ các bản sao trong
kết quả truy vấn.
Tập các phép toán – hợp, giao, trừ, và tích Đề-các – đôi khi chi phí quá cao để
thực hiện. Trong thực tế, phép tích Đề-các RxS là chi phí quá cao bởi vì kết quả
của nó bao gồm bản ghi đối với việc kết nối của các bản ghi của R và S. Thêm vào
đó các thuộc tính kết quả bao gồm tất cả các thuộc tính của R và S. Nếu R có n bản
ghi và j thuộc tính và S có m bản ghi và k thuộc tính, kết quả quan hệ sẽ có m*n
bản ghi và j+k thuộc tính. Vì vậy, thật quan trọng để tránh phép tích Đề-các, để
thay vào đó các phép toán tương đương trong quá trình tối ưu hóa truy vấn (xem 7)
Tập ba phép toán – hợp, giao và trừ – chỉ áp dụng để hợp-tương thích các quan
hệ mà có cùng số thuộc tính và có cùng miền thuộc tính. Cách thông thường để
thực hiện các phép toán này là sử dụng các biến của kỹ thuật sort-merge: hai quan
hệ được sắp xếp trên các cùng các thuộc tính và sau khi sắp xếp, một single duyệt
qua mỗi quan hệ là đủ để đưa ra kết quả. Ví dụ như chúng ta có thể thực hiện phép
hợp,
SR ∪
, bằng cách cũng một lúc duyệt và trộn 2 file đã sắp xếp, và chỉ khi bộ
giống nhau tồn tại trong hai quan hệ, chỉ một được giữ lại trong kết quả trộn. Đối
với phép giao,
SR ∩
, chúng ta chỉ giữ lại trong kết quả trộn các bộ có mặt trong
cả hai quan hệ. Hình 15.3 (c) đến (e) phác thảo sự thực hiện của 3 phép toán bằng
cách sắp xếp và trộn. Chi tiết không chứa trong 3 thuật toán này.
Băm có thể được sử dụng để thực hiện hợp giao và trừ. Một bảng được phân
chia và các phép toán khác được dùng để dò tìm phần chia thích hợp. Ví dụ như để
thực hiện
SR ∪
, đầu tiên băm (phân chia) các bản ghi của R, sau đó băm (do tìm)
các bản ghi của S, nhưng không chèn các bản sao bản ghi vào các bucket. Để thực
hiện
SR ∩
, đầu tiên chia các bản ghi của R thành file băm. Sau đó trong khi băm
mỗi bản ghi của S, tìm và kiểm tra khi bản ghi giống nhau từ R được tìm thấy
trong bucket, và khi thêm bản ghi vào file kết quả. Thực hiện R-S, đầu tiên băm
các bản ghi của R đến các bucket file băm. Trong khi băm (dò tìm) mỗi bản ghi
của S, khi một bản ghi giống nhau được tìm thấy trong bucket thì loại bỏ bản ghi
đó khỏi bucket.
23