Thực thi phép nối ngoài Outer Join

Một phần của tài liệu Xử lý truy vấn và quản lý giao tác trong cơ sở dữ liệu (Trang 25)

Phép nối ngoài có 3 tham số: nối ngoài phải, nối ngoài trái và nối ngoài tổng hợp. Dƣới đây là một ví dụ của phép nối ngoài trái trong SQL2:

SELECT LNAME, FNAME, DNAME

FROM (EMPLOYEE LEFT OUTER JOIN DEPARTMENT ON DNO=DNUMBER);

Kết quả của truy vấn này là một bảng với tên của nhân viên và các phòng ban phụ trách của họ. Nó tƣơng tự kết quả nối thông thƣờng (nối trong), ngoại trừ trƣờng hợp là: nếu một bộ giá trị EMPLOYEE (một bộ giá trị trong quan hệ trái) không có một phòng ban nào phụ trách thì tên của nhân viên vẫn xuất hiện trong bảng kết quả nhƣng tên phòng ban sẽ có giá trị null với các bộ giá trị nhƣ thế trong kết quả truy vấn [6].

Nối ngoài có thể đƣợc tính toán bằng việc sửa một trong các thuật toán nối nhƣ nối lặp lồng nhau hoặc nối lặp đơn. Ví dụ, để tính toán một phép nối ngoài trái, khi đó sử dụng quan hệ bên trái cho vòng lặp ngoài hoặc lặp đơn bởi vì mọi bộ giá trị trong quan hệ trái phải có trong kết quả. Nếu có các bộ giá trị tƣơng xứng trong quan hệ kia thì các bộ giá trị để nối đó đƣợc đƣa ra và lƣu trong kết quả. Tuy nhiên, nếu không tìm thấy bộ giá trị nào của quan hệ kia thì bộ giá trị trong quan hệ trái vẫn đƣợc đƣa vào kết quả nhƣng đƣợc

thêm vào các giá trị null. Thuật toán sắp xếp trộn và nối băm cũng có thể đƣợc mở rộng để tính toán cho các phép nối ngoài .

Phép nối ngoài có thể đƣợc tính toán bằng việc thực một phép nối của các phép toán đại số quan hệ. Ví dụ, phép nối ngoài trái thể hiện ở trên tƣơng đƣơng với một loạt các phép toán quan hệ sau:

1. Tính toán nối trong của bảng EMPLOYEE và DEPARTMENT TEMP1  LNAME,FNAME,DNAME(EMPLOYEE DNO=DNUMBER DEPARTMENT)

2. Tìm các bộ giá trị EMPLOYEE không xuất hiện trong kết quả của phép nối trong

TEMP2 LNAME,FNAME(EMPLOYEE) - LNAME,FNAME(TEMP1) 3. Thêm vào mỗi bộ trong TEMP2 các giá trị null cho trƣờng

DNAME

TEMP2  TEMP2 x „null‟

4. Áp dụng phép toán hợp TEMP1 với TEMP2 để đƣa ra kết quả của phép nối ngoài trái.

RESULT  TEMP1  TEMP2

Giá của phép nối ngoài đƣợc tính toán ở trên sẽ là tổng giá của các bƣớc kết hợp (nối trong, tích Đề các, hợp). Tuy nhiên chú ý rằng bƣớc 3 có thể đƣợc thực hiện nhƣ một quan hệ tạm thời đang đƣợc xây dựng trong bƣớc 2, thêm vào mỗi bộ kết quả một giá trị null. Trong bƣớc 4, hai toán hạng của phép hợp không phải các bộ giá trị chung do đó không cần phải loại trừ trùng lặp.

1.2.7 Các phép toán kết hợp sử dụng đường ống [1, 6]

Một truy vấn đƣợc chỉ ra trong SQL sẽ đƣợc chuyển thành một biểu thức đại số quan hệ đó là một dãy các phép toán quan hệ. Nếu thực hiện một phép toán đơn tại một thời điểm, thì phải sinh ra các file tạm thời trên

đĩa để lƣu các kết quả của các phép toán này dẫn đến chi phí thừa. Việc sinh ra và sắp xếp các file trên đĩa tốn thời gian không cần thiết trong nhiều trƣờng hợp, bởi vì các file này ngay lập tức đƣợc sử dụng nhƣ đầu vào của phép toán tiếp theo. Để giảm số file tạm thời, cách phổ biến là sinh ra các mã thực thi truy vấn tƣơng ứng với các thuật toán để kết hợp các phép toán trong truy vấn.

