1. Mở đầu
Việc xác định các cột cần được đánh index trong cơ sở dữ liệu có thể trở thành một thách thức lớn đối với các nhà phát triển và quản trị viên cơ sở dữ liệu. Mặc dù các khóa chính (primary keys) thường được tự động đánh index, nhiều trường hợp khác, đặc biệt là các khóa ngoại (foreign keys), cũng nên được xem xét để đánh index. Tuy nhiên, làm thế nào để quyết định cột nào là tối ưu?
Khi tiếp nhận một dự án mới hoặc tối ưu hóa một tính năng, đặc biệt là một bảng đã bị đánh quá nhiều index, việc nhận biết chỉ số nào có thể bị xóa đi lại càng trở nên khó khăn hơn. Việc duy trì nhiều index làm tăng chi phí cập nhật dữ liệu—mỗi khi một bản ghi mới được chèn vào, tất cả các index đều phải được cập nhật. Do đó, điều này tạo ra một bài toán lớn cho việc loại bỏ các index không hiệu quả mà vẫn bảo đảm hiệu suất truy vấn.
2. Giải pháp với Chỉ số Vô hình
Trong hệ thống Oracle, chúng ta may mắn có một giải pháp hiệu quả là Chỉ số Vô hình (Invisible Index). Oracle cho phép chúng ta biến một index trở nên vô hình, mà vẫn duy trì nó trong hệ thống. Nhờ khả năng này, các thao tác DML như INSERT, UPDATE, và DELETE vẫn có thể cập nhật dữ liệu cho chỉ số mà không làm hỏng hiệu suất của các truy vấn. Để thay đổi trạng thái của một index, chúng ta có thể sử dụng các lệnh sau:
sql
ALTER INDEX idx1 INVISIBLE;
ALTER INDEX idx1 VISIBLE;
CREATE INDEX … INVISIBLE;
Dưới đây là một ví dụ cho thấy cách tạo một Chỉ số Vô hình trên cột DEPTNO của bảng EMP và thực hiện truy vấn mà không sử dụng index. Trong trường hợp cần thiết, chúng ta vẫn có thể buộc Oracle sử dụng index này bằng cách sử dụng hint USE_INVISIBLE_INDEXES hoặc thay đổi tham số khởi tạo OPTIMIZER_USE_INVISIBLE_INDEXES thành TRUE. Một khi chúng ta làm cho index trở nên hiển thị, các hint trước đó sẽ không còn cần thiết.
Ngoài ra, chúng ta có thể sử dụng hint NO_INDEX để tắt một index trước khi biến nó trở thành vô hình. Điều này cho phép chúng ta kiểm tra xem có index nào khác được sử dụng hay không, giúp tối ưu hóa hiệu suất truy vấn tối đa nhất.
sql
SELECT * FROM EMP WHERE DEPTNO = 10 NO_INDEX(idx1);
Một điểm quan trọng khác là chúng ta có thể dễ dàng chuyển đổi trạng thái của index giữa hiển thị và vô hình. Để kiểm tra trạng thái hiện tại của index, chúng ta có thể truy vấn trong các bảng như USER_INDEXES hoặc DBA_INDEXES.
Mẹo
Việc sử dụng Chỉ số Vô hình cho phép chúng ta tắt tạm thời một index để kiểm tra hiệu suất của các truy vấn mà không cần đến index đó. Nếu muốn, việc kích hoạt lại index cũng rất đơn giản và nhanh chóng.
3. Kết nối và thảo luận
Nếu bạn muốn cùng thảo luận thêm về bài viết này hoặc có bất kỳ câu hỏi nào, hãy kết nối với tôi qua các kênh mạng xã hội:
- LinkedIn: Nguyễn Trung Nam
- Facebook: Trung Nam Nguyễn
Rất mong được kết nối và cùng trao đổi kiến thức!
source: viblo