Rút gọn với phép kết nối: Phép kết nối thực hiện trên các phân mảnh ngang có
MaNV MaNV=’E5’ NV1 NV2 NV3 MaNV MaNV=’E5’ NV2
thể đơn giản khi kết nối dựa theo các thuộc tính kết nối, bằng cách phân phối kết nối trên các hợp và sau đó loại bỏ các kết nối không tác dụng. Việc phân phối các kết nối trên phép hợp như sau:
(R1 R2) S = (R1 S ) (R2 S)
Trong đó, Ri là các mảnh của R và S là một quan hệ.
Bằng phép biến đổi này, các phép hợp có thể được di chuyển lên trên cây toán tử để tất cả các phép kết nối có thể có các mảnh đều được lộ ra. Các phép kết nối vô dụng được bỏ đi khi các lượng từ hoá của các mảnh có mâu thuẫn.
Ví dụ 2.9: Cho 2 quan hệ NV (MaNV, TênNV, CVụ) và PC (MaNV, MaDA, NVụ, Tg) được phân mảnh tương ứng như sau:
NV1 = MaNV E3 (NV) PC1 = MaNV E3 (PC) NV2 = E3 < MaNV E6 (NV) PC2 = MaNV > E3 (PC) NV3 = MaNV > E6 (NV)
NV1 và PC1 cùng định nghĩa bởi vị từ MaNV ≤ E3. Vị từ định nghĩa trong PC2 là hợp của các vị từ được định nghĩa trong NV2 và NV3:
MaNV > E3 = (E3 < MaNV ≤ E6) (MaNV > E6) Xét câu truy vấn sau:
Select * From NV, PC
Where NV.MaNV = PC.MaNV
Câu truy vấn được rút gọn bằng cách phân phối các nối trên các hợp và áp dụng quy tắc: Ri Rj = nếu x thuộc Ri , y thuộc Rj: ( pi(x) ʌ pj(y)) có thể cài đặt như hợp của ba nối từng phần được thực hiện song song.
a. Cây đại số quan hệ truy vấn gốc b. Rút gọn phân mảnh ngang với phép kết nối Hình 2.10: Rút gọn phân mảnh ngang * PC1 PC2 NV1 NV2 NV3 * PC3 NV3 PC2 NV2 PC1 NV1
2.2.2.2. Rút gọn cho phân mảnh dọc
Phân mảnh dọc phân tán một quan hệ dựa trên các thuộc tính chiếu. Vì vậy, phép kết nối sẽ là phép toán tái xây dựng các phân mảnh dọc. Chương trình cục bộ hoá cho một quan hệ phân mảnh dọc bao gồm các kết nối của các mảnh theo thuộc tính chung.
Ví dụ 2.10: Giả sử quan hệ NV (MaNV, TênNV, CVụ) được phân mảnh như sau: NV1 = MaNV, TênNV (NV)
NV2 = MaNV, CVụ (NV)
Khi đó chương trình cục bộ hoá cho quan hệ phân mảnh dọc là: NV = NV1 NV2
Cũng như phân mảnh ngang, các câu truy vấn trên các mảnh dọc đượ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. Cho quan hệ R định nghĩa trên tập các thuộc tính A = {A1, A2, ...} và được phân mảnh dọc thành Ri = A’ (R) trong đó A’ A. Quy tắc được phát biểu như sau:
D,A’ (Ri ) là vô dụng nếu tập thuộc tính chiếu D không thuộc A’ Ví dụ 2.11: Cho quan hệ NV(MaNV, TênNV, CVụ) được phân mảnh dọc thành:
NV1 = MaNV, TênNV(NV) NV2 = MaNV, CVụ(NV) Xét câu truy vấn:
Select TênNV From NV
Bằng cách hoán vị phép chiếu và phép kết nối, nghĩa là thực hiện phép chiếu trên thuộc tính TenNV. Khi đó, có thể nhận thấy rằng phép chiếu trên thuộc tính TenNV trên quan hệ NV2 là vô dụng vì TenNV không phải thuộc tính của của NV2. Vì vậy, phép chiếu chỉ cần thực hiện trên NV1 (xem Hình 2.11).
Hình 2.11. Rút gọn phân mảnh dọc.
2.2.2.3. Rút gọn cho phân mảnh ngang dẫn xuất
Phân mảnh ngang dẫn xuất là một cách để 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.
Nếu quan hệ R phân mảnh dẫn xuất theo quan hệ S, các mảnh của R và S giống nhau ở thuộc tính kết nối sẽ nằm cùng vị trí. Ngoài ra, S có thể được phân mảnh theo vị từ chọn.
TênNV
NV1 NV2
NV1
Vì các bộ của quan hệ R được đặt tùy chọn theo các bộ của S, để đơn giản, giả sử chỉ xét mảnh dẫn xuất chỉ được sử dụng cho mối quan hệ một – nhiều, trong đó, một bộ của S tương ứng với n bộ của R và một bộ của R chỉ khớp với một bộ của S.
Ví dụ 2.12: Cho quan hệ một – nhiều NV PC. Giả sử các quan hệ được phân mảnh như sau: NV1= Cvụ=’TP’(NV) NV(MaNV, TênNV, CVụ) NV2 = Cvụ’TP’(NV) PC1 = PC NV1 PC(MaNV, MaDA, NVụ, Tg) PC2 = PC NV2
Xét câu truy vấn “Đưa ra tất cả các thuộc tính của NV, PC với NVụ = ”PP””, dạng SQL như sau:
Select * From NV, PC
Where NV.MaNV = PC.MaNV and NV.CVụ =”PP”
Câu truy vấn trên các mảnh NV1, NV2, PC1, PC2 đã được định nghĩa. Đẩy phép chọn xuống các mảnh NV1, NV2 câu truy vấn rút gọn lại do mâu thuẫn với vị từ chọn của NV1 => loại bỏ NV1 (xem Hình 2.12).
* MaNV PC1 PC2 NV1 NV2 Cvụ=’PP’ * MaNV PC1 PC2 NV2 Cvụ=’PP’
Hình 2.12: Rút gọn cho phân mảnh ngang dẫn xuất
2.2.2.4. Rút gọn cho phân mảnh hỗn hợp
Mục đích của phân mảnh hỗn hợp là hỗ trợ một cách hiệu quả các câu truy vấn có chứa phép chiếu, chọn và phép kết nối.
Câu truy vấn trên các mảnh hỗn hợp có thể được rút gọn bằng cách tổ hợp các quy tắc tương ứng đã được dùng trong các phân mảnh ngang nguyên thuỷ, phân mảnh dọc, phân mảnh ngang dẫn xuất.
Rút gọn theo các quy tắc sau:
- Loại bỏ các quan hệ rỗng được tạo ra bởi các phép toán chọn mâu thuẫn nhau trên các mảnh ngang.
- Loại bỏ các quan hệ vô dụng được tạo ra bởi các phép chiếu trên các mảnh dọc. - Phân phối các kết nối cho các phép hợp nhằm cô lập và loại bỏ các kết nối vô dụng. Ví dụ 2.13: Cho quan hệ NV (MaNV, TênNV, CVụ) được phân mảnh hỗn hợp như sau: NV1 = MaNV E4 (MaNV, TênNV (NV))
NV2 = MaNV > E4 (MaNV, TênNV (NV)) NV3 = MaNV, CVụ (NV)
Chương trình cục bộ hoá: NV = (NV1 NV2 ) NV3 Xét câu truy vấn: Tên của nhân viên có mã E5
Câu truy vấn được rút gọn như trong Hình 2.13 * MaNV PC1 NV2 PC2 NV2 Cvụ=’PP’ MaNV Cvụ=’PP’ PC2 NV2 Cvụ=’PP’ MaNV *
Hình 2.13: Rút gọn phân mảnh hỗn hợp.
2.2.3. Tối ưu hóa toàn cục
Bước này sẽ xác định thứ tự thực thi truy vấn các mảnh, trạm nào hiệu quả để truyền dữ liệu, nơi mà từng phần của câu truy vấn sẽ được thực thi.
Tối ưu hóa truy vấn là một vấn đề khó khăn trong môi trường phân tán do nhiều yếu tố như phân bổ dữ liệu, tốc độ kênh truyền, việc lập chỉ mục, tính sẵn sàng của bộ nhớ, kích thước của CSDL, việc lưu trữ các kết quả trung gian, ...Vai trò của bộ tối ưu truy vấn là tạo ra một kế hoạch thực thi truy vấn (query execution plan, QEP) với chi phí tối thiểu. Một bộ tối ưu truy vấn là một module phần mềm thực hiện tối ưu hóa truy vấn trên cơ sở của ba thành phần quan trọng của một truy vấn là không gian tìm kiếm, chiến lược tìm kiếm và mô hình chi phí (xem Hình 2.14).
a. Truy vấn gốc b. Truy vấn đã rút gọn NV2 TênNV MaNV=’E5’ TênNV NV1 NV2 MaNV=’E5’ NV3 Câu truy vấn
Hình 2.14: Bộ tối ưu truy vấn
2.2.3.1. Không gian tìm kiếm
Đối với một câu truy vấn đã cho, không gian tìm kiếm có thể được định nghĩa là một tập các cây toán tử tương đương có được bằng cách áp dụng các quy tắc biến đổi. Để nêu bật các đặc trưng của bộ tối ưu hóa truy vấn, ta thường tập trung các cây nối (join tree), là cây toán tử với các phép kết nối hoặc tích Đề các.
Ví dụ 2.14: Xét câu truy vấn sau:
SELECT TênNV FROM NV, PC, DA
WHERE NV.MNV = PC.MNV AND PC.MDA = DA.MDA
Hình 2.15 minh họa ba cây nối tương đương cho truy vấn trên, thu được bằng cách sử dụng tính chất kết hợp của các toán tử hai ngôi. Mỗi cây có thể được gán một chi phí dựa trên chi phí của mỗi toán tử. Cây nối (c) bắt đầu với một tích Đề các có thể có chi phí cao hơn rất nhiều so với cây còn lại.
Với một câu truy vấn có N quan hệ thì sẽ có O(N!) cây nối có thể thu được từ việc áp dụng tính giao hoán và kết hợp.
MDA MNV MNV DA MDA NV NV PC PC DA (a) (b) MNV, MDA X PC DA NV (c) Hình 2.15: Các cây nối
Các công việc một bộ tối ưu hóa truy vấn cần thực hiện như sau: - Xác định thứ tự thực hiện của các phép kết nối.
- Xác định phương thức truy cập các phép kết nối.
- Xác định hình dạng của cây nối trong không gian tìm kiếm, có thể là các dạng: Cây sâu trái (Left Deep Trees), Cây sâu phải (Right Deep trees), Cây đầy đủ (Bushy Join Trees) , Cây nhị phân (Binary Trees) hoặc Cây Zig-Zag (Xem Hình 2.16)
- Xác định thứ tự dịch chuyển của dữ liệu giữa các trạm để giảm số lượng dữ liệu và chi phí truyền thông.
Hình 2.16: Hình dáng của một số cây nối
2.2.3.2. Chiến lược tìm kiếm
Chiến lược tìm kiếm là các thuật toán được áp dụng để xác định kế hoạch thực thi truy vấn tốt nhất từ không gian tìm kiếm để giảm chi phí tối ưu hóa truy vấn. Có hai chiến lược cơ bản:
- Chiến lược xác định (Deterministic Strategy): Chiến lược này tiến hành bằng cách xây dựng các kế hoạch, bắt đầu từ các quan hệ cơ sở, sau đó nối thêm một hoặc
phí tối ưu hóa, những kế hoạch không dẫn đến giải pháp tối ưu được cắt bỏ. Có hai cách: Theo chiều rộng - xây dựng tất cả các kế hoạch có thể trước khi chọn kế hoạch tốt nhất (Quy hoạch động (Dynamic Programming)), theo chiều sâu – chỉ xây dựng một kế hoạch (Greedy).
- Chiến lược ngẫu nhiên (Randomized Strategy): Tiến hành tìm kiếm giải pháp tối ưu xung quanh một số điểm cụ thể. Chiến lược này không đảm bảo kế hoạch tối ưu nhưng tránh chi phí cao trong tối ưu hóa về bộ nhớ và thời gian thực hiện. Chiến lược này áp dụng tốt hơn với câu truy vấn có 5 - 6 quan hệ trở lên. Hai kỹ thuật tiêu biểu là Interative Improvement và Simulated Annealing [4].
2.2.3.3. Mô hình chi phí
Mô hình chi phí của bộ tối ưu hóa gồm có các hàm chi phí để dự đoán chi phí của các toán tử, số liệu thống kê, dữ liệu cơ sở và các công thức để ước lượng kích thước các kết quả trung gian.
Hàm chi phí
Chi phí của một chiến lược thực hiện phân tán có thể được biểu diễn hoặc theo tổng thời gian (total time) hoặc theo thời gian trả lời (response time). Tổng thời gian là tổng của tất cả các thành phần thời gian, còn thời gian trả lời tính từ lúc bắt đầu đến lúc kết thúc câu truy vấn. Công thức chung để tính tổng thời gian như sau:
Total_time = TCPU* #insts + TI/O* #I/Os + TMSG * #msgs + TTR* #bytes
Trong đó:
Total_time: Tổng thời gian;
TCPU: Thời gian của một lệnh CPU;
TI/O: Thời gian cho một thao tác truy xuất/nhập đĩa;
TMSG: Thời gian cố định của việc khởi hoạt và nhận một thông báo;
TTR: Thời gian cần để truyền một đơn vị dữ liệu từ trạm này tới trạm khác, ta xem TTR là hằng số;
#insts, #I/Os, #msgsm, #byte: Tương ứng là tổng trên các trạm của tất cả các số lệnh CPU, số lần truy xuất/ nhập đĩa, số thông báo, kích thước của tất cả các thông báo.
Trong công thức trên, hai thành phần đầu là thời gian xử lý cục bộ, hai thành phần sau là thời gian truyền. Thời gian truyền #bytes dữ liệu từ trạm này đến trạm khác được giả thiết là một hàm tuyến tính của #bytes.
CT(#bytes) = TMSG + TTR* #bytes
Khi thời gian trả lời của câu truy vấn là hàm mục tiêu của bộ tối ưu thì các chi phí xử lý cục bộ song song và truyền thông song song được xem xét. Công thức tổng quát tính thời gian trả lời (response time) là:
Response_time = TCPU * seq_#insts + TI/O * seq_#I/Os + TMSG * seq_#msgs + TTR * seq_#bytes
Trong đó: seq_#x (x có thể là các lệnh CPU, I/O, các thông báo, các byte) là số lớn nhất của x phải được thực hiện tuần tự đối với sự thực thi của câu truy vấn.
Ví dụ 2.15: Hình 2.17 minh hoạ sự khác nhau giữa tổng thời gian và thời gian trả lời, trong đó máy tính trả lời câu truy vấn tại trạm 3 với dữ liệu từ trạm 1 và trạm 2, ở đây chi phí truyền thông được xét.
Hình 2.17: Đồ thị minh họa tổng chi phí và thời gian trả lời
Giả sử, TMSG và TTR được biểu thị theo đơn vị thời gian. Tổng thời gian truyền x đơn vị dữ liệu từ trạm 1 đến trạm 3 và y đơn vị dữ liệu từ trạm 2 đến trạm 3 là:
Total_time = 2TMSG + TTR*(x+y)
Vì việc truyền dữ liệu có thể thực hiện song song nên thời gian trả lời câu truy vấn là: Response_time = max{TMSG + TTR*x, TMSG + TTR*y}
Thời gian trả lời tối thiểu đạt được bằng cách tăng mức độ xử lý song song, tuy nhiên không có nghĩa tổng chi phí là tối thiểu. Ngược lại, tổng chi phí có thể tăng khi có nhiều xử lý cục bộ và truyền song song hơn.
Số liệu thống kê CSDL
Tác nhân chính ảnh hưởng đến hiệu quả hoạt động của một chiến lược thực thi là kích thước các quan hệ trung gian được tạo ra. Khi một phép toán tiếp theo nằm tại một vị trí khác, quan hệ trung gian phải được di chuyển đến đó. Đó chính là điều khiến chúng ta phải ước lượng kích thước của các kết quả trung gian của các phép toán đại số quan hệ nhằm giảm thiểu lượng dữ liệu phải truyền. Việc ước lượng này dựa trên các thông tin thống kê về các quan hệ cơ sở và các công thức để dự đoán lực lượng của các kết quả. Có những được mất giữa tính chính xác của các số liệu thống kê và chi phí quản lý chúng: Số liệu càng chính xác, chi phí càng cao. Đối với một
quan hệ R được định nghĩa trên tập thuộc tính A = {A1, A2, ……., An} và được phân mảnh là R1,R2, …, Rn, dữ liệu thống kê điển hình như sau:
- Đối với mỗi thuộc tính Ai, chiều dài (theo số byte) được ký hiệu là length (Ai)
và đối với mỗi thuộc tính Ai của mỗi mảnh Rj, số lượng phân biệt các giá trị của Ai là lực lượng khi chiếu mảnh Rj trên Ai , được ký hiệu là card (π Ai (Rj)).
- Ứng với miền của mỗi thuộc tính Ai trên một tập giá trị sắp thứ tự được (ví dụ
số nguyên hoặc số thực), giá trị lớn nhất và nhỏ nhất được ký hiệu là max (Ai) và min(Ai).
- Ứng với miền của mỗi thuộc tính Ai lực lượng của miền được ký hiệu là
card(dom[A]). Giá trị này cho biết số lượng các giá trị duy nhất trong dom[A].
y Trạm 1
Trạm 2
Trạm 3 x
- Số lượng các bộ trong mỗi mảnh Rj được ký hiệu là card(Rj)
Đôi khi dữ liệu thống kê cũng bao gồm hệ số chọn nối đối với một số cặp quan hệ, nghĩa là tỷ lệ các bộ có tham gia vào nối. Hệ số chọn nối được ký hiệu là SFj của quan hệ R và S là một giá trị thực giữa 0 và 1:
card(R S) SFj =
card(R)* card(S)
Chẳng hạn hệ số chọn nối 0.5 tương ứng với một quan hệ nối cực lớn, trong khi đó hệ số 0.001 tương ứng với một quan hệ khá nhỏ. Ta nói rằng nối có độ chọn kém
trong trường hợp đầu và độ chọn tốt trong trường hợp sau.
Dữ liệu thống kê này rất có ích cho việc dự đoán kích thước quan hệ trung gian. Size (R) = card (R) * length (R)
Trong đó length (R) là chiều dài (theo byte) của một bộ của R, được tính từ chiều dài của các thuộc tính của R. Việc ước lượng card (R), số lượng các bộ trong R đòi hỏi
phải sử dụng các công thức được cho trong phần tiếp theo. Lực lượng của các kết quả trung gian
Dữ liệu thống kê rất có ích khi đánh giá lực lượng của các kết quả trung gian. Phân phối của các giá trị thuộc tính trong một quan hệ được giả định là thống nhất và tất cả mọi thuộc tính đều được độc lập, theo nghĩa là giá trị của một thuộc tính không ảnh hưởng đến giá trị của các thuộc tính khác. Hai giả thiết này thường không đúng trong thực tế, tuy nhiên chúng làm cho bài toán dễ giải quyết hơn. Dưới đây sẽ trình bày các công thức ước lượng lực lượng kết quả của các phép toán đại số cơ bản (phép