C. Hệ quản trị CSDL Oracle
5. Các phơng thức truy nhập dữ liệu
Phơng thức truy nhập dữ liệu (Acces Path) là cách thức truy nhập tới một hàng của bảng. Dới đây là bảng các phơng thức truy nhập sắp xếp theo độ u tiên cao đến thấp.
thứ tự Cách truy nhập
1 Chọn một hàng bằng ROWID
2 Chọn một hàng bằng Cluster kết nối
3 Chọn một hàng bằng hàm băm với khoá duy nhất hay khoá chính
4 Chọn một hàng bằng khoá duy nhất hay khoá chính
5 Dùng Cluster kết nối
6 Dùng khoá của hàm băm
7 Dùng khoá Index
8 Kết hợp các khoá
9 Index các cột đơn
10 Giới hạn vùng tìm trên cột đã Index
11 Không giới hạn vùng tìm trên cột đã Index
13 MAX hoặc MIN của cột đã Index
14 ORDER BY trên các cột Index
15 Duyệt toàn bộ (Full Table Scan)
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.
5.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:
• 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.
• 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
WHERE NhânViên.M Phòng=Phòng.M Phòng AND NhânViên.M NhânViên=7900;ã ã ã
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:
• 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.
• 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 khoá 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.
SELECT * FROM NhânViên WHERE M NhânViên = 7900;ã
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.
VD: SELECT * FROM NhânViên, Phòng WHERE NhânViên.M Phòng = Phòng.M Phòng;ã ã
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. SELECT * FROM NhânViên WHERE M Phòng=10;ã
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.
SELECT * FROM NhânViên WHERE Nghề = 'Th kí' AND M Phòng = 10;ã
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í';
Nế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.
SELECT * FROM NhânViên WHERE Nghề = 'Phân tích viên' AND M Phòng = 20;ã
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. SELECT * FROM NộiDungHoáĐơn WHERE M HoáĐơn > 65118968;ã
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.
5.12. Sắp xếp kết nối
Nế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. SELECT * FROM NhânViên, Phòng WHERE NhânViên.M Phòng = Phòng.M Phòng;ã ã
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
• 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)
• Không có biểu thức khác trong danh sách chọn
• 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: • 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.
• Đả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 đề ORDER BY.
• 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. SELECT * FROM NhânViên ORDER BY M NhânViên;ã
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.
VD: SELECT * FROM NhânViên;
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. • <tên cột 1> < <tên cột 2> • <tên cột 1 > > <tên cột 2> • <tên cột 1 > >= <tên cột 2> • <tên cột 1> <= <tên cột 2> trong đó cột 1 và cột 2 là cùng một bảng. • <tên cột> IS NULL
• <tên cột> IS NOT NULL
• <tên cột> NOT IN • <tên cột> != <biểu thức>
• <tên cột> LIKE '%mẫu'
trong đó bất kể là cột đã đợc Index. • <biểu thức> = <biểu thức>
biể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.
• NOT EXISTS subquery
• 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ộ.