Cần chú ý rằng khi một quan hệ (hay mảnh) được truyền từ trạm này đến trạm khác thì các chỉ mục cục bộ của nó không còn hữu dụng tại trạm đến. Tổng các chi phí
FT(Q,S1,R1), trong đó tham số thứ 3 là quan hệ được chọn để giữ lại ở trạng thái phân mảnh. Tương tự ta có chi phí tại trạm S2 là FT(Q,S2,R1), như vậy với phương án chọn R1 thì ta có thời gian đáp ứng là: max{FT(Q,S1,R1), FT(Q,S2,R1)}, và khi chọn R2 là: max{FT(Q,S1,R2), FT(Q,S2,R2)}.
Chúng ta sẽ chọn phương án nào có thời gian đáp ứng nhỏ hơn, và để đơn giản ta cũng không xét chi phí truyền kết quả về nơi người dùng yêu cầu.
Vẫn với thí dụ trong hình 3.12, với giả thiết |F11|=50, |F12 |=50, |F21|=100,
200 |
|F22 = , trong đó |Fxy | là kích thước của mảnh . Nếu ta coi chí phí truyền là C(X)=X, nghĩa là c0 =0 và c1 =1 với c0 là chi phí khởi tạo kênh truyền, và c1 là chi phí truyền 1 gói dữ liệu (unit/packet).
Chi phí xử lý nối cục bộ tại mỗi trạm là J(X1,X2)=5.(X1 +X2). Chi phí cho phép hợp tại mỗi trạm là U(X1,X2)=2.(X1+X2). Với tất cả các chi phí này ta có thểước lượng được thời gian đáp ứng khi chọn R1 là: FT(Q,S1,R1) = 200 + 2.(100 + 200) + 5.(50 +300)=2550 trong đó 200 là chi phí truyền F22, và 2.(100 + 200) là chi phí cho phép hợp giữa F21 và F22 và 5.(50 +300) là chi phí cho thao tác nối giữa R2 và
11
F . Tương tự như vậy FT(Q,S2,R1) =100 + 2.(100 + 200) + 5.(50 +300)=2450, như vậy: max{FT(Q,S1,R1), FT(Q,S2,R1)}=2550.
Và khi chọn R2 thì là max{FT(Q,S1,R2),FT(Q,S2,R2)}=1750. Như vậy phương án chọn R2 được giữ lại ở trạng thái phân mảnh sẽđược chọn.
Thuật toán Phân mảnh – và – Nhân bản
Fragment-and-Replicate(Q,R,S)
/*Q là truy vấn liên quan đến tập các quan hệ R xác định trong tập các trạm S*/
For mỗi quan hệ Ri được giữở trạng thái phân mảnh,
For mỗi Sj chứa mảnh của quan hệRi,
Tính toán ước lượng thời gian kết thúc truy vấn con tại trạm Sj, FT(Q,Sj,Ri);
Tính toán thời gian đáp ứng nếu quan hệRiđược giữở trạng thái phân mảnh, RRi=maxj{FT(Q,Sj,Ri)};
Quan hệđược chọn là quan hệ có RRk=mini{RRi}.
Tuy nhiên trên thực tế việc giải bài toán này trong nhiều trường hợp lại là bài toán khó. Xét ví dụ như trong hình 3.14. Và để giải quyết bài toán này thì người ta thường tìm cách đưa vào các heuristic. Và việc tìm cách kết hợp phương pháp Phân mảnh-và-Nhân bản với phương pháp sử dụng thông tin phụ thuộc vị trí cũng được nghiên cứu. 1 S S2 … Sk Sk+1 Sk+2 R1 F11 F12 … F1k R2 R2 R2 Hình 3. 14 Một ví dụ về phân mảnh trên các trạm
3.2.3 Thuật toán qui hoạch băm [7]
Một cách tiếp cận khác được xét đến khi các phương pháp trên không thực hiện được, đó là sử dụng quy hoạch băm. Xét lại thí dụ trong hình 3.12, giả sử thao tác nối được thực hiện trên thuộc tính A (A chỉ chứa giá trị nguyên). Chúng ta sử dụng hàm băm để quy hoạch như sau h(a)=1 nếu giá trị của a là lẻ, h(a)=0 nếu a chẵn. Ta sử dụng quy tắc : mỗi khi có h(a)=1 thì bộ đó được gửi tới trạm S1, còn nếu ngược lại thì bộ được gửi tới trạm S2. Theo cách đó F11 được phân hoạch thành 2 mảnh con F11o và F11e, và F12 được phân hoạch thành F12o và F12e, với ký hiệu o và
e tương ứng với giá trị lẻ và chẵn của thuộc tính A. F11e được truyền tới trạm S2, và thực hiện hợp với mảnh F12e để tạo thành mảnh F12' , cũng như thế ta có ' 11 F thu được tại trạm S1 bởi hợp của hai mảnh F11o và F12o. Tương tự ta có ' 21 F và ' 22 F tại các trạm nhờ việc truyền dữ liệu và hợp chúng. Và ta nhận thấy rõ ràng rằng ( ') 11 F A ∏ và ( ' ) 22 F A
∏ không có giá trị chung, do một bên chỉ chứa giá trị lẻ còn một bên chỉ chứa giá trị chẵn. Như vậy ' =φ
22 '
11 F
có phụ thuộc vị trí trên thuộc tính A giữa R1 và R2 (dựa trên việc xây dựng các mảnh mới). Như vậy R1><A R2 sẽ là kết quả của ( ) ( ' ) 22 ' 21 ' 21 ' 11 F F F F ><A ∪ >< . Trong trường hợp miền giá trị của thuộc tính A không phải là nguyên, thì ta có thể dùng bit cuối của thể hiện nhị phân của giá trị này để phân hoạch. Hoặc một lựa chọn khác khi hàm băm có giá trị trong khoảng [0,1], thì ta có thể ngầm định rằng nếu giá trị hàm băm nằm trong khoảng [0, 0.5] thì bộ được truyền tới trạm S1, và nếu trong khoảng [0.5, 1] thì bộđược truyền tới trạm S2.
Xem xét nối ba quan hệ R1, R2, R3. Giả sử các quan hệ này nằm trên 2 trạm. Ta thấy sẽ có hai tình huống như sau: thực hiên nối trên cùng một thuộc tính (ví dụ A), hoặc chúng được thực hiện nối trên các thuộc tính khác nhau.
Tình huống thứ nhất: R1><A R2><A R3, ta sử dụng hàm băm như cách đã trình bày ở trên. 1 S S2 ) ( 11 A Fo F12e(A) ) ( ) ( 21 21 A F B Fo ∪ o F22e (A)∪F22e (B) ) ( 31 B Fo F32o(B)
Hình 3. 15 Mô tả cách tạo bản sao cho bộ
Tình huống thứ hai: R1><A R2><B R3, nếu ta sử dụng cùng hàm băm cho thuộc
tính A và thuộc tính B thì có thể sẽ không thu được phụ thuộc vị trí bởi những lý do sau: Các bộ có giá trị lẻ trên thuộc tính A của R1 sẽ ở trạm S1, các bộ có giá trị lẻ trên thuộc tính B của R3 cũng sẽ ở trạm S1. Tuy nhiên, có thể có vài bộ của R2 có giá trị lẻ trên thuộc tính A và giá trị chẵn trên thuộc tính B, như vậy mỗi bộ này sẽ được ánh xạ bởi 2 hàm băm lên hai trạm khác nhau. Có một giải pháp cho phép các bộ này được sao lại trên cả hai trạm.
Thí dụ 3.3:
Trong hình 3.15, bộ của R2 có giá trị lẻ trên thuộc tính A và giá trị chẵn trên thuộc tính B sẽ nằm trong cả hai mảnh F21o và F22e và được nhân bản trên cả hai trạm S1
và S2. Mảnh Fij của quan hệRi phải được định vị trên trạm Sj trước khi thực hiện thao tác nối liên quan. Nói chung, một quan hệ có thể có nhiều thuộc tính tham gia nối với các quan hệ khác, và nếu một bộ của quan hệ (sau khi phân hoạch bởi các hàm băm) có liên quan đến các thuộc tính nối trên nhiều trạm khác nhau thì chúng phải được nhân bản lên các trạm này.
Một giải pháp khác, là ta sẽ thực hiên lần lượt từng phép nối: nối R1 và R2 trên thuộc tính A trước (sử dụng hàm băm) tạo ra quan hệ trung gian R4, sau đó thực hiện nối giữa R4 và R3 trên thuộc tính B (sử dụng hàm băm).
Với các trường hợp trên ta có những nhận xét như sau:
1. Nếu có i trạm, thì hàm băm như h(a)=j+1 với j=a mod i có thể được sử dụng, nghĩa là khi bộ có giá trị“a” chia i được số dưj thì bộđó được chuyển tới trạm Sj+1. Bằng cách đó bộ với giá trị cho trước trên thuộc tính nối được ánh xạ tới một trong sối trạm, với j∈[0,i−1].
2. Ta có thể sử dụng một phương án khác để phân hoạch quan hệ/mảnh dựa trên khoảng giá trị của thuộc tính nào đó. Thí dụ nếu thuộc tính nối A có giá trị trong khoảng [cận dưới, cận trên], thì khoảng giá trị này có thểđược chia thành các i khoảng rời nhau [cận dưới, a1], (a1,b1],…,(ai−1, cận trên], sao cho bộ nằm trong khoảng [cận dưới, ai] được chuyển tới trạm S1, bộ trong khoảng (aj,bj] chuyển tới trạm Sj+1 với 1≥ j≥i−2, và bộ trong khoảng (ai−1, cận trên] chuyển tới trạm Si. Phương pháp này này được gọi là phân hoạch trên khoảng.
3. Và chúng ta cũng cần quan tâm đến việc kết hợp giữa hai phương pháp trong tình huống thứ hai.
3.2.4 Xử lý truy vấn chuỗi [7]
Nhưđã đề cập ở chương 2, trên thực tế có một lớp truy vấn quan trọng gọi là truy vấn chuỗi (chain query) và thuật toán đa thức xử lý bài toán này. Các truy vấn chuỗi thường có dạng: n n A n n A A A A R R R R R1 >< 1 2 >< 2 3>< 3 ...>< −2 −1 >< −1
Trong đó hai quan hệ không kề nhau (nonadjacent relations) thì không có thuộc tính nối chung, tức là Ai ≠ Aj với i≠ j. Để tránh sử dụng tích Descartes, thì vị trí của mỗi quan hệ được cốđịnh, không thay đổi trong suốt quá trình tối ưu truy vấn chuỗi. Thí dụ trong tình huống phép nối có 3 quan hệ R1><A1 R2><A2 R3, thì các
thứ tự nối có thể như sau: nối R1 với R2 trước sau đó mới thực hiện nối với R3: 3 2 2 1 1 ) (R ><A R ><A R , dấu ngoặc đơn biểu thị thứ tự nối, hoặc ta có thể thực hiện nối 2
R với R3 trước sau đó mới nối với R1: R1><A1 (R2 ><A2 R3). Bài toán đặt ra ở đây là cần xác định rằng với thứ tự nối nào thì truy vấn có chi phí nhỏ nhất.
Nếu như các quan hệ không phân mảnh , thì bằng cách sử dụng qui hoạch động chi phí (là tổng các chi phí truyền) của truy vấn chuỗi sẽđược tối ưu. Nếu các quan hệ được phân mảnh thì thời gian đáp ứng (là tổng thời gian xử lý cục bộ và thời gian truyền) vẫn có thểđược tối thiểu với kết quả gần tối ưu.
Đầu tiên với truy vấn chuỗi cho trước, ta cần xác định chi phí nối nhỏ nhất giữa 2 quan hệ kề nhau Ri và Ri+1, gọi là costi,i+1, 1≤i≤n−1. Phép nối giữa 2 quan hệ có thểđược thực hiện bằng nhiều phương pháp (nối sử dụng thông tin phụ thuộc vị trí, sử dụng qui hoạch băm, sử dụng phương pháp nhân bản- và-thay thế… ). Căn cứ vào phương pháp nối cũng như khía cạnh vật lý của dữ liệu (như lưu trữ, chỉ mục…) chi phí nhỏ nhất của phép nối giữa 2 quan hệ có thể thu dược thông qua việc chọn chiến lươc thực thi có chi phí tổng thể (ước lượng) là tối thiểu. Gọi Ri,i+1
là kết quả phép nối giữa Ri và Ri+1, ta có chi phí nhỏ nhất của thao tác nối 3 quan hệ Ri, Ri+1 và Ri+2 có thể là chi phí cho kết nối giữa Ri,i+1 và Ri+2 hoặc chi phí giữa
i
2 , 1
costi+ i+ , và ta có chi phí nhỏ nhất để thực hiện nối 3 quan hệ là chi phí thực hiện nhỏ nhất cho phép nối 2 quan hệ cộng thêm các chi phí nối bổ sung nào đó. Quá trình này được lặp lại với các tập 4, 5, … quan hệ liền kề, cho đến khi thu được chi phí nhỏ nhất cho chuỗi nối n quan hệ. Quá trình trên được mô tả như sau:
Gọi costi,j, i< j là chi phí nhỏ nhất để thực hiện nối các quan hệ liền kề
j i
i R R
R, +1,..., , và Ri,j là kết quả của dãy nối đó. Nó có thể thu được bởi phép nối giữa Ri và Ri+1,j, hoặc giữa Ri,i+1 với Ri+2,j, hoặc …, hoặc Ri,j−1 với Rj. Khi chi phí để thu được Ri+1,j là costi+1,j, ta sẽ có chi phí để có được Ri,j là
j i t 1,
cos + + joinc(Ri,Ri+1,j), với joinc() là chi phí nhỏ nhất để nối hai quan hệ. Ta có: )} , ( cos {cos min costi,j = i≤k<j ti,k + tk+1,j + joinc Ri,k Rk+1,j (***)
Trong đó 0costk,k = , Rk,k = Rk. Mục tiêu của việc thực hiện tối ưu hóa truy vấn chuỗi là tìm phương án thực thi để có được R1,n với chi phí cost1,n nhỏ nhất. Giá trị của biểu thức (***) là chưa xác định khi truy vấn chưa thực thi, nên nó cần phải được dự đoán trong quá trình tối ưu hóa. Có nhiều yếu tố ảnh hưởng đến chi phí nối, một trong sốđó là kích thước của quan hệ trung gian, và nó cũng cần phải được dự đoán. Một thuật toán từ dưới – lên được xây dựng dựa trên biểu thức (***), trong đó khi j-i = s, thì chi phí nhỏ nhất để nối tất cả(s+1) quan hệđược tính toán.
Tối ưu hóa – chuỗi – truy vấn
Tính toán cost1,n
Forj-i=1ton-1do
{tính costi,j dựa trên biểu thức (***);
Gọi K(i,j) là giá trị của k sao cho vế phải của biểu thức (***) là nhỏ- nhất, nghĩa là
costi,j =costi,K(i,j)+costK(i,j)+1,j + joinc(Ri,K(i,j),RK(i,j)+1,j); }
Đưa ra phương án thực thi. Phương án thực thi tối ưu có thểđược sinh ra bởi việc
tương ứng với thao tác nối cuối cùng là R1,K(1,n)><AK(i,j) RK(i,j)+1,n. Chi phí nhỏ nhất để có được R1,K(1,n) là cost1,K(1,n). Thêm nữa ta cũng có K(1,K(1,n)), mà với nó thao tác nối cuối cùng tương ứng cho ra quan hệ R1,K(1,n) có thể thu được. Tương tự như vậy thao tác nối cuối cùng tương ứng cho ra kết quả là quan hệ RK(1,n)+1,n cũng có thể thu được. Bằng việc lặp lại các thao tác này thứ tự thực hiện giữa n-1 nối được xác định. n t1, cos 1 , 1 cost n− cost2,n … 3 , 1
cost cost2,4 … costn−2,n
2 , 1
cost cost2,3 cost3,4 … costn−1,n
1 , 1
cost cost2,2 cost3,3 cost4,4 … costn,n
Hình 3. 16 Tính toán chi phí từ dưới – lên
Cần n-1 vòng lặp để tính toán cost1,n, trong đó vòng lặp đầu tiên tất cả các chi phí
j i
t,
cos được tính toán (với j-i=1), có n-1 phép toán như vậy. Trong vòng lặp thứ 2, tất cả các chi phí costi,j được tính toán (với j-i=2), có n-2 phép toán như vậy. Tổng quát, ở phép lặp thứl tất cả các chi phí costi,j được tính toán (với j-i=l), có n-l phép toán như vậy. Như vậy tổng số các chi phí cần phải tính là: ∑ − =1 = − − = 1 2) ( ) 2 )( 1 ( 2 1 n
l l n n O n . Với mỗi i, j cho trước ta có thể có được costi,j
thông qua việc tính toán và so sánh biểu thức j-i. Rõ ràng ta có n-1 là cận trên của j- i nên tổng số các phép toán cần thiết để tính toán cost1,n là O(n3). Giai đoạn hai của thuật toán chỉ cần O(n), Như vậy độ phức tạp thuật toán là O(n3). Hình 3.16 là một mô tả việc tính toán từ dưới lên.
Thí dụ 3.4:
Khởi đầu chi phí nhỏ nhất của phép nối giữa hai quan hệ kềđược ước lượng. Giả sử ta có: cost1,2 = joinc(R1,R2)=3, cost2,3 = joinc(R2,R3) =5và
6 ) , (
cost3,4 = joinc R3 R4 = . Rõ ràng K(1,2)=1, K(2,3)=2 và K(3,4)=3. Ta có chi phí nối nhỏ nhất của R1 ><A1 R2 ><A2 R3 là cost1,3 được tính bởi: )} , ( cos ), , (
min{cost1,2 + joinc R1,2 R3 t2,3 + joinc R1 R2,3
Giả sử rằng joinc(R1,2,R3)=4 và joinc(R1,R2,3)=1, thì ta sẽ có cost1,3= min{3+4, 5+1}=6, và K(1,3)=1. Chí phí tối thiểu để xử lý R2 ><A2 R3 ><A3 R4 là cost2,4
cũng được ước lượng, với joinc(R2,3,R4)=3 và joinc(R2,R3,4)=4, thì cost2,4= min{5+3, 6+4}=8 và K(2,4)=3. Cuối cùng chi phí để thực hiện nối cho 4 quan hệ là:
)} , ( cos ), , ( cos cos ), , ( min{cos 4 , 2 1 4 , 2 4 , 3 2 , 1 4 , 3 2 , 1 4 3 , 1 3 , 1 R R joinc t R R joinc t t R R joinc t + + + +
Giả sử rằng joinc(R1,3,R4)=5, joinc(R1,2,R3,4)=4, joinc(R1,R2,4)=2 ta có cost1,4= min{6+5, 3+6+4, 8+2}=10 và K(1,4)=1. Bây giờ ta sẽ sử dụng các K(i,j) để xây dựng phương án thực thi với tổng chi phí là 10, với K(1,4)=1 ta biết được nối cuối cùng là R1 ><A1 R2,4, từ K(2,4)=3 ta biết được nối cuối cùng là để có R2,4 là