Ví dụ, thay vì đƣợc thực thi một cách độc lập, một phép nối có thể đƣợc kết hợp với 2 phép toán là phép chọn trên các file đầu vào và phép chiếu cuối cùng trên file kết quả; toàn bộ việc này đƣợc thực thi bởi một thuật toán với 2 file đầu vào và một file đầu ra. Thay vì tạo ra 4 file tạm thời, nên áp dụng thuật toán trực tiếp và chỉ lấy một file kết quả. Khi các bộ kết quả của phép toán đƣợc đƣa ra, các bộ kết quả này lại là các đầu vào của các phép toán tiếp theo. Ví dụ, nếu một phép nối theo sau 2 phép chọn trên các quan hệ ban đầu, kết quả các bộ giá trị từ mỗi phép chọn đƣợc cung cấp giống nhƣ đầu vào của thuật toán nối trong luồng hoặc đƣờng ống.

1.3 Sử dụng các luật dự đoán trong tối ưu truy vấn

Một trong những luật dự đoán chính là việc áp dụng phép SELECT và PROJECT trƣớc khi áp dụng lệnh JOIN hoặc các phép toán nhị phân khác. Bởi kích thƣớc của file kết quả từ một phép toán nhị phân nhƣ JOIN làm tăng kích thƣớc của file kết quả so với các file đầu vào. Phép toán SELECT và PROJECT lại làm giảm kích thƣớc của một file, do đó nên đƣợc áp dụng trƣớc một phép nối hoặc phép nhị phân.

1.3.1 Các ký hiệu với cây truy vấn và đồ thị truy vấn

Một cây truy vấn là một cấu trúc dữ liệu cây tƣơng ứng với một biểu thức đại số quan hệ. Nó thể hiện các quan hệ đầu vào của truy vấn nhƣ là các nút lá của cây, và thể hiện các phép toán đại số quan hệ nhƣ các nút trong. Thực thi một cây truy vấn bao gồm việc thực hiện các phép toán nút trong mỗi khi các toán hạng sẵn sàng và sau đó thay thế nút trong đó bởi quan hệ

kết quả (là kết quả của việc thực hiện phép toán). Giai đoạn cuối của việc thực thi là khi gốc đƣợc thực thi và đƣa ra quan hệ kết quả cho truy vấn.

P.PNUMBER, P.DNUM, E.LNAME, E.ADDRESS, E.BDATE

(a) D.MGNSSN=E.SSN (3) P.DNUM=D.DNUMBER (2) E P.PLOCATION=’stafford’ D P (1) (b) P.PNUMBER,P.DNUM, E.LNAME,E.ADDRESS,E.BDATE

 (P.DNUM=D.DNUMBER) AND (D.MGNSSN = E.SSN) AND (P.PLOCATION=‘STAFFORD’)

Hình 1.4(a) thể hiện một cây truy vấn Q2: Với một dự án tại “Stafford”, lấy ra số dự án, số phòng quản lý, và họ, địa chỉ, ngày sinh của ngƣời quản lý phòng đó. Truy vấn này đƣợc chỉ ra trên một sơ đồ quan hệ của bảng 1.1 ở trang 7 và tƣơng ứng với biểu thức đại số quan hệ:

PNUMBER,DNUM,LNAME,ADDRESS,BDATE(((PLOCATION=‟Stafford‟(PROJECT)) DNUM=DNUMBR(DEPARTMENT)) MGRSSN=SSN(EMPLOYEE))

[P.PNUMBER,P.DNUM] [E.LNAME,E.ADDRESS,E.BDATE]

(c) (adsbygoogle = window.adsbygoogle || []).push({});

P P.DNUM= D.DNUBER D D.MGRSSN=E.SSN E

‘Stafford’

P.PLOCATION= ‘Stafford’

Hình 1.4(c) Đồ thị truy vấn

Biểu thức này tƣơng ứng với truy vấn SQL sau:

Q2: SELECT P.PNUMBER, P.DNUM, E.LNAME, E.ADDRESS, E.BDATE FROM PROJECT AS P, DEPARTMENT AS D, EMPLOYEE AS E WHERE (P.DNUM=D.DNUMBER) AND (D.MGRSSN=E.SSN) AND

(P.PLOCATION=‟Stafford‟);

