Chủ Nhật, 2 tháng 4, 2023

Tăng tốc database phần 15.1 Indexing NULL trong Oracle

Nếu các bạn chưa xem bài trước vui lòng xem tại đây. Trong Oracle nếu tất cả các cột trong được đánh index là NULL thì bản ghi đó sẽ không có trong index. Điều đó nghĩa là tất cả các index là partial index giống như điều kiện sau.

CREATE INDEX idx
          ON tbl (A, B, C, ...)
       WHERE A IS NOT NULL
          OR B IS NOT NULL
          OR C IS NOT NULL
             ...

Giả sử chúng ta có một index EMP_DOB trên cột date_of_birth trong bảng employee. Khi chúng ta insert dữ liệu như sau:

INSERT INTO employees ( subsidiary_id, employee_id
                      , first_name   , last_name
                      , phone_number)
               VALUES ( ?, ?, ?, ?, ? )

vì không có giá trị của cột date_of_birth nên giá trị cột sẽ là NULL, nên bản ghi này sẽ không được thêm vào index EMP_DOB. Kết quả là câu truy vấn sau sẽ không được hỗ trợ bởi index

SELECT first_name, last_name
  FROM employees
 WHERE date_of_birth IS NULL

Tuy nhiên nếu chúng ta tạo một index có hai trường như sau:

CREATE INDEX demo_null
          ON employees (subsidiary_id, date_of_birth)

Trong trường hợp như trên bản ghi được thêm vào index vì SUBSIDIARY_ID là khác NULL. Trường hợp này truy vấn sau có thể sử dụng index để tăng hiệu năng khi tìm kiếm một bản ghi trong một subsidiary mà có date_of_birth là NULL

SELECT first_name, last_name
  FROM employees
 WHERE subsidiary_id = ?
   AND date_of_birth IS NULL

Hãy nhớ rằng index hoạt động trong toàn bộ điều kiện where với kiểu INDEX RANGE SCAN. Tuy nhiên trong câu trên thì cần chỉ rõ bản ghi thuộc subsidiary nào? Nếu ta muốn tìm toàn bộ các bản ghi có giá trị date_of_birth là NULL thì làm thế nào?

Lúc đó chúng ta để cột date_of_birth là trường bên trái nhất của index, và add thêm một trường not null ở bên phải, ví dụ trường subsidiary_id. Mặc dù trường này không có trong câu truy vấn, nhưng nó đảm bảo bản ghi có date_of_birth là NULL vẫn được thêm vào index. Giúp câu truy vấn dưới đây được hỗ trợ bởi index.

SELECT first_name, last_name
  FROM employees
 WHERE date_of_birth IS NULL

Có một cách khác để index không thể NULL là sử dụng một constant expression không thể bị NULL. Nó đảm bảo rằng tất cả các bản ghi được thêm vào index dù cho date_of_birth bị NULL đi chăng nữa.

DROP   INDEX emp_dob
CREATE INDEX emp_dob ON employees (date_of_birth, '1')

Về mặt kỹ thuật, đó là function-based index. Điều này cho phép bạn index trên các giá trị NULL trong Oracle.

=============================
* 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/Zalo: 0902912888
👨 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

=============================
oracle tutorial, 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,sql tutorial, khóa học pl/sql tutorial, 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 RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

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