Các thuậ t toán xử lý và tối ưu hoá truy vấn ĐẠ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
Trang 1ĐẠ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
TS Hoàng Quang Trần Như Đăng Tuyên
Trang 2TS 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
Trang 3A 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 trongngô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áctê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ấnbằ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ộtDBMS 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 Đặctrư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ôngbá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ợpviệ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ượchiệ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 ưuthườ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ể đòihỏ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ôngtin có thể không có sẵn đầy đủ trong danh mục DBMS Vì vậy việc lập sơ đồ thựchiệ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
Trang 4Tiể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ộtRDBMS Một hệ quản trị cơ sở dữ liệu quan hệ phải định giá các chiến lược thựchiệ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ặcchiế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éptoá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
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
Trang 5việc thi hành các phép toán quan hệ Sau đó, giới thiệu tổng quan về các chiếnlượ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 ápdụ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ántrong 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ốngchi 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ó ướclượ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 ưuhó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 ưuhó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ácrà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ả
Trang 6B 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ảntrị 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 truyvấ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 WHERE, cũng như các mệnh đề GROUP BY và HAVING nếu chúng là bộ phậncủ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ấnriê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
SELECT-FROM-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)
Trang 7Trong đó C biểu diễn kết quả trả về từ khối trong Khối trong có thể đượcchuyể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 talư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ả truyvấ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ảithuậ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épPROJECT (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éptruy 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ủacá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 đầubằ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ệcsắ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.
Trang 8Hình 2 Tổng quan thuật toán sắp trộn đối với sắp xếp ngoài
j ←b; {kích thước của file trong các khối}
k ←nB; {kích thước của vùng đệm trong các khối }
Trang 9Trong 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à ghilạ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 (nR) được cho bởi số khối file (b) và vùng nhớ có sẵn (nB) Ví dụ, nếu
nB= 5 khối và kích thước của file b=1024 khối thì nR= [(b/nB)] 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ầnthực hiện (pass) Bậc trộn dM là số các runs có thể được trộn trong mỗi lần thựchiệ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, dM là giá trịnhỏ hơn trong hai giá trị (nB -1) và nR, và số lần thực hiện trộn là logdM(n R)).Trong ví dụ trên, dM=4 do đó 205 runs đã sắp ban đầu sẽ được trộn thành 52 tạicuố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 dM cho trường hợp tốt nhất của thuật toán, đó là:(2*b) + (2*(b*log2b)))
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 đượctruy 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àylên đĩa sau khi sắp xếp
(2*(b*log2b))) biểu diễn số truy xuất khối trong giai đoạn trộn, giả sử trườnghợp xấu nhất dM =2
Tổng quát, log được tính dựa trên dM và biểu thức đối với số khối truy cập trởthành: (2*b)+(2*(b*(logdMnR)))
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ềukiệ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 trongphầ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ệ
Trang 10OP1: σ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ệtfile, 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ỏamã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ả
Trang 11hơ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ớifile 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 trongOP2 – 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) Đốivớ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ộtkhó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 ướclượ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ậpkhố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ênthuộ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ấntheo vùng (range query)
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ựchiện phép toán:
Trang 12S7-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 truycậ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ềukiệ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ấutrú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ênkhó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ơnmộ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ếucá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áchtrự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 đã truylụ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ạihay 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ặcOP3) thì chúng ta có thể chỉ cần kiểm tra xem có hay không một đường dẫn truycậ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 truycậ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áilạ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ệuquả 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
Trang 13Khi 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ềukiệ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ộctí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ữacá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ệnbằ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ùngcá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 tabuộ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 truycậ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áchtruy 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íchhợ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ử
Trang 14dụ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ácphé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ầnnà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 compatible) của R và S Các phương pháp thảo luận ở đây có thể được mở rộngthà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ếnnhất để thực hiện một phép nối, sử dụng các phép nối sau:
(domain-OP6: EMPLOYEE Dno=DnumberDEPARTMENT
OP7: DEPARTMENT Mgr_Ssn=SsnEMPLOYEE
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 traxem 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 đốivớ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 ttrong 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 ghiphù 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
Trang 15hiệ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ờitheo 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ộctí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ắpbằ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ặpkhố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ácthuộ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ảnghi 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ệuquả 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 i1, j1;
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
Trang 16} (*đư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 TT’ 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 }
Trang 17{ đưa S(j) vào T
Set j j+ 1
}
Elseif R(i) < S(j) then
{ đưa R(i) vào T;
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 i1, j1;
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
{ if R(i) > S(j) then set j j+1
Elseif R(i) < S(j) then
Trang 18{ đưa R(j) vào T; (*R(i) không phù hợp với S(j), vì vậy đưa
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 T ←R∩S
(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ó ítbả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ânchia do đó các bản ghi của R được phân chia vào các bucket băm Trong giai đoạnthứ 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ămmỗ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ộcvà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
Trang 19Ả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ớicá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à nB=7 blocks (các bộ đệm) Để minh họa, giả sửrằng tệp DEPARTMENT gồm có rD = 50 bản ghi lưu trữ trong bD = 10 khối đĩa vàtệp EMPLOYEE gồm có rE = 6000 bản ghi lưu trữ trong bE = 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ảnghi của tệp được sử dụng cho vòng lặp ngoài (tức là, nB - 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ầnthê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ộidung 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ọntệ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ếuEMPLOYEE đượ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àomỗi thời điểm chúng ta đọc (nB-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 = bE
Số lần (nB-2) khối của tệp ngoài được nạp = bE/(nB-2)
Tổng số khối đã truy cập đối với tệp trong = bD*bE/(nB-2)
Vì vậy chúng ta có tổng số truy cập khối như sau:
bE + (bE/(nB-2) * bD) = 2000 + ( 2000/5 *10) = 6000 truy cập khối
Trang 20Mặt khác, nếu chúng ta sử dụng các bản ghi DEPARTMENT trong vòng lặp ngoàithì tổng số truy cập khối là:
bD + ( bD/(nB - 2) * bE) = 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ếtquả 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ó bRES khối đĩa thì mỗi khối được ghi một lần,
vì vậy thêm bRES truy cập khối vào công thức có trước nhằm ước lượng tổng chiphí 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ệpvò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ươngphá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ủaEMPLOYEE và Mgr_ssn của DEPARTMENT, với số mức chỉ mục lần lượt là
xSsn=4 và xMgr_ssn=2 Chúng ta có hai tùy chọn đối với việc thực hiện phương phápJ2 Đầu tiên truy lục mỗi bản ghi EMPLOYEE và sau đó sử dụng chỉ mục trênMgr_ssn của DEPARTMENT để tìm bản ghi DEPARTMENT phù hợp Trongtrường hợp này, không tìm thấy bản ghi phù hợp đối với các EMPLOYEE khôngquả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:
bE + (rE * (xMgr_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
Trang 21trườ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:
bD + (rD * (xSsn +1)) = 10 + (50*5) = 260 truy cập khốiTù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ủaEMPLOYEE với sự chú ý đến cùng điều kiện nối là (50/6000) hoặc 0.008 Vớiphươ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 đượcsắ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ápnày, cả hai OP6 và OP7 có thể cần bE + bD = 2000 + 10 = 2010 truy cập khối Tuynhiê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ả haitệ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ệnphé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*log2b)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ắpxếp-trộn có thể được ước lượng bằng (bE + bD + bE*log2bE + bD*log2bD)
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ợpnà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 haykhô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àntoà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ệcthự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ệuquả đã đượ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
Trang 22đó, 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:
đó 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ầnlặ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 Trongsuốt lần lặp thứ i, hai phần phân chia Ri và Si được nối với nhau Số bộ đệm tốithiể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ầnphân chia Ri và Si (giả sử là Ri) cộng với hai bộ đệm thêm vào Nếu chúng ta dùngmộ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ầnphân chia nhỏ hơn (Ri) đượ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 (Si) được đọc (một khối tại một thời điểm) và mỗibản ghi được dùng để dò tìm (tìm kiếm) phần phân chia Ri 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ụngmột bảng băm trong bộ nhớ để lưu trữ các bản ghi trong phần phân chia Ri bằngcá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*(bR+bS)+ bRES 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
Trang 23đoạn phân chia Trong giai đoạn nối (dò tìm), mỗi bản ghi được đọc để thực hiệnphé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àmphân chia bị lệch (thay đổi) thì một số phần phân chia có thể quá lớn để vừa vớikhô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 nB > (bR+2), trong đó bR là số khối củatệp nhỏ hơn trong hai tệp đang được nối (giả sử là R) thì không có lí do gì để thựchiệ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épnối OP6:
OP6: EMPLOYEE Dno=DnumberDEPARTMENT
Trong ví dụ này, tệp nhỏ hơn là tệp DEPARTMENT; Do đó, nếu số bộ đệmtrong bộ nhớ khả dụng có nB > (bD+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 EMPLOYEEtrong bộ đệm được băm trên thuộc tính nối của nó và được sử dụng để dò tìmbucket trong bộ nhớ tương ứng trong bảng băm DEPARTMENT Nếu một bản ghiphù 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ậychi phí tính theo số truy cập khối là (bD + bE) cộng thêm bRES (chi phí của việc ghitệ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ânchia được bao gồm trong giai đoạn phân chia Để minh họa, giả sử rằng kích thướccủa bộ đệm là một khối đĩa; có nB 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 < nB
Để 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 chiatệp nhỏ hơn trong hai tệp (DEPARTMENT trong OP6), thuật toán chia không gian
Trang 24bộ đệ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ủaDEPARTMENT 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ôngthườ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ầnphân chia đầu tiên của DEPARTMENT nằm hoàn toàn trong bộ nhớ chính, trái lạimỗ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ộtbả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ợptrong DEPARTMENT và các bản ghi đã nối được ghi vào bộ đệm kết quả (và cuốicùng ghi vào đĩa) Nếu một bản ghi EMPLOYEE băm đến một phần phân chiakhá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ầnthự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ạnnố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ảnghi 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 π<attribute_list>(R)thực hiện dễ dàng nếu <attribute list> bao gồm khóacủ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ácgiá trị đối với các thuộc tính trong <attribute list> trong mỗi bộ Nếu <attributelist> 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ềunà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ình15.3 (b) Băm cũng có thể được sử dụng để loại bỏ giống nhau: mỗi bản ghi đượcbăm và được chèn vào một bucket của file băm trong bộ nhớ, nó đã được kiểm tralạ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 khinhắ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
Trang 25sao từ kết quả truy vấn; chỉ khi có từ khóa DISTINCT thì loại bỏ các bản sao trongkế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ảnghi 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*nbả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ệtqua mỗi quan hệ là đủ để đưa ra kết quả Ví dụ như chúng ta có thể thực hiện phéphợp, R∪S , 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 Đốivới phép giao, R∩S, 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ằngcá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ânchia 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 R∪S, đầ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ựchiện R∩S, đầu tiên chia các bản ghi của R thành file băm Sau đó trong khi bămmỗ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ấytrong bucket, và khi thêm bản ghi vào file kết quả Thực hiện R-S, đầu tiên bămcá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 ghicủ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
Trang 265 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.
5.1 Sự thực hiện của các phép toán kết hợp
Các phép kết hợp (MIN, MAX, COUNT, AVERAGE, SUM), khi đã áp dụngcho toàn bộ bảng, có thể được tính bằng cách duyệt qua bảng hoặc sử dụng mộtbảng chỉ mục thích hợp nếu sẵn có Ví dụ, xét truy vấn SQL sau:
SELECT MAX(Salary)
FROM EMPLOYEE;
Nếu một chỉ mục (tăng dần) trên Salary tồn tại đối với quan hệ EMPLOYEE,thì cách tối ưu là có thể quyết định sử dụng chỉ mục để tìm kiếm giá trị lớn nhấtbằng cách theo sau con trỏ bên phải nhất trong mỗi nút chỉ mục từ nút gốc đến nút
lá bên phải nhất Nút đó sẽ bao gồm giá trị Salary lớn nhất là mục ghi vào sau cùngcủa nó Trong hầu hết các trường hợp, điều này sẽ hiệu quả hơn việc duyệt quatoàn bộ bảng của quan hệ EMPLOYEE Phép MIN có thể được điều khiển mộtcách tương tự, ngoại trừ việc sử dụng con trỏ bên trái nhất được theo sau từ nútgốc đến nút lá bên trái nhất Nút đó sẽ bao gồm giá trị Salary nhỏ nhất chính làmục ghi vào đầu tiên
Chỉ mục có thể cũng được sử dụng đối với các phép COUNT, AVERAGE,SUM, nhưng chỉ nếu đó là một chỉ mục dày đặc (dense index), nghĩa là có một chỉmục đối với mọi bản ghi trong file chính Trong trường hợp này, việc tính toán kếthợp sẽ được áp dụng đến các giá trị trong file chỉ mục Đối với chỉ mục không dàyđặc (nondense index), số các bản ghi thực tế kết hợp với mỗi chỉ mục vào phảiđược sử dụng đối với một quá trình tính toán đúng (ngoại từ COUNT DISTINCT,
ở đây số các giá trị phân biệt có thể được đếm từ chỉ mục của chính nó)
Khi một mệnh đề GROUP BY được sử dụng trong một truy vấn, phép kết hợpphải được áp dụng đến mỗi nhóm một cách tách rời nhau Vì vậy, đầu tiên bảngphải được phân chia thành các tập con gồm một số bộ, ở đây mỗi phần (nhóm) cógiá trị giống nhau đối với các thuộc tính nhóm Trong trường hợp này, quá trìnhtính toán là phức tạp hơn Xét truy vấn sau:
SELECT Dno, AVG(Salary)
Trang 27R hợp với các bộ trong S và ngược lại Vì vậy, các bộ không hợp (không có quanhệ) với các bộ khác được loại bỏ trong kết quả phép nối, ngay cả các bộ với cácgiá trị NULL ở các thuộc tính nối cũng bị loại bỏ Việc này có thể làm mất thôngtin, nếu kết quả của phép nối được sử dụng để tạo ra một báo cáo dựa vào tất cảcác thông tin trong các quan hệ thành phần.
Một tập các phép được gọi là các phép nối ngoài, có thể được sử dụng khichúng ta muốn giữ lại tất cả các bộ trong R hoặc tất cả các bộ trong S, hoặc tất cảcác bộ trong cả hai quan hệ trong kết quả của phép nối, bất chấp chúng hợp haykhông hợp với các bộ trong quan hệ khác Điều này thỏa mãn sự cần thiết của cáctruy vấn trong đó các bộ từ hai bảng được kết hợp bằng cách hợp các dòng tươngứng, nhưng không bị mất bất cứ bộ nào do thiếu các giá trị kết hợp Phép nối thôngthường gọi là phép nối trong (inner joins)
Trang 28Ví dụ: Cho hai quan hệ như sau:
ta có thể áp dụng một phép nối ngoài phía bên trái (left outer join), được kí hiệu là , để nhận kết quả như sau:
TEMP ← (EMPLOYEE Ssn = Mgr_ssn DEPARTMENT)
RESULT ← πFname,Minit,Lname,Dname(TEMP)
Phép nối ngoài phía bên trái giữ lại mọi bộ của quan hệ phía bên trái (quan hệR) trong R S; nếu không tìm thấy bộ nào phù hợp ở trong S thì các thuộc tínhcủa S trong kết quả nối được điền vào với các giá trị NULL Kết quả của phép nốinày được chỉ ra trong bảng sau:
RESULT
Trang 29John B Smith NULL
n
NULL
Một phép tương tự, phép nối ngoài phía bên phải (Right outer join), được kíhiệu là , giữ lại mọi bộ của quan hệ phía bên phải (quan hệ S) ở kết quả R
S Một phép thứ ba đó là phép nối ngoài đầy đủ ( Full outer join), kí hiệu là ,giữ lại tất cả các bộ ở cả hai quan hệ, khi không tìm thấy bộ nào hợp được vớinhau, thêm vào quan hệ kết quả các giá trị NULL cần thiết
5.2.2 Sự thực hiện của phép nối ngoài
Các phép nối ngoài có ba dạng: nối ngoài phía bên trái, nối ngoài phía bên phải
và nối ngoài đầy đủ Chúng ta cũng đã biết cách mà các phép này có thể được cụthể hoá trong SQL Sau đây là một ví dụ về phép nối ngoài phía bên trái trongSQL:
SELECT Lname, Fname, Dname
FROM (EMPLOYEE LEFT OUTER JOIN DEPARTMENT ONDno=Dnumber);
Kết quả của truy vấn này là tên của các công nhân và DEPARTMENT tươngứng của họ Điều đó tương tự như kết quả của một phép nối (bên trong) thôngthường, không tính đến nếu một bộ EMPLOYEE (một bộ trong quan hệ bên trái)không có một DEPARTMENT tương ứng, tên của công nhân vẫn sẽ xuất hiệntrong bảng kết quả, nhưng tên của department sẽ là NULL đối với các bộ như vậytrong kết quả truy vấn
Như một sự lựa chọn, phép nối bên ngoài có thể được tính bằng cách thực hiệnmột sự kết hợp của các phép đại số quan hệ Ví dụ như, phép nối ngoài phía bêntrái đã chỉ ra ở trên là tương đương với dãy các phép quan hệ sau đây:
Trang 301 Tính phép nối bên trong của các bảng EMPLOYEE và DEPARTMENT.TEMP1 ← πLname,Fname,Dname(EMPLOYEE Dno=DnumberDEPARTMENT)
2 Tìm các bộ EMPLOYEE mà không xuất hiện trong kết quả phép nối (bêntrong)
TEMP2← πLname, Fname(EMPLOYEE) - πLname, Fname(TEMP1)
3 Thêm mỗi bộ trong TEMP2 với một trường Dname là NULL
4 Áp dụng phép hợp đến TEMP1 và TEMP2 để tạo ra kết quả phép nối ngoàibên trái
RESULT ← TEMP1 ∪ TEMP2
Chi phí của phép nối ngoài được tính ở trên sẽ là tổng của các chi phí kết hợpcủa các bước (phép nối bên trong, các phép chiếu, phép hiệu và phép hợp) Tuynhiên, chú ý rằng bước 3 có thể được thực hiện như quan hệ tạm thời đã được xâydựng ở bước 2; đó là chúng ta có thể thêm mỗi bộ kết quả với giá trị NULL mộtcách dễ dàng Thêm vào đó, ở bước 4, chúng ta biết rằng hai toán hạng của phéphợp là tách rời nhau (không có bộ chung), vì vậy không cần loại bỏ các bộ trùngnhau
6 Sự kết hợp các phép toán bằng kỹ thuật đường ống
Một truy vấn đã chỉ rõ trong SQL sẽ được chuyển thành một biểu thức đại sốquan hệ đó là một dãy các phép quan hệ Nếu chúng ta thực hiện một phép đơn tạimột thời điểm, chúng ta phải tạo ra các file tạm trên đĩa để lưu các kết quả của cácphép tạm thời này Việc tạo ra và lưu trữ các file tạm lớn trên đĩa là tốn nhiều thờigian và có thể không cần thiết trong nhiều trường hợp, vì các file này lập tức sẽđược sử dụng làm đầu vào cho phép toán tiếp theo Để giảm số file tạm, chúng tathường tạo ra mã thực hiện truy vấn tương ứng với các thuật toán kết hợp các phéptrong một truy vấn
Ví dụ, thay vì thực hiện một cách rời rạc, một phép nối có thể kết hợp với haiphép chọn trên một file đầu vào và một phép chiếu cuối cùng trên file kết quả; tất
cả điều này được thực hiện bằng một thuật toán với hai file đầu vào và một file đầu
ra, còn hơn việc tạo ra bốn file tạm rồi chúng ta áp dụng thuật toán một cách trực
Trang 31tiếp và chỉ cho ra một file kết quả Trong phần 7.2 chúng ta sẽ thảo luận cách tối
ưu hóa đại số quan hệ bằng heuristic có thể nhóm các phép cùng với sự thực hiện.Cách này được gọi là kĩ thuật đường ống hay xử lí dựa vào luồng
Chúng ta thường tạo ra mã thực hiện truy vấn một cách linh động để thựchiện nhiều phép Mã sinh ra đối với việc tạo ra truy vấn kết hợp nhiều thuật toántương ứng với các phép riêng biệt Kết quả là các bộ được tạo ra từ một phép toánchính là đầu vào cho các phép tiếp theo Ví dụ như nếu một phép nối theo sau haiphép chọn trên các quan hệ cơ sở thì các bộ kết quả từ mỗi phép chọn chính là đầuvào của phép nối
7 Tối ưu hóa câu truy vấn bằng heuristic
Trong phần này chúng ta thảo luận các kĩ thuật tối ưu hóa áp dụng các qui tắcheuristic để thay đổi sự thể hiện bên trong của một truy vấn – thường sử dụng hìnhthức một cây truy vấn hoặc một cấu trúc dữ liệu đồ thị truy vấn – nhằm để cải tiến
sự thực hiện của nó Sự phân tích từ một truy vấn mức cao đầu tiên tạo ra một sựthể hiện bên trong ban đầu của nó, sau đó được tối ưu theo các qui tắc heuristic.Tiếp theo là một cây thực hiện truy vấn được tạo ra để thực hiện nhóm các phéptoán dựa vào các đường dẫn truy cập sẵn có trên các file cần truy vấn
Một trong những qui tắc heuristic chính là áp dụng các phép chọn và chiếutrước khi áp dụng phép nối hoặc các phép toán hai ngôi khác, bởi vì kích thướccủa file kết quả từ một phép toán hai ngôi như phép nối thường gấp nhiều lần sovới kích thước của các file đầu vào Các phép chọn và chiếu làm giảm kích thướccủa một file và vì vậy nên được áp dụng trước một phép nối hay phép toán haingôi khác
Trong phần 7.1, chúng ta sẽ giới thiệu các khái niệm cây truy vấn và đồ thị truyvấn Các khái niệm này làm nền tảng đối với các cấu trúc dữ liệu được sử dụng đốivới sự thể hiện bên trong của các truy vấn Một cây truy vấn được sử dụng để trìnhbày một biểu thức đại số quan hệ hoặc biểu thức đại số quan hệ mở rộng, ngược lạimột đồ thị truy vấn được sử dụng để trình bày một biểu thức tính toán quan hệ.Trong phần 7.2 chúng ta chỉ ra cách sử dụng các quy tắc tối ưu hóa heuristic đểchuyển một cây truy vấn thành một cây truy vấn tương đương, cây này trình bày