Trong hình 1.4(a) 3 quan hệ PROJECT, DEPARTMENT, EMPLOYEE đƣợc thể hiện bởi các lá P, D, E. Các phép toán đại số quan hệ của biểu thức đƣợc thể hiện bởi các nút trong. Khi cây truy vấn này đƣợc thực thi, nút đƣợc đánh dấu (1) trong hình 1.4(a) phải đƣợc bắt đầu thực thi trƣớc nút (2) bởi vì một số bộ kết quả của phép toán (1) phải sẵn sàng trƣớc khi bắt đầu thực thi phép toán (2). Một cách tƣơng tự, nút (2) đƣợc thực thi và đƣa ra kết quả trƣớc khi nút (3) bắt đầu thực thi và tiếp tục nhƣ vậy.

Nhƣ vậy, cây truy vấn thể hiện một thứ tự cụ thể của các phép toán thực hiện một truy vấn. Một miêu tả rõ ràng hơn của một truy vấn là đồ thị truy vấn. Hình 1.4(c) thể hiện một đồ thị truy vấn cho truy vấn Q2 ở trên. Các quan hệ trong truy vấn đƣợc thể hiện bởi các nút quan hệ, các nút này đƣợc biểu diễn bởi vòng tròn đơn. Các giá trị hằng số, đặc trƣng từ các điều kiện chọn truy vấn đƣợc thể hiện bởi các nút hằng số và biểu diễn bởi hình tròn kép. Các điều kiện nối và chọn đƣợc thể hiện bởi các cạnh của đồ thị nhƣ hình 1.4(c), các thuộc tính đƣợc lấy ra từ mỗi quan hệ đƣợc thể hiện trong cặp dấu ngoặc vuông “[ ]” bên trên mỗi quan hệ.

Biểu diễn bằng đồ thị truy vấn không chỉ ra thứ tự các phép toán đƣợc thực hiện đầu tiên. Chỉ có duy nhất một đồ thị đơn tƣơng xứng với từng truy vấn. Mặc dù một số kỹ thuật tối ƣu đƣợc dựa vào các đồ thị truy vấn, nhƣng cây truy vấn đƣợc dùng nhiều hơn bởi vì trên thực tế bộ tối ƣu truy vấn cần thể hiện một thứ tự các phép toán cho việc thực thi truy vấn, mà điều này thì trong đồ thị truy vấn không có đƣợc.

1.3.2 Tối ưu kinh nghiệm của các cây truy vấn

Có nhiều biểu thức đại số quan hệ khác nhau và do đó có rất nhiều cây truy vấn khác nhau, có thể tƣơng đƣơng. Bộ phân tích truy vấn sẽ sinh ra một cây truy vấn khởi tạo tƣơng ứng với một truy vấn SQL mà không thực hiện bất kỳ phép tối ƣu nào. Ví dụ, với truy vấn có các phép chọn – chiếu - nối nhƣ Q2, cây truy vấn khởi tạo thể hiện trong hình 1.4(b). Tích Đề Các của các quan hệ chỉ ra trong mệnh đề FROM đƣợc áp dụng trƣớc tiên; sau đó các điều kiện chọn và nối của mệnh đề WHERE đƣợc áp dụng, tiếp đến là phép chiếu trên các thuộc tính của mệnh đề SELECT. Một cây truy vấn trên là đúng quy tắc thể hiện một biểu thức đại số quan hệ nhƣng rất kém hiệu quả nếu thực thi trực tiếp do các phép tích Đề Các (X). Bởi nếu các quan hệ PROJECT, DEPARTMENT và EMPLOYEE có kích thƣớc bản ghi 100, 50 và 150 byte và chứa 100, 20, 5000 bộ dữ liệu riêng biệt, kết quả của phép toán tích Đề Các sẽ bao gồm 10 triệu bộ bản ghi và kích thƣớc mỗi bản ghi là 300 byte. Công việc của bộ tối ƣu truy vấn dự đoán là chuyển cây truy vấn khởi tạo thành cây truy vấn cuối cùng đƣợc thực thi một cách hiệu quả.

Bộ tối ƣu phải bao gồm các luật đối với sự tƣơng đƣơng giữa các biểu thức đại số quan hệ có thể đƣợc áp dụng cho cây ban đầu. Sau đó các luật tối ƣu truy vấn dự đoán sẽ sử dụng các biểu thức tƣơng đƣơng để chuyển cây ban đầu thành cây truy vấn tối ƣu cuối cùng.

Có rất nhiều luật để chuyển phép toán đại số quan hệ sang các phép toán tƣơng đƣơng. Do đó, nếu 2 quan hệ có cùng tập thuộc tính theo một thứ tự khác nhau nhƣng cả hai quan hệ biểu diễn thông tin nhƣ nhau thì xem các quan hệ là tƣơng đƣơng. Xét một số luật chuyển thƣờng đƣợc dùng trong tối ƣu truy vấn [4, 6, 7].

