2010-10-10 38 views
12

Oracle cho phép xác định độ chính xác của loại TIMESTAMP trong một bảng - số chữ số trong phần phân đoạn của trường datetime SECOND. Có bất kỳ nhược điểm nào khi chỉ định độ chính xác tối đa TIMESTAMP(9)?Những nhược điểm của việc chọn độ chính xác timestamp cao hơn trong Oracle là gì?

Một lý do tôi có thể nghĩ là thông tin này có thể được sử dụng cho đầu ra dễ dàng hơn bằng các công cụ của Oracle.

Tối đa 9 chữ số cho thấy trường được lưu trữ dưới dạng số nguyên 4 byte nên nó không có bất kỳ tác động hiệu suất nào, vui lòng sửa nếu tôi sai ở đây.

Trả lời

14

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.

0

Sự cố là hiệu suất. Bạn phải giao dịch nó với độ chính xác. Các số nhỏ hơn được đọc và được viết bằng lệnh CPU ít hơn. Lệnh CPU mất ít hơn một nano giây, nhưng nếu máy chủ của bạn phục vụ hàng triệu giao dịch, bạn có thể thấy một số hiệu suất giảm và điều này cho thấy bạn áp dụng độ chính xác kém hơn hoặc thậm chí không có độ chính xác (tất cả các dấu thời gian cho giây là khá chấp nhận được trong hầu hết các trường hợp , ngay cả trong ngân hàng).

Nhưng nếu bạn, vì lý do nào đó, nghĩa là. ghi nhật ký hệ thống thời gian thực, cần độ chính xác cao hơn, bạn buộc phải sử dụng độ chính xác cao hơn và do đó giảm hiệu suất. Nếu máy chủ của bạn không xử lý một số lượng lớn tps bạn hầu như không có tác động hiệu suất, nhưng nếu bạn không cần độ chính xác thì bạn đang lãng phí bộ nhớ.

Hy vọng sẽ được trợ giúp. Nếu bạn muốn chia sẻ với chúng tôi yêu cầu DB của bạn, chúng tôi có thể giúp bạn chọn thỏa hiệp tốt nhất của mình.

+0

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

+0

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 –

+0

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

0

Sự khác biệt không nằm trong việc sử dụng kỹ thuật kiểu dữ liệu Dấu thời gian, mà là ứng dụng. FERC và NERC thường yêu cầu độ chính xác nhất định khi được sử dụng trong các ứng dụng có nhãn critical infrastructure và do đó chúng sẽ sử dụng độ chính xác cao nhất được cung cấp.

Tất nhiên, làm cho bộ quần áo hài lòng với trình tự của họ các bản ghi sự kiện thường đòi hỏi phải làm nhiều hơn đặt ra bởi CIP-002 through CIP-009

0

Không nhược điểm nếu bạn luôn luôn sử dụng các dữ liệu như "ngày/timestamp" datatype bên trong Oracle và ở tầng giữa, tuy nhiên bạn phải xem toàn bộ ứng dụng/giải pháp của bạn đang sử dụng cột đó như thế nào.

  • Bạn có cắt xén dữ liệu trước khi hiển thị không?
  • Đây có phải là yêu cầu để tuân thủ và chủ yếu là đọc không?
  • Bạn có đang chuyển đổi cột đó thành chuỗi để so sánh cột đó với cột khác không?
  • có phải là yêu cầu để kiểm tra hoặc chụp thứ tự không?

Đừng lo lắng quá nhiều về số lần đọc và viết sự khác biệt về hiệu suất, sẽ không đáng kể, đánh giá tổng thể các yêu cầu của bạn về lưu trữ trên giao diện người dùng.

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