Concatenated Indexes Oracle Database
1. Mở đầu
Trước khi bước vào con đường "tu luyện" với các chỉ mục kết hợp, hãy đảm bảo bạn có bí kíp trong tay. Cũng giống như chọn vũ khí cho một trận chiến, chỉ mục đúng sẽ giúp bạn tăng hiệu suất truy vấn, còn chỉ mục sai... thì chúng có thể đang tự tay bóp ... mình!
2. Phân tích
Khi một index có nhiều cột được đánh chỉ mục, nó được gọi là chỉ mục kết hợp hoặc chỉ mục phức hợp. Mặc dù việc Oracle giới thiệu truy cập chỉ mục skip-scan đã giúp cho trình tối ưu hóa sẽ có nhiều tùy chọn hơn khi sử dụng chỉ mục kết hợp, chúng ta nên chú ý chọn thứ tự các cột trong chỉ mục. Thông thường, cột đầu tiên trong chỉ mục nên là cột có khả năng xuất hiện nhiều nhất trong các câu lệnh WHERE và cũng là cột có tính chọn lọc cao nhất trong nhóm.
Trước khi chức năng skip-scan được giới thiệu, các truy vấn chỉ có thể sử dụng index nếu cột đầu tiên của chỉ mục xuất hiện trong câu lệnh WHERE. Xem xét ví dụ sau với bảng EMP có một chỉ mục kết hợp (ba phần) trên các cột EMPNO, ENAME và DEPTNO. Lưu ý rằng EMPNO là phần đầu tiên, ENAME là phần thứ hai, và DEPTNO là phần thứ ba. Nếu chúng không sử dụng chức năng skip-scan, Oracle thường sẽ không sử dụng chỉ mục này trừ khi câu lệnh WHERE của chúng ta chỉ định một giá trị cho cột đầu tiên (EMPNO).
Vì ENAME không phải là cột đầu tiên của chỉ mục, trình tối ưu hóa có thể quyết định không sử dụng chỉ mục. Với chức năng skip-scan, trình tối ưu hóa có thể chọn sử dụng chỉ mục ngay cả khi không có giá trị EMPNO được chỉ định trong câu lệnh WHERE. Thay vào đó, trình tối ưu hóa có thể thực hiện fast full scan index hoặc quét toàn bộ bảng.
Điều tương tự cũng đúng nếu cột thứ ba của chỉ mục được sử dụng trong câu lệnh WHERE:
Trong danh sách này, câu lệnh WHERE chỉ định một giá trị cho cột thứ ba trong chỉ mục. Trình tối ưu hóa có thể chọn thực hiện truy cập chỉ mục skip-scan, fast full scan index, hoặc quét toàn bộ bảng. Bằng cách tạo chỉ mục, chúng ta đã cung cấp cho cơ sở dữ liệu nhiều lựa chọn hơn khi thực hiện truy vấn, hy vọng sẽ cải thiện hiệu suất tổng thể. Lưu ý rằng code của người dùng không thay đổi; trình tối ưu hóa nhận thức về chỉ mục và đưa ra quyết định dựa trên chi phí dự đoán của từng lựa chọn.
Trong ví dụ dưới đây, một phần của index được sử dụng. Cột đầu tiên, EMPNO, được dùng làm điều kiện giới hạn trong câu lệnh WHERE để Oracle có thể sử dụng phần đầu của index (nếu phần thứ hai, ENAME, cũng có trong câu WHERE cùng với EMPNO, thì nó sẽ sử dụng hai phần; nếu cả ba phần đều có, thì toàn bộ index sẽ được sử dụng—giải pháp tối ưu và giới hạn nhất). Trong ví dụ này, ta chỉ sử dụng phần đầu tiên của index với điều kiện trên EMPNO:
Có hai loại quét index phổ biến nhất là index unique scan và index range scan. Trong index unique scan, cơ sở dữ liệu biết rằng index chứa danh sách các giá trị duy nhất. Trong index range scan, cơ sở dữ liệu trả về nhiều giá trị từ index dựa trên tiêu chí truy vấn. Để tạo một unique index, sử dụng lệnh CREATE UNIQUE INDEX khi tạo index.
Khi chúng ta tạo khóa chính hoặc ràng buộc UNIQUE, Oracle tự động tạo một unique index dựa trên các cột chúng ta chỉ định (trừ khi ràng buộc được tạo với mệnh đề DISABLE). Nếu chúng ta tạo khóa chính nhiều cột, Oracle tạo một concatenated index với các cột theo cùng thứ tự mà chúng ta đã chỉ định khi tạo khóa chính.
TIP
Tránh việc hard-code ROWID của Oracle vào code cụ thể. Cấu trúc ROWID trong quá khứ đã thay đổi từ phiên bản này sang phiên bản khác và có khả năng sẽ thay đổi nữa trong các phiên bản tương lai. Mình khuyên anh em không nên hard-code ROWID.
3. Thông tin kết nối
Nếu anh em muốn trao đổi thêm về bài viết, hãy kết nối với mình qua LinkedIn và Facebook:
- LinkedIn: https://www.linkedin.com/in/nguyentrungnam/
- Facebook: https://www.facebook.com/trungnam.nguyen.395/
Rất mong được kết nối và cùng thảo luận!
All rights reserved