1. Trong một phép chọn có điều kiện liên kết thì có thể chuyển thành một dãy các phép chọn với điều kiện của từng phép chọn là điều kiện con thành phần

2. Phép chọn  có tính chất giao hoán:

C1(C2(R))  C2(C1(R))

3. Trong một dãy các phép chiếu , toàn bộ có thể đƣợc bỏ qua ngoại trừ phép  cuối cùng

list1(list2(...(listn(R))...)) list1(R)

4. Giao hoán của phép  với phép : Nếu điều kiện chọn c bao gồm chỉ các thuộc tính A1, A2,... An trong danh sách chiếu, 2 phép toán có thể đƣợc giao hoán cho nhau

A1, A2,...,An(C(R))  C(A1, A2,...,An(R))

5. Giao hoán của phép nối (và phép tích Đề các x): Phép có tính chất giao hoán giống phép x

R C S  S C R R x S  S x R

Thứ tự của các thuộc tính có thể không giống nhau trong các quan hệ kết quả nhƣng ý nghĩa là nhƣ nhau vì thứ tự của các thuộc tính là không quan trọng.

6. Giao hoán của phép chiếu  với phép nối (hoặc phép x): nếu tất cả các thuộc tính trong điều kiện chọn c chỉ bao gồm các thuộc tính của một trong các quan hệ đƣợc nối, ví dụ là R, hai phép toán có thể giao hoán với nhau

C( R S)  (C(R)) S

Nếu điều kiện chọn c có thể đƣợc viết nhƣ (c1 AND c2), với điều kiện c1 chỉ chứa các thuộc tính của R và điều kiện c2 chỉ chứa các thuộc tính của S, giao hoán của các phép toán nhƣ sau:

Áp dụng các luật một cách tƣơng tự nếu phép đƣợc thay bởi một phép toán x

7. Giao hoán  với (hoặc x): Giả sử rằng danh sách chiếu là L={A1, ..,An, B1,...,Bm}, với A1, ..,An là các thuộc tính của R và B1,...,Bm là các thuộc tính của S. Nếu điều kiện nối c chỉ chứa các thuộc tính trong L thì 2 phép toán này có thể giao hoán nhƣ sau:

