2010-05-17 21 views
10

Làm cách nào để chúng tôi thực hiện lập chỉ mục trên trường datetime trong oracle. Chúng ta nên có thể tìm kiếm trong một năm cụ thểoracle datetime field indexing

Cảm ơn

Trả lời

8

Để tạo một chỉ mục trong Oracle, sử dụng:

CREATE INDEX your_index_name ON your_table_name(your_column_name) 

Đối với thông tin thêm về việc tạo chỉ mục Oracle, đọc this link.

Correction & Làm rõ
Nếu bạn sử dụng một chức năng để cô lập một thành phần của một ngày (IE: EXTRACT, hoặc TRUNC), một chỉ mục trên cột sẽ không giúp đỡ. Nhưng một chỉ số sẽ giúp đỡ nếu bạn cung cấp một phạm vi ngày:

WHERE your_date_column BETWEEN TO_DATE('2010-01-01', 'YYYY-MM-DD') 
              AND TO_DATE('2010-12-31', 'YYYY-MM-DD') 

Tuy nhiên Bạn có thể tạo chức năng chỉ có trụ sở tại Oracle:

CREATE INDEX your_index_name 
    ON your_table_name(EXTRACT(YEAR FROM your_column_name)) 

... mà DBAs bất đắc dĩ với một niềm đam mê.

0

Thêm một chỉ số mà không bị ràng buộc vào một cột, nhưng một biểu thức trích xuất năm từ cột rằng:

create index sample_index on YourTable (extract(year from YourDateColumn)) tablesapce YourIndexSpace; 

Khi bạn truy vấn bảng bằng cách sử dụng biểu thức đó, Oracle sẽ sử dụng chỉ mục.

3

Bạn có thể chỉ mục một cột DATE (mà các cửa hàng ngày và thời gian trong Oracle) trực tiếp:

CREATE INDEX ix ON table (column) 

Oracle sẽ có thể sử dụng chỉ số này trực tiếp nếu bạn xây dựng truy vấn của bạn để thực hiện một SCAN RANGE. Ví dụ: nếu bạn muốn truy lục các hàng từ năm 2010:

SELECT ... 
    FROM table 
WHERE column >= DATE '2010-01-01' 
    AND column < DATE '2011-01-01' 

Chỉ mục này cũng có thể được sử dụng để trả lời các truy vấn cho một tháng cụ thể, ngày hoặc bất kỳ phạm vi nào khác.

0

Chỉ cần tạo chỉ mục như được hiển thị ở trên. KHÔNG SỬ DỤNGTRUNCFUNCTION, vì nó bỏ qua bất kỳ chỉ mục nào. Ví dụ, lĩnh vực datecreate của tôi có định dạng sau 03.12.2009 16:55:52 Vì vậy, tôi sử dụng để sử dụng

trunc(datecreate, 'dd')=to_date(to_char(sysdate,'dd.mm.yyyy'),'dd.mm.yyyy') 

và nó làm việc rất chậm (khoảng 5 giây) !!! Bây giờ tôi sử dụng biểu hiện tiếp theo:

datecreate>=to_date(to_char(sysdate,'dd.mm.yyyy'),'dd.mm.yyyy') and sw.datecreate<to_date(to_char(sysdate+1,'dd.mm.yyyy'),'dd.mm.yyyy') 

và truy vấn của tôi thực hiện trong 0,01 sec

Các vấn đề liên quan