1. Giới Thiệu
Việc vô tình ngăn chặn chỉ mục trong SQL là một trong những sai lầm phổ biến mà các nhà phát triển mới gặp phải. Đặc biệt, Oracle có một trình tối ưu hóa mạnh mẽ nhằm tối ưu hóa việc truy xuất dữ liệu, nhưng có nhiều yếu tố có thể khiến chỉ mục không được tận dụng hiệu quả. Bài viết này sẽ trình bày những tình huống cụ thể mà việc sử dụng câu lệnh WHERE có thể ngăn Oracle sử dụng chỉ mục.
2. Sử Dụng Các Toán Tử NOT EQUAL: <>
, !=
Các chỉ mục chỉ có thể được sử dụng khi tìm kiếm dữ liệu tương ứng trong bảng. Khi sử dụng các toán tử NOT EQUAL trong câu lệnh WHERE, chỉ mục trên các cột đó sẽ không được áp dụng. Ví dụ, đối với bảng CUSTOMERS có chỉ mục trên cột CUST_RATING, câu truy vấn sau sẽ dẫn đến việc quét toàn bộ bảng, mặc dù cột đó đã được đánh chỉ mục.
Khi thực hiện phân tích bảng, Oracle sẽ thu thập thống kê về phân bố dữ liệu, từ đó quyết định có nên sử dụng chỉ mục cho một số giá trị nhất định hay không. Trong quá trình phát triển và kiểm tra, cần sử dụng tập dữ liệu đại diện để mô phỏng sự phân bố trong môi trường thực tế.
MẸO
Bạn có thể tạo chỉ mục và phân tích chúng cùng một lúc bằng cách sử dụng mệnh đề COMPUTE STATISTICS khi tạo chỉ mục. Oracle tự động tính toán thống kê cho tất cả các thao tác tạo hoặc tái xây dựng chỉ mục khi chỉ mục không rỗng.
3. Sử Dụng IS NULL hoặc IS NOT NULL
Khi sử dụng IS NULL hoặc IS NOT NULL trong mệnh đề WHERE, việc sử dụng chỉ mục sẽ bị vô hiệu hóa. Giá trị NULL không được xác định và không tồn tại giá trị nào trong cơ sở dữ liệu bằng với NULL. Do đó, ở điều kiện thông thường, câu lệnh truy vấn có chứa NULL sẽ dẫn đến việc quét toàn bộ bảng.
Để ngăn giá trị NULL cho các cột, nên đặt NOT NULL khi tạo hoặc thay đổi bảng. Với các bảng đã có dữ liệu, một cột chỉ có thể được đặt là NOT NULL nếu tất cả các hàng đều có giá trị không NULL.
MẸO
Việc tạo bảng với chỉ định NOT NULL sẽ loại bỏ khả năng xuất hiện giá trị NULL, từ đó cải thiện hiệu suất truy vấn.
4. Sử Dụng LIKE
Sử dụng LIKE trong một số trường hợp có thể tận dụng chỉ mục, tuy nhiên không phải tất cả. Hai cách phổ biến nhất là LIKE ‘%giá_trị%’ và LIKE ‘giá_trị%’. Chỉ trong trường hợp LIKE ‘giá_trị%’, chỉ mục mới được sử dụng.
Hãy xem một ví dụ cụ thể trên bảng SCOTT.EMP, nơi chỉ mục đã được tạo ra trên cột ENAME. Khi thực hiện tìm kiếm với LIKE, sự hiện diện của dấu ‘%’ trước giá trị tìm kiếm sẽ dẫn đến việc không sử dụng chỉ mục.
5. Sử Dụng Các Hàm
Sử dụng các hàm trong mệnh đề WHERE trên các cột đã được lập chỉ mục thường khiến trình tối ưu hóa bỏ qua chỉ mục. Một ví dụ là TRUNC, SUBSTR, TO_DATE,… Khi áp dụng các hàm này, chỉ mục sẽ không được sử dụng. Thay vào đó, bạn nên thay đổi giá trị so sánh chứ không phải là giá trị cột.
MẸO
Hãy cố gắng thay đổi các giá trị so sánh thay vì thay đổi cột để đảm bảo việc sử dụng chỉ mục.
6. So Sánh Các Loại Dữ Liệu Không Khớp
Một vấn đề phổ biến khác là so sánh các loại dữ liệu khác nhau. Oracle tự động chuyển đổi kiểu dữ liệu để phù hợp với loại dữ liệu đang so sánh. Điều này có thể dẫn đến việc không sử dụng chỉ mục và quét toàn bộ bảng.
MẸO
Nắm rõ kiểu dữ liệu giúp bạn tránh được những vấn đề về hiệu suất và hiểu rõ tại sao một số truy vấn lại dẫn đến full table scan.
7. Liên Hệ
Nếu bạn muốn thảo luận thêm về chủ đề 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 LinkedIn và Facebook:
Rất mong được kết nối và cùng thảo luận!
source: viblo