Tăng tốc database phần 15.3 Indexing NULL trong Oracle - Giả lập Partial Indexes trong Oracle
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
All rights reserved