Chỉ mục ảo trong Oracle là gì?
- Chỉ mục ảo là một chỉ mục "giả" có định nghĩa tồn tại trong từ điển dữ liệu, nhưng không có phân đoạn chỉ mục liên quan.
- Nhiều lần cố vấn điều chỉnh sql khuyên bạn nên tạo chỉ mục mới và bạn muốn kiểm tra chỉ mục mới. Trong trường hợp này, có thể mất nhiều thời gian để thêm chỉ mục vào các bảng lớn và nó cũng sẽ tiêu tốn dung lượng đĩa lớn nếu bảng lớn. ứng dụng của bạn mà bạn hiện không thử nghiệm. Điều này có thể gây ra vấn đề đặc biệt khi bạn đang cố gắng xác định các vấn đề trên một hệ thống sản xuất. Chỉ mục ảo giải quyết vấn đề này
- Mục đích của chỉ mục ảo là mô phỏng sự tồn tại của chỉ mục - mà không thực sự tạo chỉ mục đầy đủ
- Điều này cho phép các nhà phát triển chạy một kế hoạch giải thích như thể chỉ mục hiện diện mà không cần đợi quá trình tạo chỉ mục hoàn tất và không sử dụng thêm dung lượng đĩa.
- Chúng tôi có thể phân tích các chỉ mục ảo.
- Bạn không thể xây dựng lại một chỉ mục ảo; nó ném ORA-8114:“Người dùng đã cố gắng thay đổi chỉ mục giả mạo”
- Bạn có thể giảm chỉ số này như một chỉ mục bình thường.
SQL> drop index <index_name>;
Những điểm quan trọng cần nhớ
(1) Chúng tôi cần đặt “_USE_NOSEGMENT_INDEXES” thành true ở cấp phiên để sử dụng tính năng này
(2) Chỉ mục ảo được tạo với việc bổ sung phần không có phân đoạn vào cuối tập lệnh tạo chỉ mục
Ví dụ để chứng minh việc sử dụng Chỉ mục ảo trong Oracle
(1) Tạo một bảng mẫu, nói virtual_test_t
SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;
(2) Chọn bất kỳ giá trị nào từ bảng
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
(3) Kiểm tra kế hoạch Giải thích tiên tri cho truy vấn CHỌN.
SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |
(4) Tạo chỉ mục ảo trên bảng đã tạo.
SQL> create index test_index_v on virtual_test_t(object_name) nosegment;
Hãy nhớ rằng, để tạo chỉ mục ảo, bạn cần chỉ định mệnh đề NOSEGMENT trong câu lệnh CREATE INDEX.
Cũng lưu ý khi thực hiện câu lệnh trên, một phân đoạn chỉ mục sẽ không được tạo.
(5) Bạn có thể kiểm tra tương tự như sau:
SQL> set autotrace off
SQL> select index_name from dba_indexes where table_name = 'VIRTUAL_TEST_T' and index_name = 'TEST_INDEX_V';
no rows selected
SQL> col OBJECT_NAME format a20;
SQL> select object_name, object_type from dba_objects where object_name = 'TEST_INDEX_V';
Vì vậy, đối tượng tồn tại trong cơ sở dữ liệu, nhưng chúng tôi không có phân đoạn cho đối tượng giống nhau.
(6) Bây giờ chạy tương tự để kiểm tra xem chỉ mục có đang được sử dụng hay không.
SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |
Chúng tôi có thể quan sát rõ ràng rằng chỉ mục này không được sử dụng.
(7) Để sử dụng chỉ mục ảo đã tạo, chúng ta cần đặt tham số _USE_NOSEGMENT_INDEXES thành true.
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.
(8) Bây giờ, hãy chạy cùng một câu lệnh SELECT.
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 5 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| VIRTUAL_TEST_T | 8 | 1416 | 5 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TEST_INDEX_V | 216 | | 1 (0)| 00:00:01 |
Sau khi bạn đặt tham số ẩn này, trình tối ưu hóa oracle sẽ bắt đầu sử dụng chỉ mục ảo mà bạn đã tạo trên bảng này.
Nếu bạn chạy truy vấn này từ bất kỳ phiên nào khác, nó sẽ không sử dụng chỉ mục ảo này (như chúng tôi đã sử dụng “alter câu lệnh session ”).