Không có bất lợi, sử dụng dấu thời gian (9) nếu có ý nghĩa.
Dấu thời gian (9) và dấu thời gian (1) sử dụng cùng dung lượng và hiệu suất của chúng giống hệt nhau. Tôi chỉ có thể tìm thấy một trường hợp có sự khác biệt về hiệu suất và trong dấu thời gian đó (9) thực sự nhanh hơn dấu thời gian (1).
(Tôi sẽ tha cho bạn nhiều dòng mã nhàm chán chèn vào dấu thời gian (1) và dấu thời gian (9) cột và so sánh hoạt động khác nhau trên chúng.)
này chứng tỏ rằng họ sử dụng cùng một lượng không gian (chèn nhiều giá trị và so sánh dba_segments):
--Create tables with timestamps and populate them with the same data (with different precision)
--Set initial and next to a low value so we can closely check the segment size)
create table timestamp1 (t1 timestamp(1), t2 timestamp(1), t3 timestamp(1), t4 timestamp(1), t5 timestamp(1))
storage(initial 65536 next 65536);
insert into timestamp1
select current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1)
from dual connect by level <= 100000;
create table timestamp9 (t1 timestamp(9), t2 timestamp(9), t3 timestamp(9), t4 timestamp(9), t5 timestamp(9))
storage(initial 65536 next 65536);
insert into timestamp9
select current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9)
from dual connect by level <= 100000;
--Segment size is identical
select segment_name, bytes from dba_segments where segment_name in ('TIMESTAMP1', 'TIMESTAMP9');
--SEGMENT_NAME BYTES
--TIMESTAMP1 8388608
--TIMESTAMP9 8388608
Đây là nơi timestamp (9) là nhanh hơn, khi sử dụng current_timestamp, mà có thể bạn sẽ cần phải sử dụng tại một số điểm để tạo ra dữ liệu. Nhưng chúng tôi chỉ nói về sự khác biệt giữa khoảng 0,75 và 0,25 giây trên màn hình nền chậm của tôi để tạo ra dấu thời gian 100K. Tôi không chắc tại sao dấu thời gian (9) nhanh hơn, có thể dấu thời gian luôn được tạo dưới dạng dấu thời gian (9) và sau đó được làm tròn thành các phần khác?
--current_timestamp(9) is slightly faster than current_timestamp(1)
select count(*) from
(
select *
from dual
--where current_timestamp(9) = current_timestamp(9)
where current_timestamp(1) = current_timestamp(1)
connect by level <= 100000
);
EDIT: Sự khác biệt hiệu suất tồn tại trong 10g nhưng không 11g.
Làm thế nào chính xác TIMESTAMP (1) khác với TIMESTAMP (9) từ phối cảnh hiệu suất? Tuy nhiên, các phân số thứ hai không được lưu trữ dưới dạng số nguyên, do đó không nên ảnh hưởng đến CPU ở tất cả các tìm kiếm chẳng hạn. Bạn có chắc chắn rằng TIMESTAMP (1) chiếm ít bộ nhớ trong hơn TIMESTAMP (9) không? – Leonid
Bạn chỉ cần nhấn điểm! SQL là khai báo, không có bạn không có đảm bảo rằng TIMESTAMP (1) nhỏ hơn TIMESTAMP (9). Ví dụ, Oracle cho nền tảng 64 bit có thể quyết định lưu trữ tất cả các dấu thời gian, cho dù bạn chọn như thế nào, như các số nguyên 64 bit mà không nói cho bạn biết. Nhưng nếu bạn chỉ định TIMESTAMP (9), Oracle cấp cho bạn rằng nó sẽ không bao giờ mất độ chính xác. Về hiệu suất, tôi lặp lại, bạn _might_ chỉ nhận thấy hiệu suất mất trên ** tải rất nặng **, có thể không chắc hay không phụ thuộc vào đơn đăng ký của bạn –
Câu hỏi của tôi là ở đâu ** mất hiệu suất ** đến từ trường hợp dấu thời gian nếu Oracle sử dụng số nguyên để lưu trữ phân số thứ hai? TIMESSTAMP ở đây là loại Oracle và nó không liên quan gì tới SQL. – Leonid