Thuật toán INGRES sử dụng chiến lược tối ưu truy vấn động bằng cách chia một truy vấn phép tính trên quan hệ thành nhiều truy vấn con nhỏ hơn, mỗi truy vấn con sẽ dựa vào kết quả của truy vấn con trước đó. Mỗi xử lý sẽ được thực hiện bởi bộ xử lý truy vấn một biến (one variable query processor).Hai giai đoạn được sử dụng trong thuật toán là phân rã và thay thế[5].
Ví dụ 3.3. Xét câu truy vấn SQL q1 được phân rã thành hai câu truy vấn nhỏ
hơn là q11 và q12 như sau:
q1: SELECTr2.A2, r3.A3, ..., rn.An
FROMr1, r2, ..., rn
WHERE P1(r1.A'1) AND P2(r1.A1, r2.A2, ..., rn.An) q11: SELECTr1.A1INTO r'1 FROMr1 WHERE P1(r1.A'1) q12: SELECTr2.A2, r3.A3, …, rn.An FROMr'1, r2, …, rn WHERE P2(r'1.A1, r2.A2,…, rn.An)
Trong đó, A1 và A'1 là các thuộc tính của quan hệ r'1, P1 là vị từ có chứa thuộc tính A'1 và P2là vị từ có chứa các thuộc tính của các quan hệ r1, r2, ..., rn. Bước phân rã này là quan trọng để giảm kích thước của các quan hệ trước khi thực hiện quan hệ nhị phân. Các truy vấn trên nhiều quan hệ (multi-relation queries) không thể tiếp tục phân rã được gọi là truy vấn tối giản. Một truy vấn
được cho là tối giản nếu và chỉ nếu đồ thị truy vấn tương ứng là một chuỗi với hai nút. Các truy vấn tối giản được chuyển thành các truy vấn đơn quan hệ bằng phép thế bộ (tuple substitution) [8, 13].
Thuật toán 3.1: Thuật toán INGRES(Dynamic-QOA)[15] Đầu vào: MRQ: truy vấn trên n quan hệ
{multirelation query with n relations}
Đầu ra: out put: kết quảthực thi truy vấn
Bắt đầu:
out put← ∅;
ifn = 1 then
out put ← run(MRQ) {thực thi truy vấn trên một quan hệ}
{tách MRQ thành m truy vấn trên một quan hệ (ORQ) và một truy vấn nhiều quan hệ ORQ1, ..., ORQm; MRQ'←MRQ}
{ORQ: Mono - Relation Query}
fori from 1 to mdo
out put←run(ORQi); {thực thi truy vấn một biến thứ i}
out put←out put∪ out put' {hợpcác kết quả} {R được chọn để thế bộ}
R ← CHOOSE_RELATION(MRQ');
formỗi bột ∈ R do
MRQ'' ←thay thế giá trị cho t trong MRQ';
out put ← Dynamic-QOA(MRQ'') ; {gọi đệ quy}
out put←out put∪ out put' {hợp các kết quả}
Kết thúc
Ví dụ 3.4. Cho ba quan hệ Services, Team, Contact trong cơ sở dữ liệu AP SD (xem hình 2.6)
Xét câu truy vấn SQL sau đây:
SELECT ServiceName, ContactName FROM Services, Team, Contact
WHERE Services.TeamID = Team.TeamID AND Team.TeamID = Contact.TeamID AND TeamName Like ‘%Hỗ trợ’
Sử dụng kỹ thuật phân rã, truy vấn trên sẽ được thay thế bởi các truy vấn q1 và q2 sau đây, tại đó Team1 là quan hệ trung gian.
WHERE TeamName Like ‘%Hỗ trợ’ q2: SELECT ServiceName, ContactName
FROM Services, Team1, Contact
WHERE Services.TeamID = Team1.TeamID AND Team1.Team= Contact.TeamID
Tương tự như vậy, phân rã truy vấn q2 có thể sinh ra các truy vấn q21 và q22 như sau:
q21: SELECT ContactName, Contact.TeamID INTO Contact1 FROM Contact, Team1
WHERE Contact.TeamID = Team1.TeamID q22: SELECT ServiceName
FROM Services, Contact1
WHERE Services.TeamID = Contact1.TeamID
Các truy vấn q21 và q22 là truy vấn trên hai quan hệ nhưng không thể giản lược được nữa, vì vậy sẽ thực hiện thế bộ, giả sử trong truy vấn q22, ba bộ được lựa chọn có TeamID là C01, C03 và C06. Thực hiện thế bộ quan hệ Contact1 sẽ sinh ra ba truy vấn một quan hệ như sau:
q221: SELECT ServiceName FROM Services WHERE Services.TeamID = ‘C01’ q222: SELECT ServiceName FROM Services WHERE Services.TeamID = ‘C03’ q223: SELECT ServiceName FROM Services WHERE Services.TeamID = ‘C06’
Như vậy, các truy vấn tối giản đã có thể thực thi được.