Các bạn có thể xem bài trước tại đây
Với tính chất không index NULL của Oracle, có thể giả lập partial index bằng cách tạo một hàm trả về NULL cho những bản ghi không cần index. Giả sử chúng ta cần tạo một Partial Indexes như sau:
CREATE INDEX messages_todo ON messages (receiver) WHERE processed = 'N'
Với câu lệnh trên chúng ta chỉ muốn index những bản ghi chưa được thực hiện (processed='N'). Để làm điều này chúng ta cần tạo một function trả về RECEIVER chỉ khi PROCESSED='N'
CREATE OR REPLACE
FUNCTION pi_processed(processed CHAR, receiver NUMBER)
RETURN NUMBER
DETERMINISTIC
AS BEGIN IF processed IN ('N') THEN RETURN receiver; ELSE RETURN NULL; END IF;
END
Function trên là deterministic nên có thể index trên function đó đươc. Chúng ta sẽ tạo index trên function này, và sẽ được được kết quả giống với partial index
CREATE INDEX messages_todo ON messages (pi_processed(processed, receiver))
Để sử dụng index này cần truy vấn như sau
SELECT message FROM messages WHERE pi_processed(processed, receiver) = ?
----------------------------------------------------------
|Id | Operation | Name | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 5330 |
| 1 | TABLE ACCESS BY INDEX ROWID| MESSAGES | 5330 |
|*2 | INDEX RANGE SCAN | MESSAGES_TODO | 5303 |
---------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("PI_PROCESSED"("PROCESSED","RECEIVER")=:X)
Mình có lập group Standard Dev các bạn có thể Join để xây dựng một cộng đồng lập trình viên level quốc tế nhé! Ngoài ra mình nhận tư vấn, đào tạo, hỗ trợ các vấn đề khó hoặc hiệu năng cho các sản phẩm, bạn nào có nhu cầu có thể liên hệ mình nhé! email nghiand1010@gmail.com