3. Tối ưu hóa các truy vấn phân tán
4.2 Thuật toán System R*
Thuật toán System R* dành cho CSDLPT là đại diện cho các thuật toán sử dụng hướng tiếp cận tĩnh (static approach), trong CSDLPT thuật toán này còn có tên gọi khác là R*-QOA. Thuật toán này sử dụng cách tìm kiếm toàn bộ (exhautive search) trên tất cả các chiến lược thực thi của một câu truy vấn ở mức cao để tìm ra các chiến lược thực thi có chi phí tốt nhất. Chiến lược tìm kiếm toàn bộ có chi phí thời gian rất lớn, tuy nhiên chi phí này có thể được dàn đều nếu một câu truy vấn được lặp lại với tần suất đủ lớn. Trong trường hợp này, một chiến lược tối ưu sau khi được xác định sẽ
51
được lưu trữ và với nhưng lần truy vấn tương tự tiếp theo chiến lược tối ưu sẽ được thực hiện mà không cần tìm kiếm lại.
Thuật toán R*-QOA được đặc tả bằng giả ngôn ngữ như sau. Thuật toán: R* - QOA
Input: QT: Câu truy vấn
Output: strat: Chiến lược chi phí tối thiểu
BEGIN
For mỗi quan hệ Ri QT do
Begin
For mỗi đường truy nhập APij to Ri do
Xác đinh cost(APij)
Endfor
Best_APi APijvới chi phí tối thiểu; Endfor
For mỗi thứ tự (Ri1,Ri2,...,Rin) với i = 1,2,...,n! do
Begin
Xây dựng chiến lược (...(best APi1Ri2)Ri3) ... Rin); Tính toán chi phí chiến lược;
Endfor
strat chiến lược với chi phí tối thiểu;
For mỗi trạm k chứa một quan hệ liên quan trong QT do
Begin
LSkchiến lược cục bộ (strategy, k);
Send(LSk,site k) {mỗi chiến lược cục bộ được tối ưu hoá tại trạm k} Endfor
END. {R* - QOA}
Trong thuật toán này, bộ tối ưu hoá phải chọn thứ tự kết nối, đường truy cập vào mỗi mảnh thẳng (chẳng hạn chỉ mục nhóm, quét tuần tự,...). Các quyết định này dựa trên các thống kê về CSDL trên các máy trạm và thông tin đường truyền truy nhập. Thêm vào đó, bộ tối ưu cũng phải lựa chọn các trạm để thực hiện phép toán kết nối và phương thức truyền dữ liệu giữa các trạm với nhau. Ví dụ, để kết nối hai quan hệ trên hai trạm, có 3 trạm ứng cử viên: trạm chứa quan hệ thứ nhất, trạm chứa quan hệ thứ 2 hoặc một trạm độc lập khác (hoặc trạm thứ 3 chưa một quan hệ có thể kết nối tiếp vào
52
hai quan hệ kể trên). Có hai phương pháp hỗ trợ truyền thông giữa các trạm trong mạng:
1) Ship-Whole: trong phương pháp này, toàn bộ dữ liệu của một quan hệ được dịch chuyển đến trạm sẽ thực hiện phép kết nối, và được lưu trữ tạm thời trước quá trình kết nối. Nếu phép kết nối chỉ là phép trộn đơn thuần (merge join), trạm thực hiện kết nối có thể không cần lưu dữ liệu tạm mà thực hiện kết nối ngay khi nhận được dữ liệu.
2) Fetch-as-need: trong phương pháp này, một quan hệ được lưu trữ tại một trạm bên ngoài sẽ được quét một cách thường xuyên, với mỗi bản ghi cần thực hiện kết nối giá trị bản ghi sẽ được gửi vào một trạm nội bộ tương ứng, trạm này thực hiện việc tìm kiếm giá trị khớp với giá trị yêu cầu của phép kết nối và gửi lại kết quả này đến trạm bên ngoài. Cách thực thi của phương pháp này tương đối giống với cách thực thi của phép bán kết nối.