Rút gọn câu truy vấn SQL phân tán

Một phần của tài liệu (LUẬN văn THẠC sĩ) rút gọn câu truy vấn và ứng dụng trong cơ sở dữ liệu phân tán (Trang 47 - 72)

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 (i1,n) ta dùng công thức Ri =pi(R) i1,n. Như vậy, Ri, là một tập các bộ của R thỏa mãn vị từ pi,i1,n. Để tái thiết quan hệ ban đầu ta dùng công thức R= i1,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à

(pjp1)= True , nên pj(R1) =  và do đó không cần thực hiện câu truy vấn trên R1

(pjp2)= False , nên pj(R2)   và do đó cần thực hiện câu truy vấn trên R2

Và (pjp3 )= 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) i1,n. Và tái thiết quan hệ ban đầu ta dùng công thức R= i1,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= i1,n Si. End

Chú ý rằng việc thực hiện pj trên tất cả Ri, i1,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 = MRi

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 = MR1 Else M = M Endif } {

If (p2 pj) //không thỏa quy tắc 1 M = MR2 Else M = M Endif } … {

If (pn pj) //không thỏa quy tắc 1 M = MRn Else M = M Endif } Parend End Rõ ràng M  R= i1,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:

(R1R2) 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= i1,n Ri, Ri được định nghĩa bởi pi (x) và S=  j1,m Sj , Sj được định nghĩa bởi qj (y)

Và giả sử R S = i1,n Ri  j1,m Sj, do hợp và nối có tính phân phối nên:

R S = i1,n; j1,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 = i1,n; j1,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 = i1,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 = i1,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 = i1,n; j1,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 = Sn0Rn Sj Endfor Parend S0 = i1,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= i1,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”)=Falsecho 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 DK 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 = MRJ

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 = EMPH1EMPH2

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ế:

Một phần của tài liệu (LUẬN văn THẠC sĩ) rút gọn câu truy vấn và ứng dụng trong cơ sở dữ liệu phân tán (Trang 47 - 72)

Tải bản đầy đủ (PDF)

(94 trang)