CHƯƠNG 2 : PHÂN RÃ VẤN TIN VÀ CỤC BỘ HÓA DỮ LIỆU
2.2. Cục bộ hóa dữ liệu phân tán và các phương pháp rút gọn câu truy vấn
2.2.2. Rút gọn câu truy vấn SQL phân tán
Chương trình cục bộ hoá là một chương trình đại số quan hệ mà các toán hạng là các quan hệ được dùng để tái thiết lại quan hệ ban đầu.
Để thuận lợi cho việc nghiên cứu việc rút gọn câu truy vấn SQL phân tán, chúng ta xét các cấu trúc câu lệnh song song sau (chương 6 [2]):
Cấu trúc Parbegin và Parend, Cobegin và Coend
Trong chương trình, những tiến trình không sử dụng dữ liệu chung hay độc lập với nhau thì thực hiện được đồng thời. Giả thiết các lệnh S1, S2,..., Sn được thực hiện song song trên n tiến trình (hay n bộ xử lí) riêng biệt. Khi đó chúng ta có thể viết thành khối song song như sau (chương 6 [2]):
Parbegin Hoặc Cobegin
S1; S1;
S2; S2;
... ...
Sn; Sn;
Parend Coend
Cấu trúc forall và inPar
Nhiều khi một số tiến trình (câu lệnh) tương tự nhau cần phải bắt đầu thực hiện và cùng lặp lại một số lần. Điều này có thể thực hiện được bằng cấu trúc forall: forall (i = 0; i < n; i++) S1; S2; ... Sn; }
Hoặc sử dụng cấu trúc for (i = 0; i < n; i++) S1; S2; ... Sn; } In Parallel
2.2.2.1. Rút gọn cho phân mảnh ngang nguyên thuỷ.
*Rút gọn với phép chọn (câu truy vấn dạng SELECT *)
Để phân mảnh ngang nguyên thủy quan hệ R theo vị từ chọn pi (i1,n) ta dùng công thức Ri =pi(R) i1,n. Như vậy, Ri, là một tập các bộ của R thỏa mãn vị từ pi,i1,n. Để tái thiết quan hệ ban đầu ta dùng công thức R= i1,n Ri.
Qui tắc 1:
Nếu x R: (pi(x) pj(x)) thì Pj(Ri) = (2.14) Trong đó pj(x) là vị từ của câu truy vấn SQL và pi(x) là vị từ phân mảnh còn x biểu thị một bộ (bản ghi), khi viết p(x) có nghĩa là “vị từ p đúng với x”.
Ghi chú:Trong trường hợp này, chúng ta bỏ các mảnh Ri nếu nó thỏa (2.14)
Ví dụ 2.2.2.1-1
Chẳng hạn quan hệ EMP trong ví dụ 1.2.2-1 được tách thành ba mảnh ngang nguyên thủy như sau:
R1 = EMP1 = ENO “E3” (EMP); vị từ phân mảnh p1 = (ENO “E3”) R2 = EMP2 = “E3” < ENO “E6” (EMP) ;
vị từ phân mảnh p2 = (“E3” < ENO “E6”) R3 = EMP3 = ENO “E6” (EMP) ;
Chương trình cục bộ hoá cho phân mảnh ngang trên là hợp các mảnh lại: R = R1 R2 R3
Hay
EMP = EMP1 EMP2 EMP3
Vì vậy câu truy vấn thực hiện trên EMP sẽ được thực hiện trên EMP1 EMP2 EMP3
Giả sử cho câu truy vấn: SELECT *
FROM EMP
WHERE “E3” < ENO “E5”
Thấy rằng pj = (“E3” < ENO “E5”), và
(pjp1)= True , nên pj(R1) = và do đó không cần thực hiện câu truy vấn trên R1
(pjp2)= False , nên pj(R2) và do đó cần thực hiện câu truy vấn trên R2
Và (pjp3 )= True , nên pj(R3) = và do đó không cần thực hiện câu truy vấn trên R3
Rút gọn truy vấn dạng SELECT*… trên các quan hệ phân mảnh ngang nguyên thủy chủ yếu là xác định, sau khi đã tái cấu trúc, xem mảnh nào có vị từ phân mảnh mâu thuẫn với vị từ truy vấn thì bỏ mảnh đó đi.
Như đã biết công thức phân mảnh ngang nguyên thủy, được thực hiện theo công thức Ri =pi(R) i1,n. Và tái thiết quan hệ ban đầu ta dùng công thức R= i1,n Ri.
Do các Ri có kích thước khác nhau nên để xử lý song song với vị từ chọn pj trên các Ri trong trường hợp chưa rút gọn, chúng ta dùng cấu trúc lệnh song song Parbegin … Parend hoặc Cobegin … Coend. Chẳng hạn Parbegin … Parend:
Thuật toán1- Rút gọn phép chọn Begin Parbegin S1 =pj(R1) S2 =pj(R2) ... Sn =pj(Rn) Parend S= i1,n Si. End
Chú ý rằng việc thực hiện pj trên tất cả Ri, i1,n là vô lý và không hiệu quả vì theo quy tắc 1, chúng ta có thể không cần thực hiện câu truy vấn này trên một số mảnh Ri nào đó.
Muốn rút gọn các mảnh theo phép chọn vị từ trong trường hợp mà tuần tự chúng ta có giả mã như sau:
M
For i = 1 To n
If (pi pj) //không thỏa quy tắc 1 M = MRi
Endif Endfor
Muốn rút gọn các mảnh theo phép chọn vị từ trong trường hợp mà song song chúng ta có giả mã như sau:
Begin
Parbegin {
M = MR1 Else M = M Endif } {
If (p2 pj) //không thỏa quy tắc 1 M = MR2 Else M = M Endif } … {
If (pn pj) //không thỏa quy tắc 1 M = MRn Else M = M Endif } Parend End Rõ ràng M R= i1,n Ri.
Vì vậy sau khi rút gọn, chúng ta dùng thực hiện truy vấn song song sẽ hiệu quả hơn nhiều.
Trong các quan hệ ở ví dụ 1.2.2-1 rút gọn cho phân mảnh ngang khi dùng câu truy vấn mẫu sau:
SELECT * FROM EMP
WHERE ENO = “E5”
Khi áp dụng thuật toán 1 ta có kết quả (minh họa ở hình 2.3). Câu truy vấn SQL đã rút gọn cho phân mảnh ngang sẽ là:
SELECT * FROM EMPH2 WHERE ENO = “E5”
* Rút gọn với phép nối
Nối trên các quan hệ phân mảnh ngang có thể được đơn giản khi các quan hệ nối được phân mảnh theo thuộc tính nối. Đơn giản hóa gồm có phân phối nối trên các hợp rồi bỏ đi các nối vô dụng. Từ phép phân phối nối và hợp:
(R1R2) S = (R1 S)(R2 S) , trong đó Ri là các mảnh của R còn Slà một quan hệ.
Giả sử rằng các mảnh Ri, Sj được định nghĩa tương ứng theo các vị từ pi, qj trên quan hệ R và S tương ứng, qui tắc đơn giản hoá có thể được phát biến như sau:
Hình 2.3. Rút gọn cho phân mảnh ngang (với phép chọn)
(c) Truy vấn rút gọn ENO = “E5”
EMPH2
(a) Truy vấn gốc ENO = “E5”
EMPH1 EMPH2 EMPH3
(b) Truy vấn đã đổi cho ENO = “E5”
EMPH1 EMPH2 EMPH3
Qui tắc 2:
Nếu x Ri, y Sj: (pi ( x) qj (y)) thì Ri Sj = (2.15) Trong trường hợp này chúng ta nói nối là vô dụng và loại bỏ nối này. Câu vấn tin rút gọn sẽ tốt hơn khi có ít các nối từng phần [3].
Giả sử R= i1,n Ri, Ri được định nghĩa bởi pi (x) và S= j1,m Sj , Sj được định nghĩa bởi qj (y)
Và giả sử R S = i1,n Ri j1,m Sj, do hợp và nối có tính phân phối nên:
R S = i1,n; j1,m Ri Sj
Từ đây chúng ta có thuật toán
Trường hợp không rút gọn và xử lý song song trên nm bộ xử lý.
Begin Parbegin S11 = R1 S1 S12 = R1 S2 … S1m = R1 Sm … Snm = Rn Sm Parend S0 = i1,n; j1,m Sij. End
Trường hợp không rút gọn và xử lý song song trên n bộ xử lý.
Begin
Parbegin
For j = 1 To m S10 = R1 Sj
For j = 1 To m S20 = R2 Sj … For j = 1 To m Sn0 = Rn Sj Parend S0 = i1,n Si0 End
Thuật toán 2- Rút gọn phép nối Trường hợp tuần tự
Begin
For i = 1 To n Mi
For j = 1 To m
If (pi qj) //không thỏa quy tắc 2 Mi = Mi(Ri Sj)
Endif endfor M = i1,n Mi
End
Trường hợp song song dùng nm bộ xử lý
Begin Parbegin S11 = R1 S1 S12 = R1 S2 … S1m = R1 Sm
… Snm = Rn Sm Parend S0 = i1,n; j1,m Sij End Nhận xét: Có thể có rất nhiều quan hệ Sij rỗng.
Trường hợp song song dùng n bộ xử lý
Begin Parbegin S10 = For j = 1 To m S10 = S10 R1 Sj Endfor S20 = For j = 1 To m S20 = S20 R2 Sj Endfor … Sn0 = For j = 1 To m Sn0 = Sn0Rn Sj Endfor Parend S0 = i1,n S0j End Nhận xét: Có thể có rất nhiều quan hệ S0j rỗng.
Muốn rút gọn các mảnh theo vị từ nối trong trường hợp song song chúng ta có giả mã như sau:
Trường hợp song song dùng n bộ xử lý
Begin
Parbegin {
M1
For j = 1 To m
If (p1 qj) //không thỏa quy tắc 2
M1 = M1(R1 Sj) Endif Endfor } ... { Mn For j = 1 To m
If (pn qj) //không thỏa quy tắc 2 Mn = Mn(R1 Sj) Endif Endfor } Parend M= i1,n Mi End Rõ ràng M R S
Vì vậy sau khi rút gọn, chúng ta thực hiện truy vấn song song sẽ hiệu quả hơn nhiều.
Ví dụ 2.2.2.1-3
Trong các quan hệ ở ví dụ 1.2.2-1 giả sử EMP được phân mảnh ngang nguyên thủy như sau:
EMPH1 = ENO “E3” (EMP) ; pEMPH1 = (ENO “E3”)
EMPH2 = “E3” < ENO “E6” (EMP) ; pEMPH2 = (“E3” < ENO “E6”) EMPH3 = ENO “E6” (EMP) ; pEMPH3 = (“E6” < ENO)
và quan hệ ASG được phân mảnh ngang nguyên thủy như sau: ASGH1 = ENO “E3” (ASG) ; pASGH1 = (ENO “E3”) ASGH2 = ENO “E3” (ASG) ; pASGH2 = (ENO “E3”)
Như vậy .
pEMPH1 pASGH1 = (ENO “E3”) (ENO “E3”) = True
pEMPH1 pASGH2 = (“E3” ENO)(“E3” < ENO) = False cho quan hệ rỗng pEMPH2 pASGH1 =(“E3”< ENO“E6”)(ENO“E3”)=Falsecho quan hệ rỗng pEMPH2 pASGH2 = (“E3” < ENO “E6”) (ENO “E3”) = True
pEMPH3 pASGH1 =(“E6”< ENO) (ENO “E3”) = False cho quan hệ rỗng pEMPH3 pASGH2 = (“E6” < ENO) (ENO “E3”) = True
Bây giờ xét câu vấn tin nối sau: SELECT *
FROM EMP, ASG
Kết quả rút gọn ở hình 2.4b.
Bây giờ câu truy vấn sau khi rút gọn là : (SELECT* FROM [EMPH1.ENO=ASGH1.ENO]) UNION (SELECT* FROM [EMPH2.ENO=ASGH2.ENO]) UNION (SELECT* FROM [EMPH3.ENO=ASGH2ENO]); 2.2.2.2. Rút gọn cho phân mảnh dọc
Phân mảnh dọc một quan hệ dựa trên các thuộc tính chiếu. Mỗi mảnh dọc là kết quả chiếu lên một tập con thuộc tính, một tập thuộc tính được dùng để tạo ra mảnh dọc luôn có mặt của tập thuộc tính khóa chính. Toán tử xây
EMPH1 ASGH1 EMPH2 ASGH2 EMPH3 ASGH2
Hình 2.4b Truy Vấn đã rút gọn
ENO
ENO ENO
EMPH1 EMPH2 EMPH3 ASGH1 ASGH2
Hình 2.4a Truy vấn gốc
dựng lại quan hệ gốc từ các mảnh dọc là nối qua tập thuộc tính khóa này. Chương trình cục bộ hoá (tái thiết lại quan hệ ban đầu) cho một quan hệ phân mảnh dọc là phép nối.
Tương tự như phân mảnh ngang, các truy vấn trên các mảnh dọc có thể được rút gọn bằng cách xác định các quan hệ trung gian vô dụng và loại bỏ các cây con đã sinh ra chúng. Phép chiếu trên một mảnh dọc không có thuộc tính chung với các thuộc tính chiếu (trừ khóa của quan hệ) sinh ra các quan hệ vô dụng, mặc dù không phải là quan hệ rỗng. Cho trước quan hệ R(A) | A = {A1, …, An}và được phân mảnh thành các mảnh dọc
Ri = A’(R) | A’ A. Qui tắc loại bỏ quan hệ vô dụng trong phân mảnh dọc phát biểu như sau:
Qui tắc 3
D,K (Ri) là vô dụng nếu tập các thuộc tính chiếu D hoặc K hoặc DK không thuộc A’ (hình 2.5).
Rút gọn truy vấn trên các quan hệ phân mảnh dọc chủ yếu là xác định, sau khi đã tái cấu trúc, xem mảnh nào có vị từ phân mảnh mâu thuẫn với vị từ
truy vấn thì bỏ mảnh đó đi. Công thức phân mảnh dọc, được thực hiện theo công thức Rj =Aj’(R), j=1,N. Và tái thiết quan hệ ban đầu ta dùng công thức R= Rj, j =1,N. A’ Ri K D Hình 2.5. Phép chiếu vô dụng K
Do các Rj có kích thước khác nhau nên để xử lý song song với tập thuộc tính Aj’ trên các Rj trong trường hợp chưa rút gọn, chúng ta dùng cấu trúc lệnh song song Parbegin … Parend hoặc Cobegin … Coend. Chẳng hạn Parbegin … Parend:
Thuật toán 3- Rút gọn phép chiếu
Begin Parbegin S1 =D,K(R1) S2 =D,K(R2) … SN =D,K(RN) Parend S= Sj j=1,N . End
Chú ý rằng việc thực hiện D,K trên tất cả Rj, j=1,N là vô lý và không hiệu quả vì theo quy tắc 3, chúng ta có thể không cần thực hiện câu truy vấn này trên một số mảnh Rj nào đó.
Muốn rút gọn các mảnh theo phép chiếu vị từ trong trường hợp mà tuần tự chúng ta có giả mã như sau:
M
For j= 1 To N
If (D,K(Rj)) là không vô dụng //không thỏa quy tắc 3 M = MRJ
Endif Endfor
Muốn rút gọn các mảnh theo phép chiếu vị từ trong trường hợp mà song song chúng ta có giả mã như sau:
Begin
Parbegin {
If (D,K(R1)) là không vô dụng //không thỏa quy tắc 3 M = M{(D,K(R1))}
Endif
}
{
If (D,K(R2)) là không vô dụng //không thỏa quy tắc 3 M = M {(D,K(R2))}
Endif
}
... {
If (D,K(Rn)) là không vô dụng //không thỏa quy tắc 3 M = M{(D,K(Rn))} Endif } Parend End Rõ ràng M S= Sj, j=1,N .
Vì vậy sau khi rút gọn, chúng ta thực hiện truy vấn song song sẽ hiệu quả hơn nhiều.
Ví dụ 2.2.2.2–1: Trong các quan hệ ở ví dụ 1.2.2-1 quan hệ EMP có thể được phân thành hai mảnh dọc, trong đó thuộc tính khóa ENO phải có mặt trong mọi mảnh dọc.
EMPV1 = ENO , ENAME (EMP)
EMPV2 = ENO , TITLE (EMP)
Chương trình cục bộ hóa là EMP = EMPV1 EMPV2
Xét câu vấn tin trong SQL:
SELECT ENAME
FROM EMP
Câu truy vấn gốc tương đương trên EMPV1 và EMPV2 được cho trên hình 2.6a, sau khi hoán vị phép chiếu với phép nối (tức là chiếu trước nối) được cây hình 2.6b, chúng ta thấy EMPV2 là vô dụng vì ENAME không thuộc EMPV2. Vì vậy phép chiếu chỉ cần thực hiện trên EMPV1 như được trình bày trong hình 2.6c.
Câu truy vấn trong SQL rút gọn là:
SELECT ENAME
FROM EMPV1
2.2.2.3. Rút gọn cho phân mảnh ngang dẫn xuất
Phép nối là phép toán quan trọng nhất vì nó thường gặp lại có thể được tối ưu hóa bằng cách dùng phân mảnh ngang nguyên thủy khi các quan hệ nối được phân mảnh theo các thuộc tính nối. Trong trường hợp này, nối của hai quan hệ được cài đặt như hợp của các nối thành phần. Tuy nhiên phương pháp này ngăn cản không cho một trong các quan hệ phân mảnh theo một
ENAME EMPV1 (c) Truy vấn đã rút gọn Hình 2.6. Rút gọn cho phân mảnh dọc ENAME EMPV1 EMPV2 (a) Truy vấn gốc ENO EMPV1 EMPV2 (b) Truy vấn gốc ENAME ENAME ENO ENO
phép chọn trên một thuộc tính khác. Phân mảnh ngang dẫn xuất là một cách khác để phân phối hai quan hệ mà nhờ đó có thể cải thiện khả năng xử lý các điểm giao nhau giữa phép chọn và phép nối. Điển hình, nếu quan hệ R phải phân mảnh dẫn xuất theo quan hệ S, thì các mảnh của R và S có giá trị giống nhau ở thuộc tính nối sẽ nằm cùng vị trí. Ngoài ra, S có thể được phân mảnh theo vị trừ chọn.
Bởi vì các bộ của R được đặt tuỳ theo các bộ của S, phân mảnh dẫn xuất chỉ sử dụng cho mối liên hệ 1 – n (phân cấp) có dạng S R, trong đó một bộ của S có thể khớp với nhiều bộ của R, nhưng một bộ của R chỉ khớp với đúng một bộ của S. Chú ý rằng phân mảnh ngang dẫn xuất có thể được sử dụng cho các mối liên hệ nhiều - nhiều, với điều kiện là các bộ của S là các bộ khớp với nhiều bộ của R) được nhân bản. Nhân bản như thế gây nhiều khó khăn cho việc duy trì tính nhất quán. Để đơn giản, chúng ta sử dụng phân mảnh dẫn xuất là mối liên hệ phân cấp.
Ví dụ 2.2.2.3-1
Từ ví dụ 1.2.1-1 giả sử rằng EMP được phân mảnh ngang thành EMPH1
và EMPH2 như sau:
EMPH1 = TITLE = ” programmer ” (EMP) EMPH2 = TITLE ” programmer ” (EMP)
Chương trình cục bộ hoá phân mảnh ngang là hợp của các mảnh của nó. Tức là:
EMP = EMPH1EMPH2
Quan hệ ASG có thể được phân mảnh gián tiếp (phân mảnh dẫn xuất (DX)) theo các qui tắc sau:
ASGDXH1 = ASG EMPH1 ASGDXH2 = ASG EMPH2
ENO
Chương trình cục bộ hoá cho quan hệ phân mảnh ngang ASG là hợp của các mảnh của nó. Tức:
ASG = ASGDXH1 ASGDXH2
Các câu truy vấn trên các mảnh dẫn xuất cũng có thể được rút gọn. Bởi vì loại phân mảnh này được sử dụng rất nhiều trong việc tối ưu hóa các câu truy vấn nối, một biến đổi có ích là phân phối các nối trên các tập hợp (được dùng trong cục bộ hóa) và áp dụng qui tắc 2 đã được trình bày ở trên. Bởi vì qui tắc phân mảnh chỉ rõ các bộ sẽ “khớp lại” với nhau, một số nối sẽ sinh ra quan hệ rỗng nếu các vị trí phân mảnh có mâu thuẫn. Ví dụ các vị từ của ASGDXH1 và EMPH2: Vì TITLE là khóa nên các giá trị ENO trong ASGDXH1
ứng với TITLE = ” programmer” không thể bằng với các giá trị ENO trong EMPH2 ứng với TITLE ” programmer” nên mâu thuẫn và vì thế: