Thứ Tư, 21 tháng 9, 2022

Invisible Index trong Oracle Database

Invisible index được giới thiệu từ oracle 11g. Như tên gọi bc ủa nó, index này sẽ bị bỏ qua bởi optimizer khi phân tích plan câu lệnh, nó được coi như không tồn tại. 

VÍ DỤ:

—  CREATE AN INDEX (THEO MẶC ĐONHJ LÀ VISIBLE)

SQL> desc emp
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER

SQL> select count(*) from emp;

COUNT(*)
----------
90323


SQL> create index EMP_ID1 on DBACLASS.EMP(OBJECT_ID);

Index created.

-- Kiểm tra index là visible
 SQL> select index_name,VISIBILITY from dba_indexes where index_NAME='EMP_ID1';
  INDEX_NAME VISIBILIT
------------------- ---------
EMP_ID1 VISIBLE

Kiểm tra explain plan:

SQL> explain plan for select count(*) from dbaclass.emp where object_id=1;

Explained.

SQL> select * from table(dbms_xplan.display)
2 ;

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
Plan hash value: 853747123

-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 1 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
|* 2 | INDEX RANGE SCAN| EMP_ID1 | 1 | 5 | 1 (0)| 00:00:01 | -->>> INDEX USED
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("OBJECT_ID"=1)

14 rows selected.

 Chúng ta có thể thấy optimuzer đang sử dụng index trong câu truy vấn. 

Khi nào index là INVISIBLE:

 Bây giờ chúng ta sẽ tạo INDEX invisible và check explain plan của câu truy vấn trên:

SQL> alter index EMP_ID1 invisible;

Index altered.

SQL> select index_name,VISIBILITY from dba_indexes where index_NAME='EMP_ID1';

INDEX_NAME VISIBILIT
------------------- ---------
EMP_ID1 INVISIBLE

SQL> explain plan for select count(*) from dbaclass.emp where object_id=1;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
Plan hash value: 2083865914

---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 149 (2)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
|* 2 | TABLE ACCESS FULL| EMP | 1 | 5 | 149 (2)| 00:00:01 | -->> FULL TABLE SCAN
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("OBJECT_ID"=1)

14 rows selected.

 

Như trên chúng ta có thể thấy rằng câu lệnh KHÔNG quét index  (index scan) mà thay vào đó là full table scan, do index là invisible.

Tạo index invisible trực tiếp:

SQL> create index EMP_IDINV on DBACLASS.EMP(OBJECT_ID) invisble;

SQL> select index_name,VISIBILITY from dba_indexes where index_NAME='EMP_IDINV';

INDEX_NAME VISIBILIT
------------------- ---------
EMP_IDINV INVISIBLE

Tham số optimizer_use_invisible_indexes liên quan đến việc index invisible có được dùng hay không. Mặc định optimizer_user_invisible_indexes đặt là FALSE, tức là optimizer sẽ bỏ qua invisible indexes trong database.

SQL> show parameter invi

NAME TYPE VALUE
------------------------------------ ----------- --------------------
optimizer_use_invisible_indexes boolean FALSE

Để ép optimizer sử dụng mọi invisible indexes bạnncaanf đặt tham số này là TRUE.

SQL> alter system set optimizer_use_invisible_indexes=TRUE scope=both;

System altered.

SQL> show parameter optimizer_use_invisible_indexes

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_use_invisible_indexes boolean TRUE
SQL>


SQL> select index_name,VISIBILITY from dba_indexes where index_NAME='EMP_ID1';

INDEX_NAME VISIBILIT
------------------- ---------
EMP_ID1 INVISIBLE

SQL> explain plan for select count(*) from dbaclass.emp where object_id=1;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
Plan hash value: 853747123

-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 1 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
|* 2 | INDEX RANGE SCAN| EMP_ID1 | 1 | 5 | 1 (0)| 00:00:01 | --- >>>>>> INDEX USED
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("OBJECT_ID"=1)

14 rows selected.

 Chúng ta có thể thấy index invisile được sử dụng rồi do chúng ta đặt tham số là TRUE.  

Vậy khi nào chúng ta sử dụng index invisible?

 Đây có lẽ là điều chúng ta mong đợi nhất. Phần lớn chúng ta sử dụng index invisible khi đang chuẩn bị xoá index đó. Khi chúng ta lên kế hoạch xoá index, hay đặt index là invisible và giám sát 1 vài ngày, khi nghiệp vụ không ảnh hưởng gì chúng ta có thể tự tin drop index đó được (chú ý là khi drop index xong, việc tạo lại index mất rất nhiều thời gian đặc biệt bảng lớn, bảng core, với các bảng đó việc xoá index sẽ gây cao tải,treo Db, chậm nghiệp vụ)  

THAM KHẢO THÊM

Tham số OPTIMIZER_USE_INVISIBLE_INDEXES

Hy vọng hữu ích cho bạn  

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
optimizer, invisible index, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master