duy nhất hay khoá chínhOracle chỉ có thể chọn một thành phần truy nhập trong bảng đã liệt kê cho một bảng nếu câu lệnh chứa mệnh đề điều kiện FROM hoặc những cấu trúc khác làm cho các cá
Trang 1Chơng III Phơng pháp tối u hoá trong
Hệ CSDL Oracle
A Các khái niệm cần biết để tối u hoá
Phần này sẽ đa ra một số khái niệm đợc sử dụng quá trình tối u hoá
Qui ớc rằng tên các bảng cũng nh các thuộc tính trong các ví dụ minh hoạ sẽ viết tiếng Việt cho cho dễ hiểu
nh-ng tronh-ng thực tế phải bỏ các dấu tiếnh-ng Việt đi bởi vì Oracle cha hỗ trợ triệt để cho nh-ngôn nh-ngữ Việt
1 Khái niệm về tối u hoá
Nói chung các ngôn ngữ bậc cao (trong đó có ngôn ngữ SQL) đòi hỏi thực hiện trong máy đều rất tốn kém thời gian Đặc biệt là khi dữ liệu nhiều lên thì thời gian thực hiện các câu lên sẽ tăng theo hệ số nhân, do đó cần thiết phải biến đổi các câu hỏi cho hợp lý để giảm thời gian tính toán
Vậy có thể định nghĩa khái niệm tối u hoá nh sau:
Tối u hoá (optimization) câu lệnh SQL là một quá trình để tạo điều kiện cho câu lệnh SQL đa ra kết quả
đạt hiệu quả cao nhất hiểu theo nghĩa thời gian đáp ứng và sử dụng tài nguyên hệ thống là nhỏ nhất.
Theo định nghĩa này thì việc tối u hoá câu lệnh SQL không đơn thuần là tối u mã câu lệnh mà còn có thể thay câu lệnh SQL bằng câu lệnh SQL khác cho ra cùng kết quả nhng thực hiện hiệu quả hơn, điều chỉnh các tham số hệ thống để tài nguyên dành cho câu lệnh là hợp lý nhất, thay đổi các thực thể và quan hệ giữa các thực thể cho câu lệnh thực hiện nhanh hơn
Chú ý rằng việc tối u hoá không nhất thiết phải đúng là “tối u” trên mọi khả năng có thể của các cách cài đặt các câu hỏi bởi vì nếu sử dụng tài nguyên càng nhiều thì câu lệnh càng có khả năng thực hiện nhanh tuy nhiên sẽ giảm số khối lệnh đợc xử lý đồng thời và ngợc lại
Trong thực tế thì quá trình tối u hoá phải tiến hành thờng xuyên trong mọi khâu sản xuất phần mềm để sản phẩm ngày càng đợc hoàn thiện hơn, điều này cũng là một trong các lý do ra đời các phiên bản Version 1.0, Version 2.0 của phần mềm
2 Chiến lợc tối u trên các trên các biểu thức quan hệ
Ullman J.D trong các kết quả nghiên cứu công bố lần đầu tiên của mình đã trình bày 6 chiến l ợc tổng quan cho việc tối u hoá Các chiến lợc này sẽ đợc thể hiện trực tiếp hay gián tiếp trong các bớc tối u cụ thể trong Oracle Nội dung của các chiến lợc đó nh sau:
Đề-so sánh giữa các thuộc tính của R và S thì rõ ràng phép tích Đề-các là phép kết nối
2.3 Tổ hợp dãy các phép tính một ngôi nh các phép chọn và phép chiếu
Một dãy các phép một ngôi nh phép chọn hoặc phép chiếu mà kết quả của chúng phụ thuộc và các bộ của một quan hệ độc lập thì có thể nhóm các phép đó lại
Trang 22.4 Tìm các biểu thức con chung trong một biểu thức
Nếu kết quả của một biểu thức con chung (biểu thức xuất hiện hơn một lần) là một quan hệ không lớn và nó có thể đợc đọc từ bộ nhớ thứ cấp với ít thời gian thì nên tính toán trớc biểu thức đó chỉ một lần Biểu thức con chung có lên quan tới một phép kết nối thì trong trờng hợp tổng quát không thể đợc thay đổi nhờ việc đẩy phép chọn vào trong
Điều đáng quan tâm hơn là các biểu thức con chung có tần số xuất hiện lớn đợc biểu diễn trong các View (khung nhìn) của các ngời dùng vì để thực hiện các câu hỏi đó cần thay thế một biểu thức cố định vào cho View
2.5 Xử lý các tệp trớc
Có hai vấn đề cần xử lý trớc quan trọng cho các tệp số là sắp xếp trớc các tệp và thiết lập các tệp chỉ số Và nh vậy khi thực hiện các phép tính có liên quan tới hai tệp (phép tính hai ngôi) sẽ nhanh hơn rất nhiều
2.6 Đánh giá trớc khi thực hiện tính toán
Một khi cần chọn trình tự thực hiện các phép tính trong biểu thức hoặc chọn một trong hai đối số của một phép tính hai ngôi cần tính toán xem chi phí thực hiện các phép tính đó (thờng là số phép tính, thời gian, kích thớc bộ nhớ theo một tỷ lệ giữa kích cỡ các quan hệ ) Từ đó sẽ có đợc các chi phí (giá thành) phải trả cho các cách khác nhau
để thực hiện các câu hỏi
3 Các kiểu phân lớp trong CSDL Oracle
Một trong các thông tin quan trọng khi tối u hoá là chọn cách truy nhập dữ liệu dựa trên đặc điểm lu trữ Thông thờng khi truy xuất tới một hàng của bảng phải duyệt tuần tự từ đầu của bảng cho tới hàng cần truy xuất Tuy nhiên mỗi hàng của các bảng trong Oracle đều chứa một địa chỉ của nó gọi là ROWID Cách truy xuất tuần tự rất chậm khi dữ liệu lớn và cần tìm cách truy xuất trực tiếp tới hàng thông qua ROWID Do vậy trong Oracle thì dữ liệu đợc lu trữ theo các dạng phân lớp và khi cần truy xuất tới hàng thì tìm ROWID tơng ứng ở các phân lớp và truy xuất tới hàng thông qua ROWID tìm đợc:
3.1 Phân lớp dựa vào Index
Khi mà các bảng đợc Index thì cùng với giá trị của trờng Index còn có các ROWID Tuỳ theo giá trị của cột Index có là khoá duy nhất hay không thì tơng ứng với một khoá của Index có thể có một hoặc có nhiều ROWID Với một giá trị khoá Index thì sẽ nhận đợc ROWID tơng ứng và ROWID sẽ đợc dùng tìm ra hàng đợc yêu cầu trong một nhóm các hàng có cùng giá trị khoá Index Thông thờng các Index trong Oracle đợc tạo theo dạng “B-tree” tuy nhiên Oracle còn cung cấp một mức Index khác gọi là Bitmap Index Kiểu Index mới mà đặc biệt hiệu quả với những cột mà
số lợng nhiều nhng tập giá trị lại ít ví dụ nh cột giới tính, cột mã khu vực chẳng hạn Bằng việc ánh xạ vị trí các cột với các bit sẽ dễ dàng nhận đợc kết cần tìm Ví dụ sau sẽ minh hoạ điều này
Giả sử có bảng SinhViên có các thuộc tính MãSinhViên, GiớiTính, KhuVực có các giá trị nh sau:
Trang 3Khi thực hiện phép Index với cột KhuVực sẽ thu đợc bảng sau:
SELECT * FROM SinhViên WHERE GiớiTính=’Nữ’ AND KhuVực IN (‘KV2’, ’KV3’);
Bằng việc sử dụng Bitmap Index và truy nhập trên bảng Bitmap để lọc ra tập hợp các hàng thoả mãn điều kiện đã nêu, quá trình đó đợc mô tả nh bảng dới đây:
GiớiTính = ’Nữ’ KhuVực = ‘KV2’ KhuVực = ‘KV3’
0 1
1 AND ( 0
0 1
0 1
0 OR 0
1 1
0 0
1 ) = 1 0 0
0 1
1 AND 0 0 1
0 1
1 = 1 1 1
0 1 1 0 0 1
3.2 Phân lớp bằng Cluster
Cluster là một cách thức lu trữ dữ liệu của các bảng trong Oraclethành một nhóm và giữa các bảng này thờng có một số cột là khoá ngoài tham chiếu tới nhau Ví dụ nh bảng NhânViên và bảng Phòng sẽ có chung một cột là MãPhòng Khi nhóm bảng NhânViên và bảng Phòng thì Oracle sẽ chứa tất cả các hàng tơng ứng với một phòng ban của cả hai bảng vào trong cùng một khối dữ liệu
Trang 4Cluster Key(M Phòng)ã
Bảng không ClusterCác dữ liệu quan hệ được đặttừng phần, cần nhiều chỗ hơn
Bảng Phòng
M Phòngã TênPhòng TP
20 Quản trị TP Hà Nội
Do Cluster chứa các hàng của các bảng có liên hệ với nhau nên có hai u điểm sau:
1* Thời gian đọc đĩa đợc cải thiện cho câu lệnh kết nối của các bảng trong Cluster bởi vì cấu trúc của Cluster đã chứa sẵn một mối liên kết giữa các bảng
2* Trong một Cluster thì mỗi giá trị khoá Cluster cũng là một thành phần của các hàng và duy nhất chỉ có một giá trị đ
-ợc lu trữ cho một khối của Cluster thay mỗi hàng phải chứa giá trị đó Điều này sẽ tiết kiệm đ-ợc không gian lu trữ trên đĩa
Để sử dụng đợc Cluster thì cần phải tạo ra Index cho Cluster gọi là chỉ mục phân lớp Khác với chỉ mục thông thờng, loại chỉ mục này có các đặc điểm sau
3* Khoá cho các giá trị NULL có chung một đề mục trong chỉ mục phân lớp
4* Mỗi đề mục trong chỉ mục phân lớp sẽ chỉ đến hàng đầu tiên của khối dữ liệu trong Cluster
5* Dữ liệu của bảng đợc lu trữ trong Cluster chỉ đợc truy nhập nếu có chỉ mục phân lớp
3.3 Phân lớp dựa vào khoá của hàm băm
Phân lớp bằng hàm băm (Hash Function) là một cách thức lu trữ dữ liệu theo khoá băm để tối u quá trình truy xuất dữ liệu Thông qua một hàm băm thì mỗi hàng có một giá trị khoá băm và các hàng có khoá băm trùng nhau sẽ
đợc nằm trong cùng một lớp Để truy nhập đến hàng trớc tiên cần sử dụng hàm băm để tìm ra khoá hàm băm của
Trang 5hàng Sau đó truy nhập đến bảng băm thông qua khoá hàng băm và lấy ra đợc ROWID để truy nhập trực tiếp đến hàng.
3.4 Không phân lớp
Nghĩa là dữ liệu đợc ghi tự nhiên nh lúc tạo do vậy việc truy nhập thông tin luôn đòi hỏi phải dùng duyệt toàn
bộ bảng
4 Các kiểu kết nối trong Oracle
Do việc đảm bảo tính chuẩn hoá của dữ liệu mà các bảng sẽ đợc kết nối với nhau thông qua các khoá Một trong các bớc tối u hoá là lựa chọn kiểu kết nối thích hợp Trong Oracle có các kiểu kết nối sau:
4.1 Kết nối bằng Nested-Loop
Để thực hiện một kết nối theo kiểu Nested-Loop, Oracle sẽ chọn ra một bảng nh là bảng ngoài hay là bảng dẫn dắt (outer table hoặc driving table), bảng còn lại đợc gọi là bảng nội (inner table) Với mỗi hàng trong bảng ngoài thì Oracle sẽ tìm tất cả các hàng trong bảng nội thoả mãn điều kiện kết nối Cặp hàng thoả mãn điều kiện kết nối sẽ đ ợc hợp lại thành một và thêm vào tập các hàng kết quả
Ví dụ: SELECT * FROM NhânViên, Phòng WHERE NhânViên.M Phòng=Phòng.M Phòng; ã ã
nesloop
NhânViên
pk_phong (Range Scan)
Trang 6merge join
sort (join)
sort (join)
Ví dụ: SELECT * FROM NhânViên, Phòng WHERE NhânViên.M Phòng=Phòng.M Phòng; ã ã
nested loop
Phòng
4.3 Kết bằng sử dụng hàm băm
Oracle sẽ duyệt toàn bộ các bảng và chia (băm) chúng ra thành nhiều đoạn dựa vào bộ nhớ có sẵn
Oracle xây dựng một bảng băm từ các đoạn này (nếu có thể Oracle sẽ chọn một đoạn đặt vừa vùng bộ nhớ có sẵn) Oracle sẽ sử dụng các đoạn tơng ứng trong một bảng khác để khảo sát bảng băm Các đoạn khác mà không nằm vừa trong bộ nhớ sẽ đợc đặt trên đĩa
Ví dụ: SELECT * FROM NhânViên, Phòng WHERE NhânViên.M Phòng=Phòng.M Phòng; ã ã
Trang 7duy nhất hay khoá chính
Oracle chỉ có thể chọn một thành phần truy nhập trong bảng đã liệt kê cho một bảng nếu câu lệnh chứa mệnh đề
điều kiện FROM hoặc những cấu trúc khác làm cho các cách truy nhập trở thành có thể dùng đợc
Trang 85.1 Truy nhập qua ROWID
ROWID là địa chỉ của một hàng của table trên đĩa Thông qua ROWID có thể truy nhập trực tiếp đến hàng đó
và đây là cách truy nhập thông tin nhanh nhất tới hàng Phơng pháp này đợc sử dụng khi trong mệnh đề FROM có chứa ROWID hoặc là hàng hiện tại của biến tập hợp (CURRENT OF CURSOR)
Ví dụ: SELECT * FROM NhânViên WHERE ROWID = ‘000000DC5.0000.0001’;
5.2 Chọn một hàng bằng Cluster kết nối
Khi Index trên trờng không duy nhất giá trị thì nhóm các hàng có cùng giá trị khoá sẽ có ROWID chứa trong cùng một Cluster Index Bằng cách tìm ROWID trong Cluster Index Oracle sẽ truy nhập thông tin tới hàng một cách trực tiếp (qua ROWID) Phơng thức truy nhập này sẵn dùng cho các câu lệnh mà những table kết nối trong cùng một Cluster và nếu cả hai điều kiện sau cùng đúng:
6* Câu lệnh phải có mệnh đề FROM chứa điều kiện mà mỗi cột của Cluster là khoá của một bảng khác
7* Mệnh đề FROM cũng phải đảm bảo điều kiện kết nối chỉ trả lại duy nhất một hàng Những điều kiện nh vậy thờng là khoá duy nhất hoặc là khoá chính
Trong những điều kiện phải có chứa toán tử AND để Oracle có thể xây dựng thành thao tác Nested Loops.VD: Trong bảng NhânViên và bảng Phòng có chứa cột MãPhòng và cột MãNhânViên là khoá chính của bảng NhânViên
SELECT * FROM NhânViên, Phòng
5.3 Chọn một hàng bằng khoá băm (Hash Key) với khoá duy nhất hoặc khoá chính
Duyệt băm (Hash Scans) là phơng pháp truy nhập tới hàng bằng cách sử dụng hàm băm (Hash Function) Phơng thức này sẵn dùng khi mà cả hai điều kiện sau đợc thoả mãn:
8* Câu lệnh phải có mệnh đề FROM sử dụng tất cả các cột trong khoá của hàm băm Mặt khác để dùng đợc khoá của hàm băm thì các điều kiện tơng ứng phải kết nối với nhau bằng toán tử AND
9* Câu lệnh phải đảm bảo chỉ trả lại một giá trị hàng duy nhất bởi vì giá trị các cột tạo thành khoá của hàm băm cũng tạo ra một khoá duy nhất hoặc là khoá chính
Để thực hiện câu lệnh này, Oracle dùng hàm băm để định giá trị khoá băm tơng ứng với các giá trị cung cấp bởi câu lệnh Giá trị khoá tìm đợc sẽ sử dụng để tìm bản ghi tơng ứng trong table
Ví dụ: Giả sử rằng trong bảng HoáĐơn và bảng NộiDungHoáĐơn đợc lu trong một nhóm hàm băm và SốHoáĐơn vừa là khoá chính vừa là khoá hàm băm Câu lệnh sau sẽ sử dụng phơng thức hàm băm
SELECT * FROM HoáĐơn WHERE SốHoáĐơn = 65118968;
5.4 Chọn một hàng bằng sử dụng khoá duy nhất hoặc bằng khoá chính
Phơng thức này chỉ dùng đợc khi câu lệnh phải có mệnh đề FROM có sử dụng tất cả các cột của khoá duy nhất (hoặc khoá chính) trong điều kiện tơng ứng Để có thể sử dụng đợc khoá thì các điều kiện tơng ứng với cột nằm trong
Trang 9khoá phải liên kết với nhau bằng toán tử AND Thông qua bảng Index tơng ứng với các khoá thì Oracle sẽ tìm đợc
ROWID tơng ứng để truy nhập trực tiếp tới hàng
VD: Giả sử MãNhânViên là khoá chính của bảng NhânViên, câu lệnh sau sẽ sử dụng phơng thức truy nhập này
5.5 Kết nối Cluster (Cluster join)
Phơng thức này sẵn dùng khi mà điều kiện kết nối các bảng đều đợc chứa trong cùng một nhóm (Cluster) và nếu
điều kiện kết nối trong mệnh đề FROM thoả mãn mỗi cột trong kết nối là khoá của bảng này và là cột trong bảng kia
Và để sử dụng đợc khoá của kết nối thì các điều kiện phải nối với nhau bởi toán tử AND Lúc đó Oracle sẽ tiến hành hoàn thành câu lệnh Nested-Loop
5.6 Khoá của các hàng có cùng giá trị băm
Câu lệnh phải có mệnh đề FROM sử dụng tất cả các cột trong khoá của hàm băm Mặt khác để dùng đợc khoá của hàm băm thì các điều kiện tơng ứng phải kết nối với nhau bằng toán tử AND Oracle sẽ tiến hành duyệt bảng dựa trên khoá hàm băm tìm đợc
VD: Giả sử rằng trong bảng HoáĐơn và bảng NộiDungHoáĐơn đợc lu trong một nhóm hàm băm và SốHoáĐơn vừa là khoá chính vừa là khoá hàm băm Câu lệnh sau sẽ sử dụng phơng thức hàm băm
SELECT * FROM NộiDungHoáĐơn WHERE SốHoáĐơn = 65118968;
5.7 Khoá của các hàng có cùng giá trị Index
Khi mà các bảng đợc Index thì cùng với giá trị của trờng Index còn có các ROWID Nếu câu lệnh chỉ sử dụng giá trị các trờng Index thì các giá trị này sẽ đợc lấy trực tiếp từ bảng Index thay vì lấy từ bảng dữ liệu còn trong trờng hợp là các giá trị khác thì sẽ truy nhập ROWID tìm đợc từ bảng Index
VD: Giả sử trong bảng NhânViên thì MãPhòng đã đợc Index
5.8 Index phối hợp
Khi có câu lệnh có sử dụng nhiều cột đợc Index phối hợp và trong mệnh đề FROM và các điều kiện này đợc liên kết với nhau bằng toán tử AND Oracle sẽ tiến hành duyệt trên các vùng Index để tìm ra các ROWID , từ đó có thể truy nhập đến các hàng tơng ứng
VD: Giả sử cột Nghề và MãPhòng đợc Index phối hợp Câu lệnh sau sẽ sử dụng Index phối hợp
5.9 Sử dụng Index đơn
Khi câu lệnh sử dụng các cột của Index đơn thì Oracle sẽ tiến hành tìm ra các ROWID truy nhập đến các hàng tơng ứng
VD: Giả sử trong bảng NhânViên cột Nghề đã đợc Index
SELECT * FROM NhânViên WHERE Nghề = 'Th kí';
Trang 10Nếu nh câu lệnh có sử dụng nhiều cột Index đơn thì Oracle sẽ lấy giao của tập hợp các ROWID nhận đợc khi duyệt các Index theo điều kiện Từ tập hợp chung này Oracle mới tiến hành truy nhập đến các hàng tơng ứng
VD: Trong bảng NhânViên thì cột Nghề và MãPhòng đợc Index đơn
5.10 Giới hạn tập hợp Index (Index Range Scan)
Phơng thức này đợc sử dụng khi trong câu lệnh có chứa điều kiện giới hạn các Index đơn hoặc thành phần đứng trớc trong Index nhiều cột có dạng nh sau
<tên cột> = <biểu thức>
<tên cột > >[=] <biểu thức> AND <tên cột> <[=] <biểu thức>
<tên cột> BETWEEN <biểu thức> AND <biểu thức>
<tên cột> LIKE 'c%'
Nếu nh câu lệnh có tham chiếu tới cột Index thì phơng thức truy nhập này không đợc sử dụng
VD: Giả sử cột Lơng trong bảng NhânViên là một Index, các câu lệnh sau sẽ sử dụng phơng thức duyệt dựa trên giới hạn của Index
SELECT * FROM NhânViên WHERE Lơng BETWEEN 2000 AND 3000;
SELECT * FROM NhânViên WHERE TênNhânViên LIKE 'S%';
5.11 Không giới hạn vùng Index
Phơng thức này có thể đợc sử dụng khi trong câu lệnh có chứa điều kiện giới hạn các Index đơn hoặc thành phần
đứng trớc trong Index nhiều cột có dạng nh sau
<tên cột > >[=] <biểu thức>
<tên cột> <[=] <biểu thức>
Trong trờng hợp này vùng Index bị giới hạn về một phía (chặn trên hoặc chặn dới)
Ví dụ trong trờng hợp Index đơn:
SELECT * FROM NhânViên WHERE Lơng > 2000;
Ví dụ trong trờng hợp Index trên nhiều trờng:
Giả sử có Index trên MãHoáĐơn và DòngHoáĐơn của bảng NộiDungHoáĐơn
Do MãHoáĐơn là phần đứng trớc trong Index nhiều cột nên phơng thức truy nhập này đợc sử dụng Tuy nhiên câu lệnh sau đây vì DòngHoáĐơn là thành phần đứng sau trong Index nhiều cột nên phơng thức truy nhập này không
đợc sử dụng
SELECT * FROM NộiDungHoáĐơn WHERE DòngHoáĐơn <4;
5.12 Sắp xếp kết nối
Trang 11Nếu câu lệnh đòi hỏi kết nối giữa các bảng trong cùng một nhóm hoặc nếu điều kiện trong mệnh đề FROM sử dụng một cột từ một bảng khác trong điều kiện tơng ứng Oracle cũng có thể sử câu lệnh SELECT đệ qui để thực hiện câu lệnh kết nối.
VD khi bảng NhânViên và bảng Phòng không nằm trong cùng một Cluster
5.13 MAX hoặc MIN của cột Index
Phơng thức này có thể đợc dùng nếu các điều kiện sau thoả mãn
10* Câu lệnh sử dụng hàm MAX hoặc MIN để chọn giá trị của các cột Index đơn hoặc các cột là phần đầu của Index phức Các kiểu Index này không đợc phép là Cluster Index (chỉ mục phân lớp)
11* Không có biểu thức khác trong danh sách chọn
12* Câu lệnh không chứa mệnh đề FROM hay mệnh đề GROUP BY
Oracle sẽ tiến hành thực hiện tìm có khoanh vùng đối với Index để tìm giá trị MAX hoặc MIN Khi mà chỉ có giá trị đợc chọn thì Oracle cũng không cần thiết truy xuất đến bảng dữ liệu nữa
5.14 Mệnh đề ORDER BY trên các cột đã Index
Phơng thức truy nhập này đợc thực hiện khi mà các điều kiện sau thoả mãn:
13* Câu lệnh chứa mệnh đề ORDER BY sử dụng cột Index đơn hoặc phần đầu trong Index phức Kiểu Index này không thể là một Cluster Index
14* Đảm bảo phải có ít nhất một cột là khoá chính hoặc cột có giá trị NOT NULL trong các cột có mặt ở mệnh đề
15* Tham số NSL_SORT đợc đặt giá trị là BINARY
Oracle sẽ thực hiện lọc ra vùng tìm kiếm trong Index để lấy ra các ROWID rồi truy nhập bằng ROWID
VD: Giả sử MãNhânViên là khoá chính của bảng nhân viên
5.15 Duyệt toàn bộ
Bất kì câu lệnh nào cũng có thể sử dụng phơng thức truy nhập này mà không cần quan tâm đến điều kiện sau mệnh đề WHERE
Chú ý: Các điều kiện sau cũng không tạo ra phơng thức truy nhập bằng Index
16*<tên cột 1> < <tên cột 2>
17*<tên cột 1 > > <tên cột 2>
18*<tên cột 1 > >= <tên cột 2>
19*<tên cột 1> <= <tên cột 2>
Trang 12biểu thức ở đây là một cột với một toán tử hoặc một cột khác bất chấp việc cột đã đợc Index.
27*Bất kì điều kiện nào đối với một cột cha đợc Index.
Các câu lệnh có chứa cấu trúc nh vậy và không có cấu trúc khác để có thể tạo phơng thức truy nhập bằng Index thì buộc phải duyệt toàn bộ
6 Các luật tối u
Có hai luật tối u trong Oracle là luật tối u cơ bản và luật tối u ớc lợng giá
6.1 Luật tối u cơ bản (rule-based)
Nội dung cơ bản của luật này là chọn ra cách thức truy nhập tới hàng dựa trên mức độ u tiên của các phơng thức
Trớc tiên Oracle sẽ kiểm tra điều kiện sau mệnh đề WHERE của câu lệnh để xác định những phơng thức nào câu lệnh có thể sử dụng đợc Tiếp đó Oracle sẽ tiến hành chọn ra phơng thức có số thứ tự thấp nhất trong bảng các phơng thức Chú ý rằng phơng thức duyệt toàn bộ là phơng thức đứng cuối bảng cho nên Oracle sẽ chọn phơng thức truy nhập có Index nếu có cho dù duyệt toàn bộ có thể nhanh hơn và thứ tự các điều kiện trong mệnh đề WHERE nói chung sẽ không ảnh hởng tới cách chọn phơng thức truy nhập
Giả sử có bảng NhânViên có những ràng buộc sau:
+ Khoá chính là M NhânViên và Index t ã ơng ứng là PK_MANHANVIEN.
+Có Index tên là TENNHANVIEN_IND trên cột TênNhânViên.
+Có Index tên là LUONG_IND trên cột Lơng.
Để chọn ra những mã nhân viên có tên là 'CHUNG' và có lơng > 2000 bằng câu lệnh sau:
Dựa vào các điều kiện trong mệnh đề WHERE của câu lệnh SQL và các ràng buộc, các Index thì các phơng truy nhập sau có thể dùng đợc:
+ Chọn ra một hàng bằng Index khi sử dụng TENNHANVIEN_IND do điều kiện TênNhânViên='CHUNG' Phơng thức này có số thứ tự là 9.
+ Duyệt Index không bị giới hạn khi sử dụng LUONG_IND Phơng thức này có số thứ tự là 11.
Trang 13+ Duyệt toàn bộ do phơng thức này sẵn dùng cho mọi bảng.
Theo luật tối u Rule-based thì Oracle sẽ tiến hành truy nhập theo phơng pháp sử dụng Index TENNHANVIEN_IND
6.2 Luật tối u ớc lợng giá (Cost-based)
Mỗi cách truy nhập khi thi hành sẽ tơng ứng một phân tích có “giá” (cost) nào đó, giá này xác định dựa trên tài nguyên máy tính nh truy xuất I/O, thời gian CPU, bộ nhớ
Nội dung cơ bản của luật này là chọn ra cách thực hiện câu lệnh mà phải trả giá ít nhất dựa trên các thông tin về trạng thái của hệ thống và của dữ liệu Các thông tin về trạng thái có thể tìm thấy trong từ điển dữ liệu và th ờng sẽ quan tâm đến các thông tin sau:
28*Độ lớn của quan hệ R: UR.
29*Số lợng giá trị thuộc tính A trong quan hệ R: U(A,R).
30*Số lợng các trang bộ nhớ để chứa quan hệ R còn rỗi: PR.
31*Số lợng dòng (row) tơng ứng với một trang 1 trang: bR.
32*Số lợng các trang bộ nhớ RAM vật lý còn rỗi: M
33*Mức Index thuộc tính trong quan hệ R, đối với CSDL Oracle là “B-Tree”
Trớc tiên Oracle sẽ xác định cách thức truy nhập nào có thể dùng đợc bằng cách kiểm tra điều kiện trong mệnh
đề WHERE Tiếp đó Oracle sẽ định giá mỗi cách truy nhập dựa trên đặc điểm của dữ liệu nh trạng thái Storage, các Table, các Index, Cluster trong từ điển dữ liệu (Data Dictionary)
Bộ tối u hoá cũng quan tâm đến các nhân tố sau đây khi chọn phơng thức truy nhập:
1* Tính chọn lọc: là số phần trăm các hàng đợc chọn ra trong bảng bởi câu lệnh Nếu nh câu lệnh chọn ra một
số phần trăm nhỏ của bảng thì đợc gọi là tính chọn lọc cao, còn nếu câu lệnh chọn ra một số lợng hàng lớn
từ bảng thì đợc gọi là tính chọn lọc thấp
Oracle thờng chọn ra đợc cách truy nhập chính xác cho các câu lệnh có tính chọn lọc cao hơn là những câu lệnh
có tính chọn lọc thấp Thông thờng thì những cách truy nhập thông qua Index là nhanh đối với các câu lệnh có tính chọn lọc cao, tuy nhiên phơng thức duyệt toàn bộ lại thực hiện nhanh hơn đối với câu lệnh có tính chọn lọc thấp.Tính chọn lọc của một câu lệnh đợc xác định thông qua các điều kiện sau:
34* Các toán tử đợc sử dụng trong mệnh đề WHERE
35* Khoá duy nhất hoặc khoá chính đợc sử dụng trong mệnh đề WHERE
36* Trạng thái của các bảng
Những ví dụ trong phần minh hoạ sẽ làm rõ cách thức sử dụng tính chọn lọc
(multi-block), vì vậy giá phải trả với duyệt toàn bộ là số lợng của đa khối cần đọc, đòi hỏi để đọc toàn bộ bảng tức
là số các khối đơn để đọc tơng ứng với một đa khối mà giá trị này đợc xác định bởi tham số
DB_FILE_MULTIBLOCK_READ_COUNT Vì lý do đó nên Oracle thờng chọn duyệt toàn bộ khi mà giá trị của tham số này cao
Trang 14VD: Câu lệnh sau sử dụng điều kiện bằng trong mệnh đề WHERE để chọn ra tất cả những nhân viên có tên là Chung:
SELECT * FROM NhânViên WHERE TênNhânViên='Chung';
Nếu TênNhânViên là một khoá duy nhất hay là một khoá chính thì Oracle sẽ xác định đợc chỉ có một hàng có TênNhânViên là Chung và câu lệnh cũng chỉ trả lại có một hàng do đó Oracle rất chính xác khi chọn phơng thức truy nhập duyệt giá trị duy nhất trên Index ràng buộc bởi khoá duy nhất hay khoá chính (phơng thức này có số thứ tự trong bảng là 4)
Quay trở lại ví dụ trên, nếu nh TênNhânViên không phải là một khoá duy nhất hay là một khoá chính thì Oracle
có thể đánh giá tính chọn lọc của câu lệnh dựa trên thông tin từ:
1* Tham số USER_TAB_COLUMNS.NUM_DISTINCT: Số lợng tập giá trị khác nhau cho mỗi cột
Bằng cách chia số lợng hàng của bảng NhânViên cho số lợng các giá trị khác nhau của cột TênNhânViên, Oracle
sẽ ớc lợng đợc số nhân viên cùng tên Với giả thiết các giá trị của tên nhân viên là đồng đều nên Oracle sử dụng số phần trăm này để xác định tính chọn lọc của câu lệnh
Ví dụ 1: SELECT * FROM NhânViên WHERE M NhânViên < 7500; ã
Để đánh giá tính chọn lọc của câu lệnh, Oracle lấy giá trị giới hạn là 7500 từ câu lệnh kết hợp với giá trị
HIGH_VALUE và LOW_VALUE ứng với cột MãNhânViên trong USER_TAB_COLUMNS View Oracle giả sử rằng mọi giá trị của MãNhânViên đợc phân bố đều giữa giá trị cao nhất và giá trị thấp nhất do đó sẽ ớc lợng đợc số phần trăm hàng đợc lấy ra (cũng nh đánh giá đợc tính chọn lọc của câu lệnh)
Ví dụ 2: SELECT * FROM NhânViên WHERE MãNhânViên < :e1;
Bộ tối u hoá không biết giá trị của biến cục bộ e1 Thực tế thì giá trị của e1 có thể khác nhau với mỗi lần thực hiện câu lệnh Chính vì lý do này mà Oracle có thể sử dụng cách thức đã mô tả ở ví dụ trên để xác định tính chọn lọc của câu lệnh Trong trờng hợp này Oracle đa ra phỏng đoán là giá cột nhận giá trị nhỏ để xác định tính chọn lọc (bởi vì cột đợc Index)
SELECT * FROM NhânViên WHERE M NhânViên>=7500 AND M NhânViên<=7800; ã ã
Oracle sẽ đánh giá tính chọn lọc dựa vào hai câu lệnh có điều kiện sau:
Khi Server nhận đợc câu lệnh SQL từ Client gửi tới thì Server sẽ tiến hành phân tích câu lệnh theo dạng cây do
đó số tổ hợp có thể khá lớn Tại Oracle Server có một vùng nhớ để lu trữ các câu lệnh SQL đã phân tích để khi gặp lại câu lệnh thì không phải thực hiện quá trình phân tích nữa Do làm việc trong môi trờng đa ngời dùng nên khả năng gặp lại các câu lệnh SQL là rất lớn và có thể nhận thấy rằng bộ đệm l u trữ càng lớn thì xác suất tìm thấy câu lệnh trong bộ đệm là càng cao Tuy nhiên kích thớc của bộ đệm cũng không thể lớn quá phần bộ nhớ RAM vật lý còn rảnh vì nếu vợt quá sẽ gây ra việc tráo đổi bộ nhớ ra đĩa, đây là hiệu ứng không mong muốn vì nó sẽ làm chậm tốc độ thực hiện chơng trình
Trang 15Phân tích cách thực hiện một câu lệnh SQL cụ thể và xây dựng cây phân tích.
Giả sử có các bảng NhânViên chứa các thông tin về NhânViên nh Lơng, Nghề, Tên, MãPhòng v.v và bảng Phòng chứa MãPhòng và TênPhòng để liên kết với bảng NhânViên
Giả sử có câu lệnh SQL sau:
SELECT TênNhânViên, Nghề, Lơng, TênPhòng
FROM NhânViên, Phòng
WHERE NhânViên.Lơng BETWEEN Bậc1 AND Bậc2);
Do MãPhòng là khoá chính nên các hàng trong bảng Phòng sẽ đợc truy nhập bằng ROWID còn bảng nhân viên
do không có Index trên TênNhânViên nên bảng này sẽ đợc truy nhập bằng phơng pháp duyệt toàn bộ
Truy nhập bảng (Duyệt toàn bộ) NhânViên
3
Truy nhập Index (Khóa duy nhất) pk_maphong
5
Sơ đồ cách thực hiện câu lệnh SQL trong ORACLE
Truy nhập bảng (Bằng ROWID) Phòng
4
Bộ lọc 1
Nested-loop
2
Truy nhập bảng (Duyệt toàn bộ) BậcLương 6
Trong sơ đồ này thì mỗi khối ứng với một bớc thực hiện và con số trong khối chỉ thứ tự đợc thực hiện của khỗi Mỗi khối sẽ lấy dữ liệu từ khối khác (màu trắng) hoặc trực tiếp từ dữ liệu trên đĩa (màu đen) Sau khi dữ liệu đợc xử
Trang 16lý ở mỗi khối thì sẽ trả lại một tập hợp các hàng (đợc gọi là nguồn dữ liệu Row Source) cho khối ở mức trên và nếu
là khối trên cùng thì sẽ trả lại cho ngời dùng hoặc chơng trình thực hiện câu lệnh
Theo sơ đồ trên, Oracle sẽ thực hiện bớc 3 và trả lại từng dòng một cho bớc 2 Tơng ứng với mỗi dòng ở bớc 3 Oracle thực hiện các công việc sau:
- Oracle thực hiện bớc 5 và trả lại ROWID cho bớc 4
- Oracle thực hiện bớc 4 trả lại giá trị hàng cho bớc 2
- Oracle thực hiện bớc 2 bằng cách lấy mỗi hàng ở bớc 3 và một hàng ở bớc 4 ghép thành một và trả lại kết quả cho bớc 1
- Oracle sẽ thực hiện bớc 6 và sẽ trả lại các hàng cho bớc 1 nếu có
- Để thực hiện bớc 1, Oracle sẽ kiểm tra ở bớc 6 có trả lại hàng nào không, nếu có thì Oracle sẽ trả lại hàng từ bớc
2 cho ngời dùng
Chú ý rằng ứng với mỗi hàng trả lại ở bớc 3 thì Oracle sẽ phải một lần thực hiện bớc 5, 4, 2, 6, 1 Với các bớc mà chỉ đòi hỏi một dòng từ các nhánh con trong cây phân tích thì rất tốt bởi vì Oracle có thể tiến hành thực hiện bớc đó ngay và nh vậy cây lệnh sẽ đợc thu gọn lại từng thời điểm Nói chung thì các bớc chỉ yêu cầu truy nhập một hàng từ bảng là truy nhập duy nhất trực tiếp từ bảng, từ Index, từ kết nối Nested-Loop và từ bộ lọc còn các bớc yêu cầu tất cả các hàng hàng đồng thời là sắp xếp, kết nối bằng sắp xếp trộn, các hàm làm việc với nhóm hàng và phép hợp các tập hợp
Dựa trên cây phân tích lệnh có thể đánh giá hoặc sắp xếp lại câu lệnh để chọn ra cách thức thực hiện tối u Ngoài ra cũng có thể chuyển cây phân tích này các chú giải nh sau:
Các chú giải này có thể đợc liệt kê ra bởi Oracle bằng cách sử dụng lệnh EXPLAIN PLAN để mỗi khi thực hiện câu lệnh thì Oracle sẽ đa ra các chú giải về cây phân tích đợc thực hiện
C Các bớc tối u hoá
Có thể tối u hoá ở mức ứng dụng bằng cách xây dựng các bảng, lựa chọn giải pháp Index, các View thích hợp Sau đó sẽ tối u ở mức câu lệnh bằng cách thay đổi lại câu lệnh để nó đợc thực hiện có hiệu quả hơn Mặc dù Oracle có thể hỗ trợ cho việc tối u câu lệnh nhng tuy nhiên Oracle không thể biết về đặc điểm dữ liệu cũng nh về ngữ nghĩa câu lệnh bằng những ngời phát triển phần mềm Do vậy phát triển phần mềm sẽ phải tự tiến hành tối u câu lệnh để cho nó
đợc hoàn thiện hơn
Với bất kì một câu lệnh SQL nào đợc thực hiện bởi Oracle thì bộ tối u hoá sẽ làm các công việc sau:
3* Định trị các biểu thức và điều kiện: Oracle sẽ tiến hành tính toán các biểu thức và điều kiện thành các giá trị hằng một cách tối đa
4* Chuyển đổi câu lệnh: Với những câu lệnh phức tạp thì Oracle sẽ tiến hành chuyển thành sự kết hợp của các câu lệnh đơn giản hơn, ví dụ nh câu hỏi có sử dụng Query bộ phận (subquery) thì sẽ đợc chuyển thành kết nối của hai câu hỏi tơng đơng nếu có thể