Thuật toán SYSTEM R thực hiện tối ưu truy vấn tĩnh dựa trên việc tìm kiếm vét cạn không gian lời giải[15]. Dữ liệu vào cho bộ tối ưu của SYSTEM R là một cây đại số quan hệ kết quả của việc phân tách một truy vấn SQL. Dữ liệu ra là một hoạch định thực hiện thể hiện cây đại số quan hệ đã tối ưu. Hàm chi phí bao gồm chi phí vào/ra và chi phí CPU. Thuật toán tối ưu này bao gồm hai bước chính:
Dự đoán phương pháp tiếp cận tốt nhất tới mỗi quan hệ riêng rẽ bằng cách xem xét sử dụng chỉ số (index), đây là phương pháp với chi phí thấp nhất.
Đối với mỗi quan hệ R, thứ tự nối tốt nhất được ước lượng, trong đó R được truy cập đầu tiên bằng cách sử dụng phương pháp truy cập quan hệ đơn tốt nhất của nó.
Có hai chiến lược nối khác nhau là vòng lặp nồng nhau(nested loop join) và nối trộn(Sort-merge join).Đối với phép nối của hai quan hệ, quan hệ mà các bộ giá trị của nó được đọc đầu tiên được gọi là quan hệ ngoài, trong khi quan hệ mà các bộ giá trị của nó được tìm thấy phù hợp với các giá trị nhận được từ quan hệ ngoài, được gọi là quan hệ trong. Một quyết định quan trọng với mỗi phương pháp nối là xác định đường truy cập chi phí rẻ nhất đến quan hệ trong.
Thuật toán 3.2: Thuật toán SYSTEM R (Static-QOA)[15]
Đầu vào: QT: cây truy vấn với n quan hệ { query tree with n relations}
Đầu ra: out put: chiến lược tốt nhất
Bắt đầu:
formỗi quan hệri∈QT do
formỗi đường truy cập APij tớirido
xác địnhchi phí(APij)
best_APi←APijvới chi phí thấp nhất;
formỗi thứ tự (ri1, ri2, ..., rin) với i = 1, ..., n!do
xây dựng chiến lược(...((best APi1 ⊳⊲ri2) ⊳⊲ri3) ⊳⊲... ⊳⊲rin);
xác định chi phí của chiến lược
out put← chiếnvới chi phí thấp nhất
Kết thúc
Ví dụ 3.5. Xem xét truy vấn SQL trên các quan hệ của cơ sở dữ liệu AP SD là
Contact, Services và ServiceRecord:
“Lấy về tên những nhân viên tham gia cung cấpdịch vụ Chăm sóc sức khỏe người cao tuổi tại nhà”
Services⊳⊲ServiceIDServiceRecord⊳⊲ContactIDContact Đồ thị nối của truy vấn trên được biểu diễn như sau:
Hình 3.8 Đồ thị nối của truy vấn
Để ngắn gọn, nhãn ContactID trên cạnh Contact-ServiceRecord thay thế cho vị từ Contact.ContactID = ServiceRecord.ContactID và nhãn ServiceID trên
Service Record
Contact Services
cạnh ServiceRecord-Services thay thế cho vị từ ServiceRecord.ServiceID = Services.ServiceID. Chúng ta giả thiết các chỉ mục sau đây:
Contact có chỉ mục trên ContactID
ServiceRecord có chỉ mục trên ServiceID
Services có một chỉ mục trên ServiceID và một chỉ mục trên ServiceName. Bước 1: chọn các đường dẫn truy cập quan hệ đơn tốt nhất sau đây:
Contact: quét tuần tựcác bản ghi(bởi vì không có phép chọn trên Contact) ServiceRecord: quét tuần tự các bản ghi (bởi vì không có phép chọn trên ServiceRecord)
Services: tìm theo chỉ mục trên ServiceName (bởi vì có một phép chọn trên Services dựatrên ServiceName)
Bước 2: chọn thứ tự nối tốt nhất cho mỗi quan hệ
Hình 3.9 Lựa chọn thứ tự nối
Chiến lược Contact X Services và Services X Contact bị cắt bỏ (pruned) bởi vì đâylà những sản phẩm của tích Đề-các nên sẽ thay thế bởi các chiến lược khác. Contact ⊳⊲ServiceRecord và ServiceRecord⊳⊲ Services cũng bị cắt bỏ vì giả sử chúng chi phí cao hơn chiến lược tương tự là ServiceRecord ⊳⊲
Contact và Service⊳⊲ServiceRecord.
Hai khả năng còn lại được đưa ra ở cấp độ thứ ba của cây thứ tự nối là (ServiceRecord ⊳⊲ Contact) ⊳⊲ Services và (Servies ⊳⊲ ServiceRecord) ⊳⊲
Contact. Thứ tự nối có tổng tổng cộng tốt nhất là thứ tự có chi phí nhỏ hơn, như vậy (Servies ⊳⊲ ServiceRecord) ⊳⊲ Contact có chỉ mục sẽ có lợi trên thuộc tính chọn và truy cập trực tiếp đến các bộ giá trị nối của ServiceRecord và Contact vì vậy, nó được chọn với các phương pháp truy cập sau đây :
Chọn Servies bằng việc sử dụng chỉ mục trên ServieName
Sau đó nối với ServiceRecord bằng cách sử dụng chỉ mục trên ServiceID
Sau đó nối với Contact bằng cách sử dụng chỉ mục trên ContactID