Hình 2.4a Mảnh ngang PROJH1 lưu các thôngtin về các dự án có ngân sách dưới 200,000 USD
2.3.2. Phân mảnh dọc
Phân mảnh dọc chia một quan hệ R ra các mảnh R1, R2,..Rr. Mỗi mảnh chứa một tập con các thuộc tính cùng với khóa của quan hệ R. Mục đích của phân mảnh dọc là phân hoạch một quan hệ thành một tập các quan hệ nhỏ hơn, để có nhiều ứng dụng chỉ cần chạy trên một mảnh. Như vậy một cách phân mảnh tối ưu là phân mảnh sinh ra một lược đồ phân mảnh cho phép giảm tối đa thời gian thực thi các ứng dụng chạy trên các mảnh đó.
Phân mảnh dọc được nghiên cứu cho cả CSDL tập trung lẫn phân tán, tập trung là sử dụng nó làm cong việc thiết kế, cho phép vấn tin chỉ với các quan hệ nhỏ hơn, nên giảm được số truy nhập vào các trang. Khi xác định được các quan hệ con hoạt động nhất thì đặt chúng vào trong các hệ thống bộ nhớ con có tốc độ truy cập nhanh nhất nếu có sự hỗ trợ về phân cấp bộ nhớ.
Phân mảnh dọc tất nhiên là phức tạp hơn so với phân mảnh ngang, vì số lựa chọn có thể có của phân mảnh dọc là rất lớn. Trong phân mảnh ngang, nếu tổng các vị từ đơn giản của tập Pr là n thì số mảnh ngang có thể có tối đa là 2n (vì có 2n vị từ hốiơ cấp) chưa nói trong số chúng có một số sẽ mâu thuẫn với các phép kéo theo do đó sẽ làm giảm số mảnh phải xem xét. Còn trong phân mảnh dọc nếu một quan hệ có m thuộc tính không phải là khóa thì số mảnh dọc có thể có sẽ là số Bell thứ m B(m). Vớ m đủ lớn thì số Bell B(m)≅mm, ví dụ m=10, B(m)=115.000; m=9, B(m)=109; m=30, B(m)=1023,…. Qua những minh chứng này cho thấy để tìm các phân mảnh dọc tối ưu là bài toán heuristic (Một phương pháp giải quyết vấn đề bằng cách sử dụng các quy tắc thô thiển rút ra từ kinh nghiệm. Các phương pháp này rất ít khi được đưa vào sách vở, nhưng đó là một bộ phận kiến thức mà các chuyên gia dùng để giải quyết vấn đê). Hai loại heuristic cho phân mảnh dọc các quan hệ toàn cục là:
- Các yêu cầu thông tin của phân mảnh dọc.
Các thông tin chíng cần cho phân mảnh dọc liên quan đến các ứng dụng. Vì thế, chúng ta bàn về các điều kiện cho các ứng dụng sẽ chạy trên CSDL phân tán. bởi vị phân mảnh dọc đặt vào một mảnh các thuộc tính thường được truy xuất chung với nhau, chúng ta cần có một giá trị đo đạc được nào đó để định nghĩa chính xác hơn về khái niệm "chung với nhau". Số đo này được gọi là ái lực (affinity) của thuộc tính, nó chỉ ra mức độ liên đới giữa các thuộc tính. Nhưng điều không tực tế là chúng ta không thể hy vọng nhà thiết kế hoặc người sử dụng có khả năng mô tả được những giá trị này. Chúng ta sẽ nghiên cứu cách để thu được các giá trị này từ các dữ liệu nguyên thủy hơn.
- Các yêu cầu dữ liệu.
Yêu cầu dữ liệu có liên quan đến các ứng dụng gọi là tần số rtuy xuất access frequency của chúng. Goi Q={q1, q2,… qq} là tập các vấn tin của người dùng (các ứng
dụng) sẽ chạy trên quan hệ R(A1,…An). Thế thì với mỗi câu vấn tin qi và mỗi thuộc tính Aj chúng ta đưa ra một gía trị sử dụng thuộc tính ký hiệu là use(qi, Aj) và được định nghĩa như sau:
Các véc tơ use(qi, A#) cho mỗi ứng dụng rất dễ định nghĩa nếu như nhà thiết kế biết được các ứng dụng sẽ chạy trên CSDL.
Ví dụ 2.15. Giả sử các ứng dụng sau đây chạy trên quan hệ PROJ trong mỗi trường hợp chúng ta đều thẻ hiện bởi SQL.
q1 : Tìm ngân sách của một dự án, cho biết mã số dự án. SELECT BUDGET
FROM PROJ
WHERE PNO = Value
q2 : Tìm tên và ngân sách của mọi dự án. SELECT PNAME, BUDGET
FROM PROJ
q3 : Tìm tên của mọi dự án được thực hiện tại một thành phố đã cho. SELECT PNAME
FROM PROJ
WHERE LOC = Value
q4 : Tìm tổng ngân sách dự án cho mỗi thành phố. SELECT SUM(BUDGET)
FROM PROJ
WHERE LOC = Value
Dựa theo 4 ứng dụng này, chúng ta có thể định nghĩa được giá trị sử dụng thuộc tính. Chúng ta, gọi A1 = PNO, A2 = PNAME, A3 = BUDGET và A4 = LOC. Giá trị sử dụng được định nghĩa dưới dạng ma trận (hình 2.15) trong đó Ô tại (i,j) biểu thị use(qi, Aj).
Giá trị sử dụng thuộc tính không đủ tổng quát để làm cơ sở cho việc tách và phân mảnh. Điều này là do chúng không biểu thị cho độ lớn của tần số ứng dụng (Ai, Aj ) biểu thị cho cầu nối giữa hai thuộc tính của một quan hệ theo cách chúng được các
TS. Lê Huy Thập - IOIT, Vast, Hà Nội 45 use(qi, Aj) =