CHƯƠNG 6. TỐI ƯU HÓA TRUY VẤN
6.3. C ÁC BIỂU THỨC TƯƠNG ĐƯƠNG
6.3.3. Ví dụ về thuật toán tối ưu hoá biểu thức quan hệ
Tới đây có thể áp dụng các quy tắc nêu trong mục 6.2 để có thể tối ưu hóa các biểu thức quan hệ. Biểu thức “tối ưu” kết quả phải tuân theo các nguyên tắc đã nêu ở phần 6.1 mặc dù các nguyên tắc đó không bảo đảm để tối ưu cho mọi trường hợp tương đương.
Lưu ý:
• luôn luôn đẩy phép chọn và phép chiếu xuống mức càng sâu càng tốt trong cây biểu diễn biểu thức quan hệ nhằm tạo nên một dãy các phép chọn cũng
179
như phép chiếu để từ đó có thể tổ chức thành một phép chọn theo sau một phép chiếu.
• Nhóm các phép chọn và phép chiếu lại trong một nhóm để thực hiện trước các phép tính hai ngôi như phép hợp, tích Descartes, hiệu tập hợp,...
Có một số trường hợp đặc biệt xảy ra khi một phép tính hai ngôi có các hạng thức chứa phép chọn và/hoặc phép chiếu được áp dụng đối với lá của cây biểu diễn biểu thức. Khi đó, cần xem xét cẩn thận tác động của phép tính hai ngôi vì một số trường hợp cần phải liên kết phép chọn hoặc phép chiếu với phép hai ngôi đó.
Kết quả đầu ra (Output) của thuật toán là một chương trình bao gồm các bước như sau:
a. Áp dụng của một phép chọn hoặc một phép chiếu đơn giản.
b. Áp dụng của một phép chọn và một phép chiếu hoặc
c. Áp dụng của một tích Descartes, phép hợp hoặc phép hiệu tập hợp cho hai hạng thức mà trước đó các phép chọn hoặc các phép chiếu đã được áp dụng cho một hoặc cả hai hạng thức.
Ví dụ 6.1. Xét CSDL gồm các quan hệ sau đây:
SINH_VIEN (MaSV, HoTenSV, NamSinh, GioiTinh, QueQuan, MaLop) LOP (MaLop, TenLop, MaKhoa)
KHOA (MaKhoa, TenKhoa, ĐC, SĐT)
HOC_PHAN (MaHP, TenHP, SoTC, HocKy, MoTa) KET_QUA (MaSV, MaHP, DiemThi, LanThi)
Câu hỏi: Cho danh sách những sinh viên đạt điểm thi - DiemThi > 9.
Biểu thức quan hệ được viết như sau:
(KQ-SV: (DiemThi>9)) [ HoTenSV]
Hình cây của biểu thức trên được biểu diễn bằng hình 6.1. Xin lưu ý là, các phép toán nằm ở phiá dưới là các phép toán được thược hiện trước các phép toán ở phiá trên của cây.
180
Hình 6.1. Biểu diễn cây của biểu thức hỏi
Thay thế các giá trị f và S vào biểu thức hỏi có được cây biểu diễn của biểu thức quan hệ như trong hình 6.1
Bước thứ nhất của tối ưu là tách phép chọn f thành hai phép chọn với điều kiện:
KETQUA.MaHP = HOC_PHAN.MaHP
và KET_QUA.MaSV=SINH_VIEN.MaSV
Bây giờ ta có 3 phép chọn. Cần “đẩy” chúng xuống mức thấp hơn chừng nào còn có thể được.
Phép chọn với điều kiện DiemThi>9được đẩy xuống dưới phép chiếu và hai phép chọn kia bằng cách áp dụng các quy tắc (hoặc luật) số 4 và qui tắc 5. Phép chọn đầu được áp dụng cho tích Descartes ((KET_QUA x HOC_PHAN x SINH_VIEN). Vì thuộc tính DiemThi trong phép chọn chỉ có ở quan hệ KET_QUA nên có thể thay thế:
((KET_QUA x HOC_PHAN) x SINH_VIEN) : (DiemThi>9) bằng biểu thức:
((KET_QUA x HOC_PHAN) : (DiemThi>9)) x SINH_VIEN) và tiếp tục đẩy xuống nữa, cuối cùng ta được biểu thức:
(((KET_QUA: (DiemThi>9)) x HOC_PHAN) x SINH_VIEN)
Như vậy, đã đẩy được phép chọn theo DiemSo này xuống sâu nhất có thể.
x
[HoTenSV] //Chiêú lấy cột họ tên sinh viên
: (DiemThi>9) //Chọn những điểm >9
[HoTenSV, NamSinh, QueQuan, SINH_VIEN.MaSV, KET_QUA.MaHP, TenHocPhan, DiemThi]
: ((HOC_PHAN.MaHP=KET_QUA.MaHP)
(SINH_VIEN.MaSV= KET_QUA. MaSV))
SINH_VIEN
HOC_PHAN KET_QUA
x
181
Bây giờ tiếp tục đẩy phép chọn với điều kiện SINH_VIEN.MaSV=
KET_QUA.MaSV xuống mức thấp nhất (nếu có thể). Không thể đẩy phép chọn này xuống dưới tích Descartes vì nó liên quan tới một thuộc tính của quan hệ SINH_VIEN và một thuộc tính thuộc quan hệ KET_QUA. Do vậy phép chọn: :KET_QUA.MaHP=
HOC_PHAN.MaHP
MaDeTai có thể đẩy xuống để áp dụng cho tích Descartes:
(KET_QUAxHOC_PHAN) : ( : (DiemThi>9)
Chú ý: KET_QUA.MaHP là tên một thuộc tính của phép chọn:
KET_QUA : (DiemThi>9)
Bước tiếp theo: Tổ hợp hai phép chiếu thành một phép chiếu là [HoTenSV]
nhờ qui tắc số 3. Kết quả được cho như trong hình 6.2. Sau đó áp dụng quy tắc mở rộng số 5 thay thế:
:(KET_QUA.MaHP = HOC_PHAN.MaHP) và chiếu [HoTenSV]
nhờ dãy phép toán:
[HoTenSV, HOC_PHAN.MaHP, KET_QUA.MaHP] (1) :(SINH_VIEN.MaSV=KET_QUA.MaSV) (2)
rồi chiếu để lấy tên đề tài: [HoTenSV] (3)
Áp dụng quy tắc số 9 để thay thế biểu thức đầu tiên, biểu thức số (1), của phép chiếu nhờ phép chiếu: [HoTenSV, HOC_PHAN.MaHP]
Để áp dụng cho quan hệ HOC_PHAN và [KET_QUA.MaHP] áp dụng cho hạng thức phía trái của tích Descartes trong hình 6.2.
Hình 6.2 Cây với tổ hợp phép chọn và phép chiếu [HoTenSV]
: (SINH_VIEN.MaSV=KET_QUA.MaSV)
:(HOC_PHAN.MaHP=KET_QUA.MaHP) SINH_VIEN
HOC_PHAN : (DiemThi>9)
KET_QUA
x
x
182 Phần còn lại là phép chiếu để lấy 4 thuộc tính:
[ HoTenSV, NamSinh, QueQuan, HOC_PHAN.MaHP, DiemThi]
Các thuộc tính không phù hợp sẽ bị loại bỏ. Biểu diễn cây cuối cùng của biểu thức như trong hình 6.3.
Nhóm các phép tính bằng đường mũi tên. Mỗi tích Descartes được tổ hợp với phép chọn để tạo thành một phép kết nối bằng nhau (Equi Join) rất có hiệu quả. Thứ tự thực hiện của cây biểu thức trong các hình 6.3, 6.2 là từ dưới lên: Nhóm các phép toán nằm ở phía dưới được thực hiện trước các phép toán ở phía trên.
Hình 6.3 Cây kết quả biểu diễn việc phân nhóm các biểu thức.