Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chỉ mục Oracle 11 chỉ cho một phần dữ liệu

Trước tiên, hãy đảm bảo rằng tôi hiểu đúng câu hỏi:

  • Bạn muốn tăng tốc SELECT .. WHERE C_D IS NULL nhưng bạn không muốn tăng tốc bất kỳ truy vấn nào tìm kiếm C_D không phải NULL.
  • Bạn cũng muốn đảm bảo không có giá trị NULL "không cần thiết" nào trong chỉ mục để tiết kiệm dung lượng.

Nếu sự hiểu biết đó là đúng, thì những gì bạn cần là một chức năng mục lục. I E. một chỉ mục trên một hàm trên một trường, không phải chính một trường ...

CREATE INDEX T_IE1 ON T (CASE WHEN C_D IS NULL THEN 1 ELSE NULL END) COMPRESS

... mà sau đó bạn sẽ truy vấn là ...

SELECT * FROM T WHERE (CASE WHEN C_D IS NULL THEN 1 ELSE NULL END) = 1

... tương đương với ...

SELECT * FROM T WHERE C_D IS NULL

... nhưng nhanh hơn vì nó sử dụng chỉ mục:

Điều này tiết kiệm không gian vì các chỉ mục cột đơn không lưu trữ NULL. Ngoài ra, hãy sử dụng COMPRESS vì chỉ mục sẽ chỉ chứa một khóa nên không cần tốn dung lượng khi lặp đi lặp lại cùng một khóa trong cấu trúc chỉ mục.

LƯU Ý:Trong Oracle 11, bạn cũng có thể tạo một cột ảo dựa trên hàm (dựa trên CASE biểu thức trên), sau đó lập chỉ mục và truy vấn trực tiếp trên cột đó, để lưu một số thao tác nhập lặp lại.

--- CHỈNH SỬA ---

Nếu bạn cũng muốn truy vấn trên C_I cùng với C_D IS NULL , bạn có thể ...

CREATE UNIQUE INDEX T_IE2 ON T (C_I, CASE WHEN C_D IS NULL THEN 1 ELSE NULL END)

... và truy vấn nó bằng (ví dụ) ...

SELECT * FROM T WHERE C_I > 'some value' AND (CASE WHEN C_D IS NULL THEN 1 ELSE NULL END) = 1

... tương đương với ...

SELECT * FROM T WHERE C_I > 'some value' AND C_D IS NULL

... nhưng nhanh hơn, vì nó sử dụng chỉ mục T_IE2 .

Trên thực tế, đây là chỉ mục duy nhất mà bạn cần trên bảng của mình (nó "bao phủ" khóa chính, vì vậy bạn không cần chỉ mục riêng trên C_I nữa). Điều này cũng có nghĩa là một ROWID giống nhau không bao giờ được lưu trữ trong nhiều chỉ mục, điều này giúp tiết kiệm dung lượng.

LƯU Ý:COMPRESS không còn có ý nghĩa đối với chỉ mục T_IE2 .

--- CHỈNH SỬA 2 ---

Nếu bạn quan tâm đến sự đơn giản hơn không gian, bạn chỉ có thể tạo chỉ mục tổng hợp trên {C_I, C_D}. Oracle lưu trữ các giá trị NULL trong chỉ mục tổng hợp miễn là có ít nhất một giá trị không phải NULL trong cùng một bộ giá trị:

CREATE UNIQUE INDEX T_IE3 ON T (C_I, C_D)

Điều này sử dụng chỉ mục:

SELECT * FROM T WHERE C_I > 1 AND C_D IS NULL

Như trong EDIT trước, đây là chỉ mục duy nhất bạn cần trên bảng của mình.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cài đặt Oracle Grid - Thiếu các Gói compat-libcap1-1.10 và các gói khác

  2. Trả về nhiều giá trị từ hàm Oracle

  3. Cách tạo một công việc, khi job_action cần gọi một thủ tục có tham số CLOB

  4. Tham gia bên ngoài Oracle không hoạt động như mong đợi

  5. cố gắng xuất mã nguồn java từ cơ sở dữ liệu Oracle