INGRES sử dụng thuật toán tối ƣu hoá động, nó tách dần câu truy vấn dạng phép tính quan hệ thành các phần nhỏ hơn. Nó là tổ hợp của hai giai đoạn phân rã và tối ƣu [10].
Câu truy vấn “đa biến” (đa quan hệ) đƣợc phân rã thành một chuỗi các truy vấn “đơn biến” (đơn quan hệ)
Mỗi câu truy vấn đƣợc xử lý bởi bộ xử lý truy vấn một biến (OVQP – one variable query processor).
Trong INGRES ngôn ngữ QUEL đƣợc sử dụng, nhƣng để tạo ra sự nhất quán, thì chúng ta sử dụng tập lệnh SQL để trình bày các ví dụ. Thuật toán trƣớc tiên sẽ thực hiện các phép toán đơn quan hệ và cố gắng làm giảm kết quả trung gian khi sắp xếp thứ tự các phép toán đa quan hệ.
Phân rã
Biến đổi câu truy vấn q có n biến thành một tập tuần tự n câu truy vấn con q1q2 …qn, trong đó qi sử dụng kết quả của qi-1. Quá trình phân rã câu truy vấn đƣợc thực hiện bởi hai kĩ thuật cơ bản : Kĩ thuật tách và kĩ thuật thay thế.
Kỹ thuật tách: Câu truy vấn q đƣợc phân tách thành q‟q” dựa trên một quan hệ chung là kết quả của q‟:
q: SELECT R2.A2, R3.A3, …, Rn.An FROM R1, R2, …, Rn
Trong đó Ai và A‟i là danh sách các thuộc tính của quan hệ Ri, P1 là vị từ có chứa các thuộc tính của R1, P2 là vị từ đa quan hệ có chứa các thuộc tính của các quan hệ R1, R2, …, Rn. Một câu vấn tin nhƣ vậy có thể đƣợc phân rã thành hai câu vấn tin con q‟ và q‟‟ qua phép tách quan hệ chung R1 :
q‟: SELECT R1.A1 INTO R1‟ FROM R1 WHERE P1(R1.A‟1) q”: SELECT R2.A2, … Rn.An FROM R1‟, R2, … Rn WHERE P2(R1.A1, R2.A2,… Rn.An)
Các câu vấn tin đa quan hệ không thể tách đƣợc nữa đƣợc gọi là bất khả giản. Các câu vấn tin đa quan hệ đƣợc biến đổi thành câu vấn tin đơn quan hệ nhờ phép thay thế bộ.
Thay thế bộ: Trƣớc tiên chọn một quan hệ để thay thế, gọi R1 là quan hệ đó. Với mỗi bộ t1i trong R1, các thuộc tính đƣợc tham chiếu trong q đƣợc thay thế bằng các giá trị thực sự trong t1i tạo ra một câu truy vấn q‟ có n-1 quan hệ:
q(R1,R2,…Rn) (q‟(t1i,R2, R3,…Rn), t1i R1
Vì vậy tổng số các câu truy vấn q‟ đƣợc sinh ra bởi phép thế bộ là card(R1).
Ví dụ 3.1:
Vẫn với các quan hệ của ví dụ 2.1, cho câu truy vấn:” Cho biết tên của các nhân viên đang làm việc cho dự án CAD/CAM”
q1: SELECT NHANVIEN.TENNV
FROM NHANVIEN, PHANCONG, DUAN
WHERE NHANVIEN.MSNV=PHANCONG.MSNV
AND PHANCONG.MSDA=DUAN.MSDA
WHERE DUAN.TENDA=”CAD/CAM” q’: SELECT NHANVIEN.TENNV
FROM NHANVIEN, PHANCONG, JVAR
WHERE NHANVIEN.MSNV=PHANCONG.MSNV AND PHANCONG.MSDA=JVAR.MSDA
q12: SELECT PHANCONG.MSNV INTO GVAR FROM PHANCONG, JVAR
WHERE PHANCONG.MSDA=JVAR.MSDA q13: SELECT NHANVIEN.TENNV
FROM NHANVIEN, GVAR
WHERE NHANVIEN.MSNV=GVAR.MSNV
Áp dụng phép thay thế bộ ta có: q11 là câu truy vấn ” đơn biến”, nhƣ vậy q12 và q13 là đối tƣợng để thay thế. Với giả sử GVAR chỉ chứa hai bộ <E1> và <E2> thì q13 sẽ đƣợc thay thế nhƣ sau:
q131: SELECT NHANVIEN.TENNV FROM NHANVIEN WHERE NHANVIEN.MSNV=”E1” q132: SELECT NHANVIEN.TENNV FROM NHANVIEN WHERE NHANVIEN.MSNV=”E2”
Sau đó chúng có thể sẽ đựơc bộ xử lý truy vấn một biến (OVQP) xử lý. Thuật toán tối ƣu hóa INGRES : thuật toán xử lý đệ quy, áp dụng các phép chọn, các phép chiếu ngay khi có thể bằng kỹ thuật tách. Các câu truy vấn bất khả giản còn lại sau phép tách đƣợc kí hiệu là MRQ‟, quan hệ có lực lƣợng nhỏ nhất đƣợc biết từ kết quả của câu truy vấn trƣớc đó sẽ đƣợc xử lý bằng phép thay thế bộ. Các truy vấn đơn biến đƣợc tạo ra sẽ do OVQP xử lý, chọn ra đƣờng truy xuất tốt nhất đến quan hệ theo lƣợng từ hoá vấn tin.
OUTPUT: kết quả thực hiện INGRES-QOA
Begin
Output
If n=1 then
Output run(MRQ {thực hiện câu truy vấn một quan hệ} Else begin
{tách MRQ thành m truy vấn một quan hệ và một truy vấn đa quan hệ} ORQ1,…,ORQm, MRQ’ MRQ
For i 1 to m do Begin
Output’run(ORQi) {thực hiện ORQi} Output output output’ {trộn tất cả các kết quả lại} End-for
RCHOOSE_VARIABLE(MRQ’) {R được chọn cho phép thế bộ} For mỗi bộ tR do
Begin
MRQ’’thay giá trị cho t trong MRQ’
Output’INGRES-QOA(MRQ’’) {gọi đệ quy} Output output output’ {trộn tất cả các kết quả lại} End-for
End-if