D. Kết luận về phơng pháp tối u trong Oracle
6. Thêm các chỉ thị thực hiện vào trong câu lệnh
Lý do để thêm các chỉ dẫn: Bất kì ngời thiết kế phần mềm nào cũng biết rõ về đặc điểm về dữ liệu hơn Oracle vì vậy trong một số trờng hợp cần chỉ dẫn cho Oracle thực hiện câu lệnh theo hớng mong muốn.
Ví dụ:
SELECT * FROM tab1 WHERE col1=’A’; SELECT * FROM tab1 WHERE col1=’B’;
Giả sử rằng cột col1 của bảng tab1 chứa các kí tự từ ‘A’ đến ‘Z’ với số lợng là 1000 dòng trong đó 75% số dòng chứa kí tự ‘A’ và mỗi kí tự còn lại chiếm 1% số dòng của bảng. Với câu lệnh thứ nhất dùng phơng pháp duyệt toàn bộ sẽ nhanh hơn sử dụng Index còn trong câu lệnh thứ hai thì sẽ dùng Index thì lại nhanh hơn duyệt toàn bộ. Nh vậy bằng việc sử dụng chỉ dẫn Oracle có thể thực hiện câu lệnh hiệu quả hơn (bộ tối u sẽ sử dụng Index cho cả hai câu lệnh).
Các chỉ dẫn có thể áp dụng cho các câu lệnh đơn SELECT, UPDATE, INSERT và viết theo cú pháp sau:
DELETE SELECT UPDATE /*+ chỉ dẫn chú thích */ hoặc
DELETE SELECT UPDATE
--+ chỉ dẫn
chú thích
Các chỉ dẫn phải đi ngay sau các từ khoá DELETE, UPDATE, INSERT.
Dấu cộng (+) là chỉ thị báo cho Oraclebiết rằng bắt đầu các chỉ dẫn thông dịch và trong các chỉ dẫn này có thể có chứa các chú thích. Có các kiểu chỉ dẫn thực hiện chọn luật tối u, chọn cách truy nhập, chọn thứ tự kết nối và chọn thao tác kết nối.
6.1. Chỉ dẫn chọn luật tối u
ALL_ROWS: Chỉ đẫn này báo cho Oraclebiết phải sử dụng luật tối u ớc lợng giá cho khối lệnh sao cho tổng số tài nguyên đợc sử dụng là tối thiểu (nghĩa là số khối lệnh đợc xử lý đồng thời là tối đa).
Ví dụ:
SELECT /*+ ALL_ROWS */ M NhânViên,TênNhânViên FROM NhânViên WHEREã
M NhânViên=7566;ã
FIRST_ROWS: Chỉ dẫn chọn luật tối u ớc lợng giá với thời gian đáp ứng là tối thiểu (và tối thiểu nguồn tài nguyên đợc sử dụng để trả lại hàng đầu tiên). Chỉ dẫn này sẽ ép Oracle chọn phơng thức truy nhập bằng Index thay cho duyệt toàn bộ (nếu có sẵn Index). Nếu không có sẵn Index thì Oracle sẽ sử dụng phơng thức truy nhật bằng Nested-loop thay cho Merge-sort. Chỉ dẫn này không có tác dụng khi câu lệnh sử dụng toán tử tập hợp (UNION, INTERSEC, MINUS, UNION ALL), mệnh đề GROUP BY, mệnh đề FOR UPDATE, hàm làm việc với nhóm hàng (MIN, MAX, SUM, COUNT) và toán tử DISTINCT.
CHOOSE: Chỉ dẫn này cho phép Oracle chọn luật tối u dựa trên thông tin trong từ điển dữ liệu, nếu có thông tin về các bảng thì luật tối u ớc lợng đợc áp dụng còn ngợc lại thì áp dụng luật tối u cơ bản.
RULE: áp dụng luật tối u cơ bản cho câu lệnh.
6.2. Chỉ dẫn về chọn phơng thức truy nhập
FULL: Sử dụng phơng thức duyệt toàn bộ với một bảng đặc biệt bằng chỉ dẫn FULL(<tên bảng hoặc bí danh>) và nên sử dụng bí danh (alias) cho tên bảng.
Ví dụ:
SELECT /*+ FULL(a) Không sử dụng Index cho bảng NhânViên có bí danh là a */ M NhânViên,ã
FROM NhânViên a
WHERE M NhânViên=7566;ã
ROWID: Sử dụng duyệt bảng bằng ROWID cho một bảng đặc biệt bằng chỉ dẫn
ROWID(<tên bảng hoặc bí danh>).
CLUSTER: Chọn phơng thức duyệt bằng Cluster cho một bảng bằng chỉ dẫn
CLUSTER(<tên bảng hoặc bí danh>) Ví dụ:
SELECT --+ CLUSTER NhânViên TênNhânViên, M Phòngã
WHERE M Phòng=10 AND NhânViên.M Phòng=Phòng.M Phòng;ã ã ã
HASH: Chọn phơng thức truy nhập băm (hash scan) cho một bảng bằng chỉ dẫn HASH(<tên bảng hoặc bí danh>).
INDEX: Chọn cách truy nhập bằng Index cho một bảng theo cú pháp sau
INDEX ( <tên bảng hoặc bí danh> --+
Index
)
Nếu danh sách Index có nhiều giá trị thì Oracle sẽ ớc lợng giá của phơng thức duyệt ứng với mỗi Index và chọn ra phơng thức nào có giá nhỏ nhất. Nếu không Index đợc chỉ ra trong danh sách thì Oracle sẽ tiến hành ớc lợng giá thông qua các Index có sẵn trong CSDL đang truy nhập.
Ví dụ:
SELECT /*+ INDEX(NhânViên giớitính_index) sử dụng Index trên cột giới tính của bảng NhânViên khi mà có ít nữ : GiớiTính=0 */
TênNhânViên, Lơng WHERE GiớiTính=0;
INDEX_ASC: Chỉ dẫn chọn phơng thức truy nhập qua Index và nếu Index đó là
duyệt có giới hạn (Index Range Scan) thì sẽ theo chiều tăng dần của giá trị đợc Index.
INDEX_ASC ( <tên bảng hoặc bí danh> --+
Index
)
INDEX_DESC: Chỉ dẫn chọn phơng thức truy nhập qua Index và nếu Index đó là
duyệt có giới hạn (Index Range Scan) thì sẽ theo chiều giảm dần của giá trị đợc Index.
INDEX_DESC ( <tên bảng hoặc bí danh> --+
Index
)
AND_EQUAL: Chọn phơng thức truy nhập bằng duyệt trên nhiều Index đơn. Tối
thiểu phải có hai Index đơn và tối đa là năm Index đơn. AND_EQUAL ( <tên bảng hoặc bí danh> Index Index
Index
)
Index Index
USE_CONCAT: Chỉ dẫn này buộc điều kiện OR trong mệnh đề WHERE chuyển thành query sử dụng toán tử tập hợp UNION ALL. Thông thờng việc chuyển này chỉ đ- ợc thực hiện khi giá của việc chuyển là nhỏ hơn với giá của câu lệnh ban đầu.
6.3. Chỉ dẫn về thứ tự kết nối trong câu lệnh sử dụng kết nối
ORDERED: Chỉ dẫn thứ tự kết nối tuân theo thứ tự xuất hiện tên các bảng trong mệnh đề FROM.
Ví dụ:
SELECT /*+ ORDERED */ tab1.col1, tab2.col2, tab3.col3 FROM tab1, tab2, tab3 WHERE tab1.col1=tab2.col1 AND tab2.col1=tab3.col1
Các ví dụ đầy đủ hơn sẽ đợc giới thiệu trong phụ lục D. • Chỉ dẫn cho quá trình chọn thao tác kết nối
USE_NL: Chỉ dẫn chọn thao tác kết nối Nested-Loop với bảng nội (inner table) đợc chỉ ra
USE_NL ( <tên bảng hoặc bí danh> )
USE_HASH: Chỉ dẫn chọn thao tác kết nối Hash-Join.
USE_HASH ( <tên bảng hoặc bí danh> )
USE_MERGE: Chỉ dẫn chọn thao tác kết nối Merge-Sort.
USE_NL ( <tên bảng hoặc bí danh> )
Các chỉ dẫn kết nối rất quan trọng để điều khiển quá trình kết nối theo đúng mong muốn của ngời lập trình. Phụ lục D sẽ đa ra một ví dụ có sử dụng chỉ dẫn kết nối
của phần mềm Tra cứu văn bản pháp qui đã giải quyết đợc yêu cầu đặt ra về tốc độ.
Chơng IV
Giới thiệu và tối u hóa câu lệnh SQL