L(R C S)  (A1,...,An(R)) C ((B1,...,Bm(S)) (adsbygoogle = window.adsbygoogle || []).push({});

Nếu điều kiện nối c chứa thêm các thuộc tính không có trong L, các thuộc tính này phải đƣợc đƣa thêm vào danh sách chiếu vì chúng cần đến phép  cuối cùng. Ví dụ, nếu các thuộc tính An+1, ..., An+k của R và Bm+1, ...,Bm+p của S đƣợc chứa trong điều kiện nối c nhƣng chúng không có trong danh sách chiếu L, các phép toán này giao hoán nhƣ sau:

L(R c S)  (A1,...,An,An+1,...,An+k(R)) c ((B1,...,Bm, Bm+1,...,Bm+p(S)) Với phép x, không có điều kiện c do đó luật chuyển đầu tiên luôn luôn áp dụng bằng việc thay thế c bởi x

8. Tính chất giao hoán của các phép toán tập hợp. Các phép toán tập hợp: phép giao () và phép hợp () có tính chất giao hoán nhƣng phép trừ (–) thì không.

9. Tính chất kết hợp của , x,  và : gọi  là 1 trong các phép toán này thì chúng ta có

(R  S)  T  R  (S  T)

10. Giao hoán của  với các phép toán tập hợp (, , -). Nếu  là 1 trong trong 3 phép toán tập hợp trên thì:

c(R  S)  (c(R))  (c(S)) 11. Phép toán  giao hoán với phép :

12. Chuyển một dãy các phép toán (, x): Nếu c là điều kiện của một phép  và tiếp sau là một phép x tƣơng ứng với một điều kiện nối thì chuyển dãy các phép toán (, x) sang phép nhƣ sau:

c(R x S)  (R C S)

Ngoài ra có thể dùng nhiều cách biến đổi khác, ví dụ một điều kiện chọn hoặc nối c có thể đƣợc chuyển sang một điều kiện tƣơng đƣơng bằng việc sử dụng các luật sau (các luật của DeMorgan)

NOT (c1 AND c2)  (NOT c1) OR (NOT c2) NOT (c1 OR c2)  (NOT c1) AND (NOT c2)

Vấn đề đặt ra là làm thế nào để các phép biến đổi có thể đƣợc sử dụng trong tối ƣu dự đoán.

Ví dụ về việc chuyển một truy vấn. Xét truy vấn Q trên cơ sở dữ liệu của bảng 1.1 ở trang 7: “Tìm họ của những nhân viên sinh sau năm 1957, những nhân viên này làm việc cho dự án có tên là „Aquarius‟ ” . Truy vấn này có thể đƣợc biểu diễn bởi câu SQL sau:

Q: SELECT LNAME

FROM EMPLOYEE, WORKS_ON, PROJECT

WHERE (PNAME=‟Aquarius‟) AND (PNUMBER=PNO) AND (ESSN=SSN) AND (BDATE>‟1957-12-31‟);

(a) LNAME

(PNAME=‘Aquarius’) AND (PNUMBER=PNO) AND (ESSN=SSN) AND (BDATE>‘1957-12-31’)

x

PROJECT

(b) LNAME x PROJECT WORK_ON EMPLOYEE PNAME=‘Aquarius’ ESSN=SSN x BDATE>‘1957-12-31’  PNUMBER=PNO  ESSN=SSN (c) LNAME x EMPLOYEE  BDATE>‘1957-12-31’ PNUMBER=PNO x  PNAME=‘Aquarius’

35 ESSN=SSN  BDATE>‘1957-12-31’ (d) LNAME EMPLOYEE WORK_ON PROJECT PNUMBER=PNO  PNAME=‘Aquarius’ e) LNAME WORK_ON PROJECT EMPLOYEE  BDATE>‘1957-12-31’ PNUMBER=PNO  PNAME=‘Aquarius’ SSN, LNAME ESSN ESSN.PNO PNUMBER ESSN=SSN

Hình 1.5 Các bước trong việc chuyển một cây truy vấn trong thời gian thực hiện tối ưu dự đoán.

Sử dụng các luật để chuyển cây truy vấn ban đầu sang cây tối ƣu thực thi hiệu quả hơn.

1. Sử dụng luật 1, chuyển các phép SELECT với các điều kiện hội thành một dãy các phép SELECT. Điều này cho phép mức độ tự do lớn hơn trong việc chuyển các phép SELECT xuống các nhánh khác của cây.

2. Sử dụng luật 2, 4, 6 và 10 phối hợp tính chất giao hoán của phép SELECT với các phép toán khác, chuyển mỗi phép SELECT xuống dƣới càng xâu trong cây truy vấn càng tốt bởi các thuộc tính đƣợc bao hàm trong điều kiện chọn

3. Sử dụng luật 5 và 9 phối hợp tính chất giao hoán và kết hợp của các phép toán nhị phân, sắp xếp lại các nút lá của cây

4. Sử dụng luật 12, kết hợp một phép CARTESIAN PRODUCT với một dãy phép SELECT trên cây đƣợc thay thế bằng phép JOIN, nếu điều kiện biểu thị một điều kiện nối.

5. Sử dụng luật 3, 4, 7 và 11 phối hợp dãy các phép PROJECT và giao hoán của phép PROJECT với các phép toán khác, phân nhỏ và chuyển danh sách các thuộc tính chiếu xuống dƣới cây càng xâu càng tốt bằng việc tạo ra các phép PROJECT mới khi cần thiết. Sau mỗi phép PROJECT chỉ nên giữa lại các thuộc tính cần thiết trong kết quả truy vấn và trong các phép toán tiếp theo.

6. Các cây con biểu diễn các nhóm phép toán có thể đƣợc thực hiện bởi một thuật toán đơn. (adsbygoogle = window.adsbygoogle || []).push({});

37

Trong ví dụ trên, hình 1.5(b) thể hiện cây của hình 1.5(a) sau khi áp dụng bƣớc 1 và 2 của thuật toán; hình 1.5(c) thể hiện cây sau bƣớc 3; hình 1.5(d) sau bƣớc 4; Hình 1.5(e) sau bƣớc 5. Trong bƣớc 6 nhóm các phép toán trong cây con lại với nhau với gốc của chúng là phép ESSN vào trong một thuật toán đơn và nhóm các phép toán còn lại vào trong cây con khác với gốc là phép ESSN bởi vì nhóm đầu tiên có nghĩa là cây con này sẽ đƣợc thực thi

Một phần của tài liệu Xử lý truy vấn và quản lý giao tác trong cơ sở dữ liệu (Trang 25)