Tải bản đầy đủ (.doc) (51 trang)

Algorithms for Query Processing and Optimization

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (690.97 KB, 51 trang )

MỤC LỤC

1.CƠ SỞ LÝ THUYẾT CỦA ĐỀ TÀI...............................................................................3
Phần 1.1. Giới thiệu tổng quan về xử lý truy vấn............................................................3
Phần 1.2. Chuyển các truy vấn sang đại số quan hệ (Relational Algebra)......................4
Phần 1.3. Các thuật toán sắp xếp ngoại (External Sorting).............................................7
Phần 1.4. Giải thuật về phép chọn (SELECT Operation) và phép kết (JOIN Operation)9
Phần 1.5. Giải thuật về phép chiếu (PROJECT Operation) và toán tử tập hợp (SET
Operation)..................................................................................................................... 13
Phần 1.6. Các tốn tử tích hợp (Aggregate Operation) và phép kết OUTER (OUTER
JOIN)............................................................................................................................ 15
Phần 1.7. Sử dụng Pipelining........................................................................................18
Phần 1.8. Tối ưu hóa truy vấn dùng Heuristic...............................................................19
Phần 1.9. Tối ưu hóa truy vấn dùng phương pháp chọn và ước lượng chi phí
( Selectivity and Cost Estimates)..................................................................................27

2. TÌM HIỂU PHƯƠNG PHÁP TỐI ƯU DỰA VÀO CÔNG CỤ ƯỚC LƯỢNG CHI PHÍ
(Cost-based Optimizer - CBO) TRONG ORACLE..........................................................35

Phần 2.1. Công cụ tối ưu dựa vào ước lượng chi phí (Cost-based Optimizer - CBO)
trong Oracle..................................................................................................................35
Phần 2.2. Các yếu tố ảnh hưởng đến ước lượng chi phí trong Oracle...........................43
Phần 2.3. Thực nghiệm.................................................................................................47
Phần 2.4. Các vấn đề của tối ưu dựa vào ước lượng chi phí..........................................48
Phần 2.5. Kết luận.........................................................................................................48
Phần 2.6. Hướng phát triển...........................................................................................48
TÀI LIỆU THAM KHẢO................................................................................................48

[Algorithms for Query Processing and Optimization]

LỜI MỞ ĐẦU



Lời nói đầu tiên, nhóm thực hiện đề tài gửi lòng biết ơn sâu sắc cùng lời cảm ơn chân
thành đến thầy PGS.TS. Đặng Trần Khánh vì đã hướng dẫn chúng tơi hồn thành khóa
học này với những kiến thức bổ ích liên quan đến mơn học cơ sở dữ liệu nâng cao. Những
kiến thức này góp phần làm nền tảng cho chúng tôi không chỉ trong tư duy làm việc mà
cịn thực sự hữu ích cho những nghiên cứu chuyên sâu hơn trong tương lai và khi thực
hiện tìm hiểu vấn đề tối ưu hóa câu truy vấn trong DBMS thông đề tài môn học
Algorithms for Query Processing and Optimization thì chúng tơi càng hiểu rõ hơn kiến
thức mà thầy đã hướng dẫn.

Chúng tôi trân trọng gửi lời chúc sức khỏe đến thầy và mong rằng thầy luôn vui khỏe
để tiếp tục hướng dẫn tận tình các khóa học sau.

Chúng tôi chân thành cảm ơn.
Nhóm thực hiện đề tài.

Group 4 Trang 2

[Algorithms for Query Processing and Optimization]

1.CƠ SỞ LÝ THUYẾT CỦA ĐỀ TÀI

Phần 1.1. Giới thiệu tổng quan về xử lý truy vấn
Tối ưu hóa câu truy vấn là tiến trình lựa chọn kế hoạch thực thi (Execution Plan) câu

truy vấn một cách hiệu quả nhất, nghĩa là ít tốn tài nguyên nhất và trả ra kết quả nhanh
nhất. Trong phần báo cáo này, nhóm sẽ thảo luận về các kỹ thuật được sử dụng bên trong
một DBMS để xử lý, tối ưu hóa, và thực thi các truy vấn mức cao. Một truy vấn thể hiện
bởi một ngôn ngữ truy vấn mức cao như SQL đầu tiên phải được quét, phân tích, và xác
nhận hợp lệ.


Các bước xử lý câu truy vấn cấp cao như sau:

Hình 1
Bước 1 (Scanning, Parsing, validating)

1. Bộ quét (scanner) xác định các thẻ (token) truy vấn, như các từ khóa SQL, tên
thuộc tính, và mối quan hệ - xuất hiện trong các truy vấn

Group 4 Trang 3

[Algorithms for Query Processing and Optimization]

2. Bộ phân tích cú pháp (parser) dùng để kiểm tra cú pháp truy vấn để xác định các
quy tắc cú pháp (quy tắc ngữ pháp) của ngôn ngữ truy vấn.

3. Bộ xác nhận hợp lệ (validated) dùng để kiểm tra tên thuộc tính, tên quan hệ trong
lược đồ có được khai báo khơng và các mối quan hệ có hợp lệ (nghĩa là không
nhập nhằng giữa các thuộc tính và kiểu dữ liệu dùng để so sánh có hợp lệ khơng )
và có ý nghĩa trong lược đồ của cơ sở dữ liệu cụ thể được truy vấn.

4. Thể hiện lại câu truy vấn biểu diễn bên trong bằng một cấu trúc dữ liệu gọi là cây
truy vấn (query tree) hoặc đồ thị truy vấn (query graph).

Bước 2 (Query Optimizer): DBMS đề ra kế hoạch thực hiện câu truy vấn phù hợp nhất
trong các chiến lược thực thi. Tiến trình này gọi là tối ưu hóa câu truy vấn.

Bước 3 (Query Code Generator) : Bộ phát sinh mã sẽ cho ra mã để thực thi câu truy vấn
theo chiến lược vừa được chọn.


Bước 4 (Runtime Database Processor) : Thực hiện mã đã phát sinh. Nếu có lỗi thực thi
xảy ra thì bộ phận này sẽ báo lỗi.

Thuật ngữ tối ưu hóa thực sự gây nhầm lẫn vì trong một số trường hợp việc lựa chọn
kế hoạch thực thi không phải là tối ưu (hoặc tốt nhất) mà chỉ là chiến lược hợp lý để thực
hiện các truy vấn. Việc tìm kiếm các chiến lược tối ưu thường là quá trình tốn thời gian.
Ngồi ra, để tìm chiến lược thực thi tối ưu có thể cần tới thơng tin chi tiết về cách cài đặt
các tập tin thậm chí cả về nội dung của các tập tin – là những thơng tin có thể khơng
hồn tồn có sẵn trong các danh mục của một DBMS. Do đó, kế hoạch của một chiến
lược thực thi tốt là khái niệm mô tả chính xác hơn so với thuật ngữ tối ưu hóa truy vấn.

Phần 1.2. Chuyển các truy vấn sang đại số quan hệ (Relational Algebra)
Trong thực tế, SQL là ngôn ngữ truy vấn được sử dụng trong hầu hết các RDBMS

thương mại. Một câu truy vấn SQL trước tiên phải được dịch sang một biểu thức đại số
quan hệ mở rộng tương đương, được biểu diễn bởi cấu trúc dữ liệu cây, và sau đó được
tối ưu hóa. Thơng thường, các câu truy vấn SQL được phân rã thành các khối truy vấn
(query block), là các đơn vị cơ bản có thể chuyển sang các tốn tử đại số và được tối ưu

Group 4 Trang 4

[Algorithms for Query Processing and Optimization]

hóa. Một khối truy vấn chứa một mệnh đề SELECT-FROM-WHERE đơn, cũng như
mệnh đề GROUP BY và HAVING nếu chúng là một phần của khối. Do đó, các truy vấn
lồng nhau trong một câu truy vấn được xác định như các khối truy vấn riêng biệt. Vì SQL
gồm cả các toán tử gộp như MAX, MIN, SUM và COUNT - các toán tử này cũng được
gộp trong đại số mở rộng.

Hình 2 dưới đây cho ta thấy các query block gồm outer block (khối truy bên ngoài) và

inner block (khối truy vấn bên trong)

Hình 2 Trang 5
Xem xét câu truy vấn SQL trên quan hệ EMPLOYEE như sau:

SELECT Lname, Fname
FROM EMPLOYEE
WHERE Salary > ( SELECT MAX (Salary)
FROM EMPLOYEE
Group 4 WHERE Dno=5 );

[Algorithms for Query Processing and Optimization]

Truy vấn này lấy ra tên của các nhân viên (từ bất kỳ phịng ban nào trong cơng ty) những
người có mức lương cao hơn mức lương cao nhất trong phòng 5. Truy vấn gồm một truy
vấn con lồng nhau và do đó sẽ được phân rã thành hai khối. Khối bên trong là:

( SELECT MAX (Salary)
FROM EMPLOYEE
WHERE Dno=5 )
Câu truy vấn này tìm những người có lương cao nhất trong phịng 5. Khối truy vấn ngoài
là:
SELECT Lname, Fname
FROM EMPLOYEE
WHERE Salary > c
trong đó c đại diện cho các kết quả trả về từ khối bên trong. Khối bên trong có thể được
chuyển sang biểu thức đại số quan hệ mở rộng sau:
MAX Salary(σDno=5(EDno=5(EMPLOYEE))
và khối bên ngoài được chuyển sang biểu thức:


πLname,Fname(σDno=5(ESalary>c(EMPLOYEE))

Bộ tối ưu truy vấn (Query Optimizer) sau đó sẽ chọn một kế hoạch thực thi (Execution
Plan ) cho mỗi khối truy vấn. Chú ý rằng trong ví dụ trên, các khối bên trong được đánh
giá chỉ một lần để tạo ra mức lương tối đa của nhân viên trong phịng 5, sau đó được sử
dụng như hằng số c – bởi khối bên ngoài. Chúng được gọi là truy vấn lồng (khơng có
tương quan với các truy vấn bên ngồi). Tối ưu hóa sẽ khó thực hiện hơn đối với các truy
vấn lồng nhau có tương quan phức tạp hơn, trong đó một bộ từ khối truy vấn bên ngoài
xuất hiện trong mệnh đề WHERE của khối truy vấn bên trong.

Group 4 Trang 6

[Algorithms for Query Processing and Optimization]

Phần 1.3. Các thuật toán sắp xếp ngoại (External Sorting)
Sắp xếp là một trong những thuật tốn chính được sử dụng trong xử lý truy vấn. Ví dụ,

bất kì khi nào một truy vấn SQL chỉ ra một mệnh đề ORDER BY, kết quả truy vấn phải
được sắp xếp. Sắp xếp cũng là một thành phần quan trọng trong các thuật toán sắp xếp
trộn được sử dụng cho phép toán JOIN và các toán tử khác (như UNION và
INTERSECTION), và các thuật toán loại bỏ trùng lặp đối với các phép toán PROJECT
(khi một truy vấn SQL có từ khóa DISTINCT trong mệnh đề SELECT) nhưng nếu tập tin
được đánh chỉ mục thích hợp, việc sắp xếp sẽ khơng cần thiết - ví dụ như đánh chỉ mục
chính hoặc chỉ mục gom nhóm trên các thuộc tính mong muốn của tập tin để cho phép
truy cập có thứ tự các bản ghi của tập tin. Sắp xếp ngoài đề cập đến các thuật tốn sắp xếp
thích hợp cho các tập tin có số lượng bản ghi lớn lưu trữ trên đĩa mà các bản ghi này
khơng thể lưu trong bộ nhớ chính, ví dụ như các tập tin cơ sở dữ liệu.

Thuật tốn sắp xếp ngồi điển hình sử dụng chiến lược sắp xếp trộn( Merge Sort) là
phương pháp sắp xếp bắt đầu từ những tập tin con của tập tin chính - được gọi là run –và

sau đó trộn các run đã sắp xếp, tạo ra những tập tin sắp xếp lớn hơn, sau đó được trộn lần
lượt. Thuật toán sắp xếp trộn, giống như các thuật tốn cơ sở dữ liệu khác, địi hỏi khơng
gian đệm trong bộ nhớ chính, nơi mà sự sắp xếp và trộn run được thực hiện.Thuật toán cơ
bản bao gồm hai giai đoạn:

+ Giai đoạn sắp xếp (Sorting Phase)

+ Giai đoạn trộn. (Merging Phase)

Khơng gian đệm trong bộ nhớ chính là một phần của bộ nhớ cache DBMS - một phân
vùng trong bộ nhớ chính của máy tính được điều khiển bởi các DBMS. Không gian đệm
chia thành các bộ đệm riêng rẽ, trong đó mỗi bộ đệm có cùng kích thước tính theo byte
bằng kích thước của một khối đĩa. Vì vậy, một bộ đệm có thể chứa nội dung đầy đủ của
một khối đĩa.

Trong giai đoạn sắp xếp, các run (phần hoặc mảnh) của tập tin có kích thước phù hợp
với vùng khơng gian bộ đệm được đọc vào bộ nhớ chính, sử dụng một thuật toán sắp xếp
nội để sắp xếp, và ghi trở lại vào đĩa như là các tập tin con đã được sắp xếp tạm thời (hoặc

Group 4 Trang 7

[Algorithms for Query Processing and Optimization]

là các run). Kích thước của mỗi run và số các run ban đầu (nR) được quyết định bởi số
lượng các khối (b) và khơng gian bộ đệm có sẵn (nB). Ví dụ, kích thước bộ đệm trong bộ
nhớ chính nB = 5 khối đĩa và kích thước của tập tin b = 1024 khối đĩa, khi đó
nR =é(b / nB)ù hoặc 205 run ban đầu mỗi run có kích thước 5 khối (trừ run cuối cùng sẽ
chỉ có 4 khối). Do đó, sau giai đoạn này, 205 run đã sắp xếp (hay 205 tập con của tập tin
ban đầu được sắp xếp) và được lưu như những tập con tạm thời trên đĩa.


Trong giai đoạn trộn, các run đã sắp xếp được trộn trong một hoặc nhiều chuyến trộn.
Mỗi chuyến trộn có thể có một hoặc nhiều bước trộn. Độ trộn (degree of merging - dM) là
số lượng các tập con đã sắp xếp có thể được trộn trong mỗi bước. Trong mỗi bước trộn,
cần một khối đệm để lưu một khối đĩa từ mỗi tập con đã sắp xếp được trộn, và một bộ
đệm bổ sung cần thiết để chứa một khối đĩa của các kết quả hợp nhất, mà sẽ tạo ra một tập
tin được sắp xếp lớn hơn đó là kết quả của việc trộn một số các tập tin con nhỏ hơn. Do
đó, dM nhỏ hơn (nB -1) và nR, và số các chuyến trộn là é(logdM (nR)ù . Trong ví dụ ở
trên nB = 5, dM = 4 (trộn bốn đường), vì vậy 205 run đã sắp xếp ban đầu sẽ được trộn
theo từng 4 run trong mỗi bước tạo thành 52 tập con lớn hơn đã sắp xếp tại cuối chuyến
trộn đầu tiên. 52 tập con này lại được trộn theo 4 đường tạo thành 13 tập con được sắp
xếp, được trộn tiếp thành 4 tập tin được sắp xếp. Cuối cùng 4 tập tin này được trộn vào 1
tập tin được sắp xếp đầy đủ, có nghĩa là sau 4 chuyến trộn chúng ta đã sắp xếp xong tập
tin ban đầu.

Sau đây là mã giả của thuật toán sắp xếp ngoại:

set i←←1; ←1;1;

j ←←1; b; {size of the file in blocks}

k ←←1;nB; {size of buffer in blocks}

m ←←1;éj/k)ù;

{Sorting Phase}

while (i ≤←1;m)

do {


read next k blocks of the file into the buffer or if there are less than k

blocks

remaining, then read in the remaining blocks;

sort the records in the buffer and write as a temporary subfile;

i ←←1; i + 1;

Group 4 Trang 8

[Algorithms for Query Processing and Optimization]

}

{Merging Phase: merge subfiles until only 1 remains}

set i ←1←1; ;

p ←←1;élogk–1mù {←1; p is the number of passes for the merging

phase}

j ←←1;m;

while (i ≤←1;p)

do {


n ←1←1; ;

q ←←1; éj/(k–1)ù; {number of subfiles to write in this pass}

while (n ≤←1;q)

do {

read next k–1 subfiles or remaining subfiles (from previous

pass)

one block at a time;

merge and write as new subfile one block at a time;

n ←←1;n + 1;

}

j ←1; ← q;

i ←←1;i + 1;

}

Phần 1.4. Giải thuật về phép chọn (SELECT Operation) và phép kết (JOIN
Operation)

Phần 1.4.1. Giải thuật về phép chọn (SELECT Operation)

Có rất nhiều giải thuật để thực hiện phép chọn, mà về cơ bản là một hoạt động tìm

kiếm để xác định vị trí các bản ghi trong một tập tin trên đĩa đáp ứng một điều kiện nhất
định. Một số thuật tốn tìm kiếm phụ thuộc vào các tập tin có đường dẫn truy cập cụ thể,
và họ có thể chỉ áp dụng cho một số loại lựa chọn theo điều kiện nhất định nào đó.

Ví dụ : các điều kiện chọn sau đây sử dụng cho các phép chọn được giải thích bên
dưới:

 (OP1):  SSN='123456789' (EMPLOYEE)
 (OP2):  DNUMBER>5(DEPARTMENT)
 (OP3):  DNO=5(EMPLOYEE)
 (OP4):  DNO=5 AND SALARY>30000 AND SEX=F(EMPLOYEE)
 (OP5):  ESSN=123456789 AND PNO=10(WORKS_ON)

Group 4 Trang 9

[Algorithms for Query Processing and Optimization]

Khi thực hiện phương pháp tìm kiếm (Search Method) cho phép chọn đơn (Simple
Selection) ta có nhiều giải thuật cho phép chọn như sau:
+ Giải thuật S1 – Tìm kiếm tuyến tính (giải thuật brute force): Lấy tất cả các bản ghi
(record) trong tập tin, và kiểm tra xem giá trị thuộc tính của nó thỏa mãn điều kiện lựa
chọn. Kể từ khi hồ sơ được nhóm lại thành các khối đĩa, mỗi khối đĩa được đọc vào một
bộ nhớ đệm chính, và sau đó tìm kiếm thông qua các hồ sơ trong khối đĩa được thực hiện
trong bộ nhớ chính. Nghĩa là đọc từng mẫu tin và kiểm tra giá trị thuộc tính có thỏa điều
kiện chọn hay khơng.
+ Giải thuật S2 – Tìm kiếm nhị phân: nếu điều kiện chọn là phép so sánh bằng trên thuộc
tính khóa dùng để sắp xếp file, lúc này sử dụng tìm kiếm nhị phân sẽ hiệu quả hơn tìm
kiếm tuyến tính.

Ví dụ : trong (OP1) nếu thuộc tính SSN là thuộc tính cần kiểm tra điều kiện trong lược đồ
quan hệ EMPLOYEE.
+ Giải thuật S3a – Dùng chỉ mục chính (Primary Index): để đọc mẫu tin nếu điều kiện
chọn là so sánh bằng trên thuộc tính khóa đã khai báo là Primary Index.
Ví dụ: điều kiện SSN = '123456789' trong (OP1) sử dụng các Primary Index để lấy bản
ghi. Lưu ý rằng điều kiện này lấy một bản ghi đơn.
+ Giải thuật S3b – Dùng Hash Key: để đọc mẫu tin nếu điều kiện chọn là so sánh bằng
trên thuộc tính khóa đã khai báo là Hash Key.
Ví dụ: điều kiện SSN = '123456789 ' trong (OP1) - sử dụng khóa băm để lấy bản ghi
+ Giải thuật S4 – Dùng Primary Index để tìm nhiều mẫu tin: nếu điều kiện chọn là so
sánh >, >=, < hay <= trên các trường khóa được khai báo là Primary Index thì dùng chỉ
mục để tìm kiếm điều kiện =, sau đó tìm thêm các mẫu tin thỏa điều kiện khơng bằng.

Ví dụ: điều kiện Dnumber > 5 trong (OP2) thì dùng chỉ mục để tìm kiếm thơng qua so
sánh bằng (Dnumber = 5), sau đó lấy tất cả bản ghi tiếp theo trong file (đã được sắp xếp).
Đối với điều kiện Dnumber <5 thì ta lấy tất cả các bản ghi trước đó.

Group 4 Trang 10

[Algorithms for Query Processing and Optimization]

+ Giải thuật S5 – Dùng chỉ mục gom cụm (Clustering Index) tìm nhiều mẫu tin: nếu
điều kiện chọn là so sánh bằng trên các trường khơng khóa và có khai báo Clustering
Index.
Ví dụ: điều kiện Dno = 5 trong (OP3) sử dụng các chỉ mục để lấy tất cả các bản ghi thỏa
điều kiện.
+ Giải thuật S6 – Dùng chỉ mục phụ (Secondary Index - (B+-tree)) trên điều kiện chọn
là so sánh bằng để tìm bản ghi nếu trường đánh chỉ mục là khóa hay tìm nhiều bản ghi
nếu trường đánh chỉ mục khơng là khóa. Cách này cũng có thể dùng để tìm kiếm với các
điều kiện chọn không phải là so sánh bằng.


Khi thực hiện phương pháp tìm kiếm (Search Method) cho phép chọn phức
(Complex Selection) với nhiều điều kiện nối nhau bởi tốn tử AND ta cũng có nhiều giải
thuật cho phép chọn như sau:
+ Giải thuật S7 – phép chọn nối tiếp (Conjunctive selection) sử dụng từng chỉ mục riêng
lẽ (Individual Index): nếu một thuộc tính mà có liên quan đến bất kỳ điều kiện đơn duy
nhất nào trong điều kiện chọn nối tiếp mà có một đường dẫn truy cập cho phép việc sử
dụng một trong những phương pháp S2 hay S6, ta sử dụng điều kiện để lấy các bản ghi và
sau đó kiểm tra xem mỗi bản ghi lấy được đó có đáp ứng các điều kiện đơn cịn lại trong
điều kiện chọn nối tiếp hay khơng.

+ Giải thuật S8 – phép chọn nối tiếp sử dụng chỉ mục phức hợp (Composite Index): nếu
hai hay nhiều thuộc tính có liên quan đến điều kiện so sánh bằng trong phép chọn nối tiếp
và một chỉ mục phức hợp (hoặc cấu trúc băm) tồn tại trong các trường kết hợp.
Ví dụ: nếu một chỉ mục đã được tạo ra trên khóa phức hợp (Essn, PNO) của lược đồ quan
hệ WORK_ON trong phép chọn (OP5) bên trên thì lúc này chúng ta có thể sử dụng chỉ
mục trực tiếp vào đó.

+ Giải thuật S9 – phép chọn nối tiếp bằng cách giao các con trỏ bản ghi:

 Phương pháp này được sử dụng nếu những chỉ mục phụ (secondary index)

đang được đánh trên tất cả (hoặc một số) các trường mà có liên quan đến điều

Group 4 Trang 11

[Algorithms for Query Processing and Optimization]

kiện chọn so sánh bằng trong phép chọn nối tiếp và nếu các chỉ mục bao gồm
các con trỏ bản ghi (chứ không phải là những con trỏ khối).


 Mỗi chỉ mục có thể được sử dụng để lấy các con trỏ bản ghi thoả mãn điều kiện

từng chỉ mục tiêng lẽ của nó.

 Giao của những bộ con trỏ bản ghi cho ta các con trỏ bản ghi thoả mãn điều

kiện nối tiếp, mà sau đó được sử dụng để lấy các bản ghi trực tiếp.

 Nếu chỉ có một số điều kiện có chỉ số phụ, mỗi bản ghi lấy được tiếp tục thử

nghiệm để xác định xem có đủ các điều kiện cịn lại theo yêu cầu không

 Bất cứ khi nào một điều kiện chọn đơn quy định cụ thể cho phép chọn, ta chỉ có

thể kiểm tra xem rằng có một đường dẫn truy cập tồn tại trên các thuộc tính liên
quan đến điều kiện đó khơng. Nếu một đường dẫn truy cập tồn tại, phương
pháp tương ứng với đường dẫn truy cập sẽ được sử dụng, nếu không thì dùng
phương pháp tìm kiếm tuyến tính S1. Trong ví dụ OP1, OP2 và OP3 ta thấy rõ
điều này.

 Đối với những điều kiện chọn nối tiếp, bất cứ khi nào có nhiều hơn một trong

các thuộc tính liên quan đến các điều kiện có một đường dẫn truy cập, tối ưu
hóa truy vấn nên được thực hiện để lựa chọn con đường truy cập mà có thể lấy
các ít nhất các bản ghi là hiệu quả nhất.

Bên cạnh đó ta cịn có các điều kiện chọn rời rạc (Disjunctive Selection Conditions):
So với một điều kiện lựa chọn nối tiếp, một điều kiện tách rời (điều kiện đơn giản được
kết nối bởi các liên kết hoặc hợp lý hơn là AND) là khó khăn hơn nhiều để xử lý và tối ưu

hóa.

Ví dụ: ta có điều kiện chọn (OP4):  DNO=5 AND SALARY>30000 AND SEX=F(EMPLOYEE)

Sự tối ưu có thể được thực hiện trong (OP4), bởi vì các bản ghi đáp ứng các điều kiện
tách rời là sự kết hợp của các bản ghi đáp ứng các điều kiện cá nhân. Do đó, nếu có một
trong các điều kiện khơng có một đường dẫn truy cập, ta bắt buộc phải sử dụng phương
pháp S1 – Tìm kiếm tuyến tính ( Brute – Force). Chỉ trong trường hợp một đường dẫn
truy cập tồn tại trên tất cả các điều kiện đơn trong sự tách rời thì chúng ta có thể tối ưu

Group 4 Trang 12

[Algorithms for Query Processing and Optimization]

các lựa chọn bằng cách lấy các bản ghi đáp ứng từng điều kiện hoặc từng định danh (Id)
của chúng và sau đó áp dụng các tốn tử hợp để loại bỏ các bản ghi trùng.

Phần 1.4.2. Giải thuật về phép kết (JOIN Operation)
Phép kết (JOIN Operation ) là một trong những toán tử tốn nhiều thời gian nhất trong

xử lý câu truy vấn. Thường người ta khuyến khích dùng phép kết dạng EQUIJOIN và

NATURALJOIN. Ta thảo luận phép kết có dạng

Các giải thuật thực thi phép kết:

+ Giải thuật J1 – Nested loop join (or nested - block join): đối với từng bản ghi t tron
quan hệ R, sau đó tìm từng bản ghi s trong quan hệ S và kiểm tra xem hai bản ghi có thỏa

tính chất .


+ Giải thuật J2 – Single-loop join (sử dụng một cấu trúc truy cập để lấy các bản ghi phù
hợp): đối với từng bản ghi t trong R, ta dùng cấu trúc chỉ mục (hay khóa băm) truy cập
trực tiếp lên bản ghi thỏa điều kiện trong phép kết với quan hệ S.

+ Giải thuật J3 – Sort merge join: nếu bản ghi trong quan hệ R và S đều được sắp xếp
vật lý trên hai thuộc tính A, B thì phép kết sẽ rất hiệu quả, ngược lại nếu không được sắp
xếp cả hai thuộc tính trên trước thì cả hai tập tin được duyệt theo thuộc tính kết, so trùng
các bản ghi cùng giá trị A và B.

+ Giải thuật J4 – Hash Join ( kết băm): dùng một hàm băm để ánh xạ các bản ghi của
quan hệ R vào các bucket Ri dựa vào các giá trị của thuộc tính A. Các bản ghi của quan hệ
S cũng được ánh xạ vào các bucket Si. Các Ri và Si được duyệt qua để tổ hợp các bộ thuộc
Hi và Si thỏa điều kiện kết.

Group 4 Trang 13

[Algorithms for Query Processing and Optimization]

Phần 1.5. Giải thuật về phép chiếu (PROJECT Operation) và toán tử tập hợp (SET
Operation)

Phần 1.5.1. Giải thuật về phép chiếu (PROJECT Operation)
Một toán tử chiếu π <attribute list> (R) là đơn giản để lấy một danh sách các thuộc tính

<attribute list> bao gồm của quan hệ R. Phép chiếu thực hiện có hai trường hợp sau đây:

+ Nếu danh sách thuộc tính có chứa khóa của quan hệ R thì số bộ (tuple) trả về
quan hệ kết quả sẽ bằng số bộ của quan hệ R ban đầu.


+ Nếu danh sách thuộc tính khơng chứa khóa của quan hệ R thì số bộ dữ liệu trùng
lặp phải được loại bỏ. Điều này có thể được thực hiện bằng cách phân loại các kết quả của
phép tốn và sau đó loại bỏ các bộ dữ liệu trùng lặp xuất hiện liên tiếp sau khi phân loại.
Ta sắp xếp kết quả rồi loại bỏ những bộ trùng lặp ra. Ngồi ra, phép băm cũng có thể
được sử dụng để loại bỏ các trùng lặp, khi mỗi bản ghi được băm và đưa vào một bucket
của tập tin băm trong bộ nhớ, nó được kiểm tra đối với các bản ghi đã có trong các
bucket, nếu nó là một bản trùng lặp, nó khơng được đưa vào trong bucket. Nó rất hữu ích
để xóa bỏ trong các câu truy vấn, mặc định không phải là để loại bỏ các bản trùng lặp từ
các kết quả truy vấn, bản trùng lặp được loại bỏ từ các kết quả truy vấn chỉ khi các từ
khóa DISTINCT được đưa vào.

Phần 1.5.2. Giải thuật về toán tử tập hợp (SET Operation)
Các phép toán trên tập hợp như phép hội (UNION), phép giao (INTERSECTION),

phép hiệu (SET DIFFERENCE) và phép tích Đề-các (CARTESIAN PRODUCT) sẽ tốn
nhiều chi phí khi thực hiện.

Đặc biệt, phép tốn tích Đề-các R × S là khá tốn kém bởi vì kết quả của nó bao gồm
một bản ghi cho mỗi sự kết hợp của các bản ghi từ quan hệ R và quan hệ S. Ngoài ra, mỗi
bản ghi trong kết quả bao gồm tất cả các thuộc tính của R và S. Nếu R có n bản ghi và có
j thuộc tính, và S có m bản ghi và k thuộc tính, quan hệ kết quả của R × S sẽ có (n * m)
bản ghi và mỗi bản ghi sẽ có (j + k) thuộc tính. Do đó, điều quan trọng là ta phải tránh
phép tốn tích Đề các và thay thế các phép toán khác như kết trong q trình tối ưu hóa
truy vấn nếu có thể.

Group 4 Trang 14

[Algorithms for Query Processing and Optimization]

Ba phép toán tập hợp khác là phép hội, phép giao, phép hiệu thì địi hỏi hai quan hệ

phải khả hợp (nghĩa là áp dụng cho quan hệ tương thích về kiểu, có cùng một số thuộc
tính và các miền thuộc tính tương tự) và thường được cài đặt bằng cách sắp xếp nó theo
cùng một thuộc tính, sau đó bằng một phép duyệt đơn giản lên hai quan hệ cũng đủ tạo ra
quan hệ kết quả.

Ngồi ra, phép băm cũng có thể được sử dụng để thực hiện UNION,
INTERSECTION, và SET DIFFERENCE. Một bảng đầu tiên được quét và sau đó phân
chia thành một bảng băm trong bộ nhớ với các bucket, và các bản ghi trong bảng khác
sau đó được quét tại một thời điểm và được sử dụng để thăm dị các phân vùng thích hợp.
Ví dụ:
+ Để thực hiện R  S, băm đầu tiên (phân vùng) các bản ghi của R, sau đó băm (thăm dị)
các bản ghi của S, nhưng không chèn các bản ghi trùng lặp trong bucket.
+ Để thực hiện R  S, phân vùng đầu tiên các bản ghi của R thành các tập tin băm. Sau
đó trong khi băm mỗi bản ghi của S, thăm dò để kiểm tra xem một bản ghi giống hệt nhau
từ R được tìm thấy trong bucket, và nếu có thêm các bản ghi vào tập tin kết quả.
+ Để thực hiện R - S, đầu tiên băm các hồ sơ của R thành các bucket tập tin băm. Trong
khi băm (thăm dò) mỗi bản ghi của S, nếu một bản ghi giống hệt nhau được tìm thấy
trong các bucket, loại bản ghi từ bucket.

Phần 1.6. Các tốn tử tích hợp (Aggregate Operation) và phép kết OUTER (OUTER
JOIN)

Phần 1.6.1. Các tốn tử tích hợp (Aggregate Operation)
Các toán tử tổng hợp (MIN, MAX, COUNT, AVERAGE, SUM), khi áp dụng cho

toàn bộ một quan hệ, có thể được tính bằng một bảng qt (table scan) hoặc bằng cách sử
dụng một chỉ mục thích hợp nếu có. Ví dụ, hãy xem xét câu truy vấn sau đây:

SELECT MAX(Salary)
FROM EMPLOYEE


Group 4 Trang 15

[Algorithms for Query Processing and Optimization]

Nếu một chỉ mục theo dạng B+-tree tăng dần được đánh trên thuộc tính Salary trong
quan hệ EMPLOYEE, sau khi tối ưu có thể quyết định việc sử dụng các chỉ mục trên
thuộc tính Salary để tìm kiếm các giá trị lớn nhất (MAX) trong chỉ mục, duyệt theo con
trỏ bên phải cùng trong mỗi nút chỉ mục từ gốc đến lá ngồi cùng bên phải. Nút đó sẽ bao
gồm giá trị lớn nhất của thuộc tính Salary. Trong hầu hết các trường hợp, điều này sẽ hiệu
quả hơn một bảng quét đầy đủ trong quan hệ EMPLOYEE, vì khơng có bản ghi thực cần
được lấy. Chức năng tìm kiếm giá trị nhỏ nhất (MIN) có thể được xử lý một cách tương
tự, ngoại trừ con trỏ tận cùng bên trái cùng trong chỉ mục từ gốc đến lá ngoài cùng bên
trái. Nút đó sẽ bao gồm giá trị nhỏ nhất của thuộc tính Salary.

Chỉ mục cũng có thể được sử dụng cho các chức năng tổng hợp như tốn tử
AVERAGE và SUM, nhưng chỉ khi nó là một chỉ mục dầy đặc (dense index), nếu có một
chỉ mục cho mỗi bản ghi trong tập tin chính. Trong trường hợp này, việc tính tốn thích
hợp sẽ được áp dụng cho các giá trị của chỉ mục. Đối với một số chỉ mục không dầy đặc
(nondense index), thực tế số lượng các bản ghi liên quan với mỗi giá trị chỉ mục phải
được sử dụng cho một tính tốn chính xác. Điều này có thể được thực hiện nếu số lượng
bản ghi của từng giá trị trong chỉ mục được lưu trữ trong mỗi chỉ mục.

Đối với chức năng tổng hợp như toán tử COUNT, số các giá trị cũng có thể được tính
tốn từ việc đánh chỉ mục theo cách tương tự như trên. Nếu một COUNT (*) được áp
dụng cho một mối quan hệ tổng thể, số lượng bản ghi hiện trong mỗi quan hệ thường
được lưu trữ trong các catalog, và do đó kết quả có thể được lấy trực tiếp từ các catalog.

Khi một mệnh đề GROUP BY được sử dụng trong một truy vấn, các toán tử tổng hợp
phải được áp dụng riêng cho từng nhóm bộ dữ liệu phân chia bởi các thuộc tính nhóm. Do

đó, bảng đầu tiên phải được phân chia thành các tập con của bộ dữ liệu, trong đó mỗi
phân vùng (nhóm) có cùng giá trị đối với các thuộc tính nhóm. Trong trường hợp này,
việc tính tốn phức tạp hơn. Xem xét các truy vấn sau đây:

SELECT Dno, AVG(Salary)

FROM EMPLOYEE

GROUP BY Dno;

Group 4 Trang 16

[Algorithms for Query Processing and Optimization]

Các kỹ thuật thông thường cho các truy vấn như vậy là đầu tiên sử dụng hoặc sắp xếp
hoặc băm trên các thuộc tính nhóm để phân vùng các tập tin vào các nhóm thích hợp. Sau
đó các thuật tốn tính tốn chức năng tổng hợp cho các bộ dữ liệu trong mỗi nhóm, có
cùng thuộc tính. Trong các truy vấn mẫu, các bộ dữ liệu EMPLOYEE cho mỗi số phòng
ban (department) sẽ được nhóm lại với nhau trong một phân vùng và mức lương (Salary)
trung bình tính cho mỗi nhóm.

Chú ý rằng nếu một chỉ mục theo cụm được đánh trên các thuộc tính nhóm, thì các
bản ghi đã được phân vùng (hay phân nhóm) vào các tập con thích hợp. Trong trường hợp
này chỉ là cần thiết để áp dụng tính tốn cho từng nhóm.

Phần 1.6.2. Phép kết OUTER (OUTER JOIN)
Trong phép kết ngồi (OUTER JOIN), ta có ba biến thể của nó đó là:

+ Left Outer Join


+ Right Outer Join

+ Full Outer Join.

Sau đây là một ví dụ về một phép toán left outer join trong truy vấn SQL:

SELECT Lname, Fname, Dname

FROM (EMPLOYEE LEFT OUTER JOIN DEPARTMENT ON Dno=Dnumber)

Kết quả của truy vấn này là một quan hệ gồm tên nhân viên và các phòng ban liên
quan của họ (Lname, Fname, Dname). Nó tương tự như kết quả của phép kết trong (inner
join), ngoại trừ nếu một bộ trong quan hệ EMPLOYEE (một bộ trong mối quan hệ trái -
left relation) khơng có một phịng ban liên quan, tên của nhân viên vẫn sẽ xuất hiện trong
quan hệ kết quả, nhưng tên các phòng ban sẽ là NULL cho bộ dữ liệu đó trong kết quả
truy vấn.

Outer join có thể được tính tốn bằng cách thay đổi một trong những thuật toán kết,

chẳng hạn như kết lồng nhau hoặc kết đơn (nested-loop join or single-loop join). Ví dụ,

để tính tốn trong phép kết trái, chúng ta sử dụng các mối quan hệ trái như các vòng lặp

Group 4 Trang 17

[Algorithms for Query Processing and Optimization]

ngồi hoặc vịng lặp đơn vì mỗi bộ trong mối quan hệ trái bắt buộc phải xuất hiện trong
kết quả. Nếu có các bộ thỏa với các mối quan hệ khác, các bộ tham gia được đưa ra và lưu
trong quan hệ kết quả. Tuy nhiên, nếu khơng có bộ phù hợp được tìm thấy, các bộ vẫn có

trong kết quả nhưng được thay thế bằng giá trị NULL. Các thuật tốn sort-merge and
hash-join cũng có thể được mở rộng để tính tốn trong phép kết ngoài.

Về mặt lý thuyết, phép kết ngồi cũng có thể được tính bằng cách thực hiện sự kết hợp
của tốn tử đại số quan hệ. Ví dụ, phép toán left outer join hiển thị ở trên là tương đương
với trình tự sau đây của các phép tốn quan hệ:

1.Tính tốn (inner) JOIN của bảng EMPLOYEE và bảng DEPARTMENT.
TEMP1 ← πLname, Fname, Dname (EMPLOYEE Dno=Dnumber DEPARTMENT)

2.Tìm các bộ EMPLOYEE không xuất hiện trong kết quả (inner) JOIN.
TEMP2 ← πLname, Fname (EMPLOYEE) – πLname, Fname (TEMP1)

3.Đệm thêm mỗi bộ trong TEMP2 trường Dname là NULL.
TEMP2 ← TEMP2 × NULL

4.Áp dụng phép tốn UNION cho TEMP1, TEMP2 để tạo ra kết quả của LEFT OUTER
JOIN.

RESULT ← TEMP1 ∪ TEMP2

Chi phí của phép kết ngồi được tính tốn như trên sẽ là tổng các chi phí của các bước
liên quan (phép kết trong, phép chiếu, phép hiệu tập hợp và phép hợp). Tuy nhiên, lưu ý
thêm rằng trong bước 3 có thể được thực hiện như mối quan hệ tạm thời đang được xây
dựng trong bước 2, có nghĩa là chúng ta có thể chỉ đơn giản là đệm thêm mỗi bộ kết quả
với giá trị NULL. Ngoài ra trong bước 4, chúng ta biết rằng hai toán hạng của phép hợp
thường tách rời (khơng có bộ dữ liệu chung) nên khơng cần thiết phải loại bỏ trùng lặp.

Phần 1.7. Sử dụng Pipelining


Một câu truy vấn được quy định trong SQL thường sẽ được dịch sang một biểu thức

đại số quan hệ đó là một chuỗi các phép tốn quan hệ. Nếu chúng ta thực hiện một phép

Group 4 Trang 18

[Algorithms for Query Processing and Optimization]

toán duy nhất tại một thời điểm, chúng ta phải tạo ra các tập tin tạm thời trên đĩa để giữ
kết quả của các hoạt động tạm thời, tạo ra chi phí quá mức. Tạo ra và lưu trữ các tập tin
tạm thời trên đĩa lớn là tốn thời gian và có thể là khơng cần thiết trong nhiều trường hợp,
vì những tập tin này ngay lập tức sẽ được sử dụng làm đầu vào cho phép toán tiếp theo.
Để giảm số lượng các tập tin tạm thời, nó thường tạo ra mã thực hiện truy vấn tương ứng
với các thuật toán để kết hợp các phép toán trong một truy vấn.

Ví dụ thay vì được thực hiện riêng biệt, lệnh JOIN có thể được kết hợp với hai phép
tốn đó là phép chọn trong các tập tin đầu vào và phép chiếu cuối cùng trên tập tin kết
quả, tất cả điều này được thực hiện bởi một thuật toán với hai tập tin đầu vào và một tập
tin đầu ra duy nhất. Thay vì tạo ra bốn tập tin tạm thời, chúng ta áp dụng các thuật toán
trực tiếp và chỉ nhận được một tập tin kết quả. Chúng ta đã thảo luận về heuristic tối ưu
đại số quan (heuristic relational algebra optimization) có thể nhóm các phép tốn với nhau
để thực hiện. Điều này được gọi là pipelining hoặc xử lý dữ liệu dựa theo luồng (stream-
based).

Nó thường được dùng để tạo ra mã thực hiện truy vấn tự động để thực hiện nhiều phép
toán. Các mã phát sinh để tạo các truy vấn kết hợp một số thuật toán tương ứng với các
phép toán. Như các bộ dữ liệu kết quả của một phép toán được tạo ra là đầu vào cho các
hoạt động tiếp theo. Nếu một phép toán kết sau dựa trên cơ sở mối quan hệ hai phép toán
chọn, các bộ dữ liệu kết quả từ mỗi phép chọn được cung cấp như là đầu vào cho các
thuật toán kết trong một stream hoặc pipeline.


Phần 1.8. Tối ưu hóa truy vấn dùng Heuristic

Trong phần này, chúng ta thảo luận về các kỹ thuật tối ưu hóa áp dụng quy tắc
heuristic để sửa đổi các đại diện cục bộ của một truy vấn mà thường là dưới hình thức cấu
trúc dữ liệu của một cây truy vấn hoặc một đồ thị truy vấn để cải thiện hiệu suất. Bộ quét
và bộ phân tích cú pháp của một truy vấn SQL đầu tiên tạo ra một cấu trúc dữ liệu tương
ứng với một đại diện truy vấn ban đầu, sau đó được tối ưu hóa theo quy định heuristic.
Điều này dẫn đến một đại diện truy vấn tối ưu, tương ứng với các chiến lược thực hiện

Group 4 Trang 19

[Algorithms for Query Processing and Optimization]

truy vấn. Sau đó, kế hoạch thực hiện truy vấn được tạo ra để thực hiện các nhóm phép
tốn dựa trên các đường dẫn truy cập có sẵn trên các tập tin liên quan đến việc truy vấn.

Áp dụng phép chọn và phép chiếu trước khi áp dụng các phép toán nhị phân hoặc
phép toán kết, vì kích thước của các tập tin từ một số phép tốn nhị phân, chẳng hạn như
thường thì phép kết - là một chức năng nhân (multiplicative) lên các kích thước của các
tập tin đầu vào. Các phép toán chọn và phép chiếu sẽ làm giảm kích thước của một tập tin
nên nó được áp dụng trước khi thực hiện một phép toán nhị phân hoặc kết khác.
Phần 1.8.1n 1.8.1. Query tree và Query graph

Những cây truy vấn (query tree) và đồ thị truy vấn (query graph) có thể được sử
dụng làm cơ sở cho các cấu trúc dữ liệu. Một cây truy vấn được sử dụng để đại diện cho
một đại số quan hệ hoặc mở rộng biểu thức đại số quan hệ, trong khi một đồ thị truy vấn
được sử dụng để đại diện cho một biểu hiện tích quan hệ.

Ví dụ, đối với mỗi dự án nằm trong ‘Stafford’, lấy số lượng dự án, số bộ phận kiểm

soát và tên, địa chỉ và ngày sinh của người quản lý bộ phận thì câu truy vấn bằng đại số
quan hệ là:

có cây truy vấn tương ứng là:

Group 4 Trang 20


×