4. Một số nguyên lý chung của tối ưu hóa truy vấn
2.1. Tối ưu hóa truy vấn
Ở phần này ta sẽ thảo luận về quá trình tối ưu hóa nói chung, bất kể là trong môi trường tập trung hay phân tán. Câu truy vấn cần tối ưu giả thiết là được diễn tả bằng đại số quan hệ trên các quan hệ CSDL (có thể là các mảnh). Tối ưu hóa truy vấn là quá trình sinh ra một chiến lược thực thi truy vấn QEP.
Chiến lược được chọn phải hạ thấp tối đa hàm cho phí. Bộ tối ưu được xem là cấu thành bởi ba thành phần: không gian tìm kiếm (search space), mô hình chi phí (cost model), và chiến lược tìm kiếm (search strategy).
Hình 2. 14 Quá trình tối ưu hóa truy vấn 2.1.1. Không gian tìm kiếm
Không gian tìm kiếm được xem là tập hợp của các chiến lược phương án thực thi truy vấn khác nhau. Để nêu bật các đặc trưng của bộ tối ưu hóa, chúng ta tập trung vào các cây nối (joint tree), là cây toán tử với các phép toán nối hoặc tích Descartes. Lý do là
việc hoán vị thứ tự nối có ảnh hưởng quan trọng nhất đến hiệu năng của các truy vấn quan hệ.
Với N quan hệ, thì ta có O(N!) cây nối tương đương. Việc đánh giá trong một không gian tìm kiếm lớn có thể mất nhiều thời gian có khi còn lớn hơn cả thời gian thực thi thực sự.
Thí dụ 2.15:
SELECT TENNV
FROM NHANVIEN, PHANCONG, DUAN
WHERE NHANVIEN.MSNV=PHANCONG.MSNV
AND PHANCONG.MSDA=DUAN.MSDA Ta có các cây nối tương đương như:
Hình 2. 15 Các cây nối tương đương
Chính vì vậy bộ tối ưu hóa thường tìm cách hạn chế không gian tìm kiếm bằng cách sử dụng các heuristic hay các hạn chế về cây nối. Một số heuristic hay sử dụng là: thực hiện phép chọn, chiếu khi truy xuất đến quan hệ cơ sở, hay việc tránh lấy tích Descartes không được chính câu truy vấn yêu cầu. Trên ví dụ trên thì cây nối cuối cùng (3) không được sử dụng trong không gian tìm kiếm của bộ tối ưu hóa. Các cây nối quan trọng thường được sử dụng là cây tuyến tính, và cây xum xuê. Cây tuyến tính là cây với mỗi nút toán tử có ít nhất một toán hạng là một quan hệ cơ sở. Cây xum xuê thì tổng quát hơn, và có thể có các toán tử không có quan hệ cơ sở làm toán hạng (nghĩa là cả hai toán hạng đều là
các quan hệ trung gian).
Trong cây tuyến tính , kích thước của không gian tìm kiếm được rút gọn lại thành O(2N).
2.1.2. Chiến lược tìm kiếm
Chiến lược tìm kiếm hay được sử dụng là quy hoạch động (dynamic programming), với tính chất đơn định (deterministic). Các chiến lược này xây dựng các phương án thực thi bắt đầu từ các quan hệ cơ sở, nối thêm nhiều quan hệ tại mỗi bước cho đến khi thu dược các phương án khả thi. Chiến lược quy hoạch động xây dựng phương án khả thi theo chiều rộng (breadth first). Còn chiến lược tham ăn thì lại xây dựng cây theo chiều sâu (depth first). Các chiến lượng vét cạn này đảm bảo tìm ra được các phương án khả thi với một chi phí chấp nhận được khi số quan hệ trong câu truy vấn không lớn.
Tuy nhiên cách tiếp cận này có chi phí quá cao khi số quan hệ trong câu truy vấn lớn hơn 5 hoặc 6. Do vậy các nghiên cứu gần đây đang tập trung vào các chiến lược ngẫu nhiên hóa (randomized strategy), các heuristic để làm giảm độ phức tạp của tối ưu hóa với mục tiêu tìm ra phương án khả thi “tốt”.
Hình 2. 17 Hành động của bộ tối ưu hóa khi áp dụng chiến lược đơn định
Trong [Lanzelotte et al.,1993] đã chứng tỏ bằng thực nghiệm rằng các chiến lược ngẫu nhiên hóa có hiệu năng tốt hơn các chiến lược đơn định khi truy vấn có chứa khá nhiều quan hệ. Không giống như các chiến lược đơn định, các chiến lược ngẫu nhiên hóa cho
phép bộ tối ưu hóa đánh đổi thời gian tối ưu hóa với thời gian thực thi. Chẳng hạn chiến lược ngẫu nhiên hóa, như trong Iterative Improvement [Swami,1989] và Simulated Annealing [Ioannidis and Wong, 1987], tập trung vào việc tìm kiếm lời giải tối ưu xung quanh một số điểm đặc biệt nào đó. Chúng không đảm bảo rằng sẽ tìm ra được lời giải tốt
nhất nhưng lại tránh được chi phí quá cao của tối ưu hóa (dựa trên việc tiêu dùng bộ nhớ và thời gian). Trước tiên một hoặc nhiều phương án khởi đầuđược xây dựng bởi một chiến lược
thiển cận. Sau đó thuật toán tìm cách cải thiện các phương án này bằng cách thăm các lân cận (neighbor) của nó. Một lân cận thu được bằng việc biến đổi ngẫu nhiên một phương án.
Hình 2. 18 Hành động của bộ tối ưu hóa khi áp dụng chiến lược ngẫu nhiên
2.1.3. Mô hình chi phí
Mô hình chí 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 tính toán các kích thước kết quả trung gian.
Hàm chi phí:
Tổng chi phí = chi phí xuất nhập + chi phí CPU + chi phí truyền Chi phí CPU = chi phí một lệnh CPU * số lệnh CPU
Chi phí xuất nhập = chi phí của một thao tác xuất nhập đĩa * số lần xuất nhập
Chi phí truyền = chi phí khởi tạo một thông báo * số thông báo + chi phí truyền
một đơn vị dữ liệu * số bytes
Theo những nghiên cứu ban đầu ta thấy trong mạng WAN: Chi phí xử lý cho việc truyền là cao
Chi phí cho xử lý cục bộ là thấp Tỷ số giữa hai tác nhân là 20:1 Trong mạng LAN:
Chi phí cho xử lý truyền và xử lý cục bộ là gần như nhau Tỷ số giữa hai tác nhân này là 1:1,6
Khi thời gian đáp ứng truy vấn là hàm mục tiêu của bộ tối ưu hóa, ta cần phải để ý đến vấn đề xử lý cục bộ song song và truyền song song. Công thức tổng quát của thời gian đáp ứng là:
Thời gian đáp ứng = thời gian xử lý của CPU + thời gian xuất nhập + thời gian
Trong đó:
Thời gian xử lý của CPU = thời gian xử lý một lệnh của CPU * seq_#lệnh
Thời gian xuất nhập = thời gian cho một xuất nhập + seq_#xuất nhập
Thời gian truyền = thời gian khởi tạo một thông báo * seq_#thông báo + thời
gian truyền một đơn vị dữ liệu * seq_#bytes
Với seq_#x (x có thể là các lệnh, các xuất nhập, các thông báo hay các bytes) là số lớn nhất của x phải được thực hiện một cách tuần tự khi thực hiện truy vấn.
Thí dụ 2.16:
Minh họa sự khác nhau giữa tổng chi phí và thời gian đáp ứng, trong đó kết quả được trả lời tại trạm 3, dữ liệu được lấy từ trạm 1 và 2. Để đơn giản chúng ta giả sử rằng chỉ xét đến chi phí truyền
Hình 2. 19 Thí dụ về truyền dữ liệu cho một truy vấn
Giả sử thời gian truyền một đơn vị dữ liệu và thời gian khởi tạo
một thông báo được biểu thị theo đơn vị thời gian, ta có:
Tổng thời gian = 2 * thời gian khởi tạo một thông báo + thời gian truyền một đơn vị dữ liệu *(x+y)
Thời gian đáp ứng = max(thời gian khởi tạo một thông báo + thời gian truyền một đơn vị dữ liệu * x, thời gian khởi tạo một thông báo + thời gian truyền một đơn vị dữ liệu * y)
Thời gian đáp ứng tối thiểu đạt được bằng cách tăng mức độ xử lý song song, tuy nhiên không đồng nghĩa với 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ê cho việc tối ưu
Một tác nhân ảnh hưởng tới hiệu quả hoạt động của chiến lược thực thi là kích thước của các quan hệ trung gian. Chúng ta cần phải ước lượng kích thước của quan hệ trung gian nhằm làm giảm
lượng dữ liệu phải truyền từ trạm này qua trạm khác trong quá trình thực hiện truy vấn. Việc ước lượng này được thực hiện dựa trên các thông số thống kê về 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ả.
Tuy nhiên độ chính xác của các số liệu thống kê càng cao thì chi phí dành cho việc duy trì quản lý chúng càng cao. Với mỗi quan hệ R[ A1, A2,..., An ] được phân mảnh là R1, R2,...,Rr ta có:
Độ dài (số byte) của mỗi thuộc tính là: length( Ai)
Số lượng các giá trị phân biệt (distinct value) của mỗi thuộc tính trong
từng mảnh được ký hiệu: card( A (Rj))
i
Π
Ứng với miền của mỗi thuộc tính có các giá trị lớn nhất và nhỏ nhất:
max(Ai ) và min(Ai )
Với miền của mỗi thuộc tính ta có lực lượng của miền: card(dom [ Ai ])
Số lượng của các bộ trong mỗi mảnh: card( Ri)
Hệ số chọn nối (join selectivity factor) là tỷ lệ các bộ tham gia vào nối, là có giá trị nằm trong khoảng [0…1]:
) ( ) ( ) ( S card R card S R card SFJ ∗ =
Hệ số này càng nhỏ thì độ chọn càng tốt (good selectivity). Và ta cũng có kích thước của một quan hệ R như sau:
size(R) = card(R)*length(R)
Lực lượng của kết quả trung gian
Phần này sẽ trình bày công thức ước lượng lực lượng các kết quả của các toán đại số quan hệ như chọn, chiếu , nối,tích Descartes, … Phép chọn: lực lượng của phép chọn là ) ( ) ( )) ( ( R SF F card R card σF = S ∗ Với : )) ( ( 1 ) ( R card value A SF A S = = Π ) min( ) max( ) max( ) ( A A value A value A SFS − − = > ) min( ) max( ) min( ) ( A A A value value A SFS − − = < )) ( ( * )) ( ( )) ( ) ( ( i j s i S j S p A p A SF p A SF p A SF ∧ = )) ( ( * )) ( ( )) ( ( )) ( ( )) ( ) ( ( i j s i S j S i S j S p A p A SF p A SF p A SF p A SF p A SF ∨ = + −
{ }) ( )*( ({ })
(A value SF A value card value
SFS i∈ = S =
Trong đó các p( Ai ) biểu thị các vị từ trên các thuộc tính Ai
Phép chiếu: Ở đây ta xem như phép chiếu có kèm việc loại bỏ các bộ giống nhau. Một phép chiếu bất kỳ rất khó ước lượng chính xác lực lượng của kết quả trung gian. Tuy nhiên có hai trường hợp đặc biệt có ích nhưng việc ước lượng lại có thể thực hiện dễ dàng. Nếu chiếu của quan hệ R dựa trên một thuộc tính A duy nhất, lực lượng của kết quả trung gian là số bộ thu được khi thực hiện phép chiếu. Nếu một trong các thuộc tính chiếu là khóa thì:
) ( )) ( ( R card R Card ΠA = Tích Descartes: ) ( * ) ( ) (R S card R card S Card × =
Phép nối: Không có phương pháp nào để tính toán lực lượng của nối mà không cần thêm thông tin bổ sung. Trường hợp đặc biệt, khi thực hiện phép nối bằng và A là khóa của quan hệ R, B là khóa ngoại của quan hệ S ta có:
) ( )
(R S card S
card A=B =
Trong trường hợp tổng quát thì ta cần duy trì hệ số chọn nối trong công thức: ) ( * ) ( * ) (R S SF card R card S card = J Phép nối nửa: ) ( * ) . ( ) (R S SF S A card S card <A = SJ
Trong đó hệ số chọn của nối nửa là: ]) ([ ( )) ( ( ) . ( ) ( A dom card S card A S SF S R card A SJ A Π = = <
Khi R.A là khóa ngoại của S (S.A là khóa chính) thì hệ số chọn nối nửa là 1, và ta có lực lượng của nối nửa là card(R) .
Phép hợp: Rất khó ước lượng lực lượng của phép hợp giữa R và S
vì các bộ giống nhau bị loại bỏ trong hợp. Ta sẽ chỉ trình bày công thức tính cận trên và
dưới tương ứng là:
card(R) + card(S)
max(card(R),card(S))
Phép lấy hiệu: cũng tương tự như phép hợp ta cũng tính cận trên và dưới
Cận trên: card (R − S) = card(R) Cận dưới: 0
2.2. Các thuật toán tối ưu hóa truy vấn trong môi trường phân tán
Như đã phân tích trong phần trước, việc sắp xếp các nối là một nội dung quan trọng trong quá trình tối ưu hóa truy vấn tập trung. Việc sắp xếp thứ tự nối trong môi trường phân tán càng quan
trọng hơn, do chi phí cho các thao tác nối trong môi trường phân tán thường rất cao. Hiện thời có hai cách tiếp cận cơ bản để sắp xếp thứ tự các nối được chú ý đến:
Cách thứ nhất là tối ưu hóa trực tiếp dựa trên việc sắp xếp thứ tự nối (Ordering joins)
Cách thứ hai là thay các nối bằng các tổ hợp của nối nửa (Semijoin ordering), nhằm giảm thiểu chi phí truyền dữ liệu.
2.2.1. Các thuật toán dựa trên sắp xếp thứ tự nối(Ordering Joins) (Ordering Joins)
Các thuật toán của hệ INGRES phân tán và System R* là đại diện cho nhóm này. Mục đích của phần này nhằm trình bày các vấn đề của việc sắp thứ tự nối và tạo tiền đề cho phần tiếp theo có sử dụng nối nửa để tối ưu các câu truy vấn phân tán.
Trước khi đi vào vấn đề chính chúng ta đưa ra một số giả thiết như sau:
Câu truy vấn được định vị trên các mảnh, ta dùng thuật ngữ quan hệ để chỉ một mảnh được lưu trữ tại một trạm cụ thể. Tập trung vào việc sắp xếp thứ tự nối, bỏ qua thời gian xử
lý cục bộ.
Chỉ xem xét các câu truy vấn nối mà các toán hạng quan hệ được lưu tại những trạm khác nhau.
Giả sử việc truyền dữ liệu (quan hệ) được truyền theo mỗi
lần một tập (set at a time), chứ không phải mỗi lần một bộ (tuple at a time).
Bỏ qua chi phí truyền tại trạm kết quả.
Ta thử xét câu truy vấn chỉ có hai toán hạng R và S. Quan hệ được lựa chọn để truyền hiển nhiên là quan hệ nhỏ tới trạm chứa quan hệ lớn hơn.
Nếu kích thuớc(R) < kích thuớc(S)
R S
Nếu kích thuớc(R) > kích thuớc(S)
Kích thuớc (R)=|R|*dộ dài theo byte của một bộ của R
Hình 2. 22 Truyền các toán hạng trong phép toán hai ngôi
Với trường hợp có hơn hai quan hệ kết nối, cũng giống như trên, mục đích của thuật toán sắp xếp thứ tự kết nối là để truyền các quan hệ nhỏ. Vấn đề nảy sinh là các kết nối có thể làm giảm hoặc tăng kích thước của các quan hệ trung gian, do vậy việc đánh giá/ước lượng kích thước kết quả nối là điều bắt buộc, nhưng cũng rất khó khăn. Một giải pháp được đưa ra là ước lượng chi phí
truyền của tất cả các phương án, chiến lược rồi chọn ra một chiến lược tốt nhất. Tuy nhiên số các phương án, chiến lược tăng nhanh khi số các quan hệ tăng, nên người ta thường sử dụng heuristic để loại trừ một số trường hợp xấu.
Thí dụ 2.19:
Xét câu truy vấn sau dưới dạng đại số quan hệ:
DUAN MSDA PHANCONGMSNV NHANVIEN
Ta có đồ thị nối tương ứng trong hình 2.22
Hình 2. 23 Đồ thị nối của câu truy vấn phân tán
Với giả thiết vị trí của ba quan hệ như trên, ta có thể thực hiện câu truy vấn này bằng năm cách khác nhau:
1. NHANVIEN → trạm 2. Tại 2 tính toán NHANVIEN ' =
NHANVIEN PHANCONG . Truyền NHANVIEN ' →trạm 3. Tại trạm 3 tính toán NHANVIEN ' DUAN
2. PHANCONG → trạm 1.
Tại trạm 1 tính toán NHANVIEN ' = NHANVIEN
PHANCONG . Truyền
NHANVIEN ' → trạm 3. Tại trạm 3 tính toán NHANVIEN '
DUAN
3. PHANCONG → trạm 3.
Tại 3 tính toán PHANCONG ' = PHANCONG DUAN . Truyền PHANCONG ' → trạm 1.
Tại trạm 1 tính toán PHANCONG ' NHANVIEN
4. DUAN → trạm 2. Tại 2 tính toán DUAN ' = DUAN
PHANCONG .
Truyền n DUAN ' → trạm 1. Tại trạm 1 tính toán DUAN '
NHANVIEN
5. NHANVIEN → trạm 2. DUAN → trạm 2.
Tại 2 tính NHANVIEN DUAN PHANCONG .
size(NHANVIEN) , size(PHANCONG) , size(DUAN) , size(NHANVIEN
PHANCONG) , size(PHANCONG DUAN) . Nếu ta quan tâm đến thời gian đáp ứng thì nên xét phương án 5, do khả năng truyền song song.
Nếu sử dụng heurisctic, với giả thiết lực lượng của các nối được tạo ra là tích của các lực lượng, trong trường hợp này các quan hệ