+4

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí