Chương 3 MỘT SỐ ĐỀ XUẤT KHÁC VỀ XỬ LÝ PHÉP NỐI TRONG CÁC HỆ CSDL
3.2 Một số phương án tiếp cận xử lý nối phân tán khác
3.2.5 Tăng tốc xử lý truy vấn nhờ AHYPERF [12]
Như đã đề cập ở các phần trước vấn đề tối ưu hóa truy vấn được chú trọng đến nhiều trong quá trình xử lý truy vấn, đã có nhiều nghiên cứu theo các hướng khác nhau, nhưng nhìn chung các kỹ thuật tập trung vào hai hướng chính:
1. Giảm thiểu chi phí cho việc truyền dữ liệu trên mạng bàng cách rút gọn lượng thông tin phải truyền.
2. Tối thiểu thời gian đáp ứng truy vấn bằng các kỹ thuật xử lý song song.
Một trong những cách tiếp cận như vậy đã được đưa ra trong chương hai, thuật toán AHY được trình bày bởi Apers, Hevner và Yao.
Sau này cũng có nhiều đề xuất mới, trong đó có một kỹ thuật dựa trên nối nửa sử dụng bit-vector nhằm cực tiểu chi phí của bước “ngược” (backward phase) trong nối hai chiều 2SJ (two-way-semijoin)[10], [11] được gọi là PERF (Partially Encoded Record Filter) được trình bày bởi Kenneth Ross [11].
Ở phần này, một cải tiến của AHY sử dụng nối PERF gọi là AHYPERF được nghiên cứu bởi Ramzi A. Haraty và Roula C.Fany [12] nhằm tăng tốc xử lý truy vấn trong CSDL PT sẽ được trình bày.
3.2.5.1 Thuật toán AHYPERF Xét hai quan hệ R và S,
Tư tưởng PERF được thực hiện theo các bước chính sau đây:
1. Chiếu quan hệ R trên thuộc tính nối X, thu được ΠX(R). 2. Chuyển ΠX(R) tới trạm chứa S.
3. Rút gọn quan hệ S bằng cách thực hiện nối nửa với ΠX(R), thu được S’.
4. Gửi bit-vector (PERF) ngược lại trạm chứa R, thay vì gửi cả S’.
Bước thứ 4 là bước “ngược”, trong đó bit-vector (PERF) chứa 1 bit tương ứng với một bộ trong R, bit này được gán bằng 1 nếu nó có trong ΠX(S') và 0 nếu ngược lại (ΠX(S') là kết quả thu được bởi phép chiếu S’ trên thuộc tính nối X). Trong đại đa số các trường hợp PERF có kích thước nhỏ đáng kể so với ΠX(S').
Thí dụ 3.5:
Xét 2 quan hệ R(A,X) và S(X,B), trong ví dụ dưới đây bộ thứ 5 trong bit-vector PERF(R) chỉ rằng bộ thứ 5 của R sẽ tham gia trong phép nối , PERF(R) và PERF(S) sẽ rút gọn R><S.
Hình 3. 17 PERF của R và S
PERF được thiết kế để làm cực tiêu chi phí của bước “ngược”, như vậy chi phí của bước 2 là bước “xuôi” (forward) sẽ lớn hơn bước ngược”.
Khi sử dụng PERF với thuật toán AHY thì các bước sau được thực hiện:
1. Thực hiện tất cả các xử lý cục bộ ban đầu.
2. Tạo ra các lich trình ứng cử (candidate schedules) bằng cách cô lập các thuộc tính nối và tạo ra câu truy vấn đơn.
3. For mỗi quan hệ Ri
a. Sử dụng thuật toán SERIAL_PERF và tạo lịch trình ứng cử.
b. Sử dụng thủ tục TOTAL_PERF để tích hợp các lịch trình thích hợp.
Thuật toán SERIAL_PERF
1. Sắp xếp các quan hệ Ri sao cho size(R1)≤size(R2)≤...≤size(Rn)
2. if nếu không có quan hệ nào nằm trên trạm kết quả then chọn chiến lược sau:
→
→
→
→R Rn
R1 2 ... trạm kết quả
Else if Rr nằm trên trạm kết quả then chọn một trong 2 phương án sau:
r n
r R R
R R
R1 → 2 →...→ →...→ →
Hoặc R1→R2 →...→Rr−1 →Rr+1...→Rn →Rrsao cho có chi phí nhỏ nhất
3. Xây dựng PERF list sao cho PERFRiRi+1jđược gán bằng 1 khi việc truyền được thực hiện từ trạm chứa Ri tới Ri+1 trên thuộc tính nối j.
4. Tính toán chi phí truyền If PERFRiRi+1j=1 then
0 cost= Else
8 / ) (
cost=C0 +C1∗bk + bk ∗ρ(i+1)k
Với C0+C1∗bk là hàm tuyến tính của chi phí truyền, C1 là chí cố định cho việc truyền 1 byte, bk là kích thước của quan hệ thu được khi chiếu trên thuộc tính nối (byte), chi phí này được gọi là chi phí của bước “xuôi”.
8 / )
(bk∗ρ(i+1)k là chi phí của bước “ngược”
5. Chọn chiến lược có chi phí thấp nhất
Thuật toán TOTAL_PERF
1. Bổ sung lịch trình ứng cử: với mỗi quan hệ và lịch trình ứng cử, nếu lịch trình chứa việc truyền dữ liệu của thuộc tính nối của quan hệ thì bổ sung một lịch trình khác tương tự nhưng không có việc truyền dữ liệu của thuộc tính nối của quan hệ
2. Tính toán chi phí của lịch trình mới bổ sung, tương tự như trong bước 4 của SERIAL_PERF
3. Chọn ứng cử viên tốt nhất nhằm cực tiểu tổng thời gian truyền của mỗi thuộc tính nối.
4. Cập nhật danh sách PERF (PERF list): gán giá trị bằng 1 cho tất cả các lịch trình đã truyền dữ liệu trong BESTij đã chọn.
5. Sắp xếp lịch trình ứng cử: với mỗi quan hệ Ri, sắp xếp lịch trình ứng cử BESTij trên thuộc tính nối dij sao cho:
) (
...
)
( 1 1
1 i iσ i iσ
i C s SLT ART C s SLT
ART + ∗ ≤ ≤ + ∗
Trong đó:
ART là thời gian trở về (arrival time) của lịch trình tốt nhất SLT là độ chọn tích lũy của thuộc tính của lịch trình tốt nhất s là độ chọn của quan hệ tương ứng.
6. Tích hợp lịch trình: với mỗi BESTij xây dựng một lịch trình tích hợp đối với Ri gồm truyền song song BESTij và tất cả BESTik với k< j.
Phiên bản PERF của thuật toán AHY không loại trừ việc truyền dư thừa từ các lịch trình, nhưng nó làm cho chi phí của nó bằng 0 khi việc đó xảy ra, bằng cách bổ sung thêm vào tổng chi phí truyền một chi phí “ngược” nhỏ. Nếu việc truyền đã được thực hiện từ trạm A tới trạm B, sử dụng thuộc tính nối j, thì mọi thao tác truyền từ B tới A cũng sử dụng j sẽ có chi phí bằng 0. Từ việc đó nối PERF có thể coi là hàm không dư thừa đối xứng (non-redundant symmetric function), với tính chất này cho phép chúng ta cải tiến thuật toán AHY GENERAL truyền thống.
3.2.5.2 Ví dụ so sánh
Xét truy vấn: liệt kê danh sách số hiệu sản phẩm, tên sản phẩm và toàn bộ số lượng các phụ kiện đang trong đơn hàng được cung cấp bởi các nhà cung cấp đang cung cấp linh kiện cho các công việc có mã 10 hoặc 20.
CSDL chứa các quan hệ như sau:
PARTS(P#,PNAME), chứa mã số và tên linh kiện
ON_ORDER(S#,P#,QTY), chứa mã số nhà cung cấp, mã số linh kiện và số lượng trên đơn hàng.
S_P_J(S#,P#,J#), chứa mã số nhà cung cấp, cung cấp linh P# cho công việc có mã số J#.
Các quan hệ này được lưu tại các trạm khác nhau, hai thuộc tính nối là P# và S#.
Hàm chi phí tính theo công thức sau: C(X)= 20 + X, đây là hàm tuyến tính dưới dạng y= aX + b, với:
a là chi phí truyền của mỗi byte
b là chi phí cố định phụ thuộc vào từng mạng, trong trường hợp này b=20 Kích thước và độ chọn của các quan hệ được đưa ra trong hình sau:
di1=P# di2=S#
Ri |Ri| size(Ri)
bi1 ρi1 bi2 ρi2 R1 70 1000 400 0.4 100 0.2 R2 140 2000 400 0.4 450 0.9 R3 150 3000 900 0.4 - -
Hình 3. 18 Mô tả quan hệ
|Ri| lực lượng của quan hệ (tính theo bộ) dij thuộc tính nối
bij độ lớn thuộc tính nối (tính bằng byte) trong quan hệ tương ứng ρij với mỗi thuộc tính nối có độ chọn tương ứng
Sau khi khởi tạo, áp dụng AHYPERF cho truy vấn này, các truy vấn đơn sau được tạo thành trên các thuộc tính di1 và di2. Các lịch trình ứng cử nối tiếp được tạo thành như sau:
Với di1:
Với di2:
d12
120 C(100) d12
d22
120 C(100) d12
110 C(0.2*450) d22
Xây dựng lịch trình cho mỗi quan hệ.
Với R1
Với thuộc tính d11 những lịch trình sau được bổ sung (bằng cách xóa bỏ việc truyền d11 khỏi các lịch trình d21 và d31 )
d’21
420
C(400) d’31
380
C(0.4*900) d31
436
C(400+140*0.9/8) d21
d21
Với các lịch trình của d11 được áp dụng cho R1 ta có:
Tổng thời gian=C(400+70*0.4/8) + C(0.4*400) + C(0.4*1000)=1024
Tổng thời gian= C(400+70*0.4/8) + C(0.4*400+140*0.9/8) + C(0.4*0.4*900) + C(0.4*0.9*1000)=1164
Tổng thời gian= C(400 +140*0.4/8) + C(0.4*1000)= 847
Tổng thời gian= C(400+140*0.9/8) + C(0.4*900+150*0.4/8) + C(0.4*0.9*1000)=
1204
Rõ ràng chúng ta thấy d21' là BEST11 với thời gian là 847 Với thuộc tính d12 lịch trình sau được bổ sung
Với các lịch trình của d12 được áp dụng cho R1 ta có:
Tổng thời gian= C(100+70*0.9/8) + C(0.2*450+140*0.2/8) + C(0.9*1000)= 1162
d’22
474
d22 R1
920
Tổng thời gian= C(450+140*0.2/8) + C(0.9*1000)= 1394
Như vậy BEST12 là d22 với thời gian là 1162. Cuối cùng, với R1 chúng ta se chọn BEST11 với thời gian là 847, ở bước này PERF2−1,1 =1 và PERF1−2,1 =1
Với R2
Với thuộc tính d11
Khi áp dụng mỗi lịch trình của d11 cho R2 ta có:
Tổng thời gian= 0 + C(0.4*400) + C(0.4*2000)= 1000
Lưu ý rằng PERF1−2,1 =1 nên việc truyền từ 1 sang 2 của thuộc tính 1 sẽ bằng 0
d31
0 d11
187 0
d21 d31 R2
740
Tổng thời gian= 0 + C(0.4*400+140*0.4*0.9/8) + 0 + C(0.4*0.9*2000)= 927
Tổng thời gian= C(400+140*0.4/8) + C(0.4*2000)= 1247
Tổng thời gian= C(400+70*0.9/8) + C(0.4*900+150*0.4*0.9/8) + C(0.4*0.9*2000)= 1555
Rõ ràng BEST21 là d31 với tổng thời gian là 927 và BEST22 là d22' với thời gian là 1948. Và ta sẽ chọn d31 cho R2. Như vậy PERF2−3,1 =1 và PERF3−2,1 =1.
Tương tự với R3 ta có BEST31 với tổng thời gian là 740. Như vậy ta có tổng thời gian tối ưu là: 847+927+740=2514.
Như vậy ta có tỷ lệ so sánh giữa AHY và AHYPERF như sau:
AHY AHYPERF
AHY C C
C )/
( − =12.7%
3.2.5.3 Một số kết quả thực nghiệm [12]
Nhóm tác giả đã xây dựng một chương trình bằng C++ chạy trên nền Windows với nhiều kịch bản khác nhau, và cho ra các kết quả như dưới đây. Trong đó cột TYPE cho ta biết số quan hệ, và số thuộc tính nối lớn nhất tham gia nối. Trong trường hợp chưa tối ưu, thì toàn bộ dữ liệu được truyền từ trạm này đến trạm khác.
Kịch bản 1: kích thước mỗi thuộc tính bằng 1 byte
TYPE Unoptimized AHY AHYPERF 2-2 15166.54 11281.77 10244.36 2-3 20176.99 12514.91 11210.69 2-4 25324.95 13195.31 11518.01 3-2 20675.39 15610.47 14097.76 3-3 25983.89 16727.14 15110.53 3-4 30977.84 17211.87 15422.78 4-2 26656.58 18105.75 16167.82 4-3 33149.04 20203.26 18039.28 4-4 39281.91 21067.12 18746.14 5-2 32613.54 19919.32 17448.54 5-3 41224.43 22975.32 20212.85 5-4 48771.57 24180.39 21166.99 TB 30000.22 17749.39 15782.15
0 10000 20000 30000 40000 50000 60000
2-2 2-3 2-4 3-2 3-3 3-4 4-2 4-3 4-4 5-2 5-3 5-4
Unoptimized AHY AHYPERF
Kịch bản 2: Kích thước mỗi thuộc tính bằng 5 byte
TYPE Unoptimized AHY AHYPERF 2-2 77094.85 57045.23 51343.36 2-3 100824.51 61996.65 54589.02 2-4 128113.97 66652.65 57004.79 3-2 102374.75 77600.45 69121.66 3-3 126861.52 83015.71 73938.19 3-4 154160.29 85602.33 75057.11 4-2 133156.13 91216.04 79985.85 4-3 165297.06 101571.73 89211.25 4-4 194790.69 105177.11 91628.56 5-2 162878.19 100808.91 85699.6 5-3 204638.73 114924.46 98263.82 5-4 244435.78 121233.3 103244.1 TB 149552.2 88903.71 77423.94
0 50000 100000 150000 200000 250000 300000
2-2 2-3 2-4 3-2 3-3 3-4 4-2 4-3 4-4 5-2 5-3 5-4
Unoptimized AHY AHYPERF
Kịch bản 3: kích thước mỗi thuộc tính bằng 50 byte.
TYPE Unoptimized AHY AHYPERF 2-2 774307.23 571559.9 512075.76 2-3 1025722.9 631131.25 553042.67 2-4 1286922.7 654111.03 555093.58 3-2 1034533.1 782855.95 695615.08 3-3 1272349.4 814956.83 719179.11 3-4 1558745 870137.82 758737.1 4-2 1343785.1 919758.2 800893.21 4-3 1636465.9 1007484 882273.47 4-4 1954307.2 1056676.8 914048.56 5-2 1622776.1 1005206.8 849381.99 5-3 2025497 1142050.7 975639.24 5-4 2471104.4 1227620.7 1041665.4
0 500000 1000000 1500000 2000000 2500000 3000000
2-2 2-3 2-4 3-2 3-3 3-4 4-2 4-3 4-4 5-2 5-3 5-4
Unoptimized AHY AHYPERF
Nhận xét:
Nhìn chung khi áp dụng PERF vào AHY, nó không làm tăng độ phức tạp thuật toán [12], phần tính toán bổ sung chỉ là việc duy trì danh sách PERF, trong trường hợp này danh sách PERF là mảng ba chiều. Và không hề mất tính tổng quát AHYPERF không phức tạp hơn O(σm2), trong đó σ là số các câu truy vấn đơn khác nhau, m là số quan hệ trong truy vấn.
Dựa trên các kết quả thực nghiệm ta thấy rằng AHYPERF luôn thực hiện tốt hơn so với phiên bản AHY ban đầu.