Các luật tối u

Một phần của tài liệu Phân tích và tối ưu hóa câu lệnh SQL (Trang 36 - 40)

C. Hệ quản trị CSDL Oracle

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:

SELECT M NhânViên FROM NhânViên WHERE TênNhânViên='CHUNG' AND Lã ơng>2000;

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. + 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:

• Độ lớn của quan hệ R: UR.

• Số lợng giá trị thuộc tính A trong quan hệ R: U(A,R). • Số lợng các trang bộ nhớ để chứa quan hệ R còn rỗi: PR. • Số lợng dòng (row) tơng ứng với một trang 1 trang: bR.

• Số lợng các trang bộ nhớ RAM vật lý còn rỗi: M

• 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:

❑ 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: • Các toán tử đợc sử dụng trong mệnh đề WHERE

• Khoá duy nhất hoặc khoá chính đợc sử dụng trong mệnh đề WHERE • 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.

❑ Tham số DB_FILE_MULTIBLOCK_READ_COUNT: Duyệt toàn bộ thờng sử dụng đọc

đa khối (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.

VD: 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ừ:

❑ Tham số USER_TAB_COLUMNS.NUM_DISTINCT: Số lợng tập giá trị khác nhau cho

mỗi cột.

❑ Tham số USER_TABLES.NUM_ROWS: Số lợng cột trong mỗi bảng.

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: M NhânViên>=7500 có tính chọn lọc là S1ã

M NhânViên<=7800 có tính chọn lọc là S2ã

Vậy câu lệnh ban đầu có tính chọn lọc là S: S=ABS(S1+S2-1)

Một phần của tài liệu Phân tích và tối ưu hóa câu lệnh SQL (Trang 36 - 40)

Tải bản đầy đủ (DOC)

(96 trang)
w