Non ci sono svantaggi, utilizzare il timestamp (9) se ha senso.
Timestamp (9) e timestamp (1) utilizzano la stessa quantità di spazio e le loro prestazioni sono identiche. Ho potuto trovare solo un caso in cui c'era una differenza di prestazioni, e in quel caso timestamp (9) era effettivamente più veloce di timestamp (1).
(vi risparmio le molte righe di codice noioso inserimento nel timestamp (1) e timestamp (9) colonne e confrontando diverse operazioni su di essi.)
Ciò dimostra che usano la stessa quantità di spazio (l'inserimento di molti valori e confrontando 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
Questo è dove timestamp (9) è più veloce, quando si utilizza CURRENT_TIMESTAMP, che avrete probabilmente bisogno di usare ad un certo punto per generare i dati. Ma stiamo parlando solo della differenza tra circa 0.175 e 0.25 secondi sul mio desktop lento per generare timestamp di 100K. Non sono sicuro del motivo per cui timestamp (9) è più veloce, forse i timestamp vengono sempre generati come timestamp (9) e quindi arrotondati ad altre precisioni?
--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
);
MODIFICA: la differenza di prestazioni esiste in 10 g ma non in 11 g.
In che modo TIMESTAMP (1) differisce da TIMESTAMP (9) dal punto di vista delle prestazioni? Le seconde frazioni non sono memorizzate come un intero in ogni caso, quindi non dovrebbe influenzare affatto la CPU nelle ricerche, ad esempio. Sei sicuro che TIMESTAMP (1) occupa meno memoria internamente rispetto a TIMESTAMP (9)? – Leonid
Hai appena raggiunto il punto! SQL è dichiarativo, no non si ha alcuna garanzia che TIMESTAMP (1) sia inferiore a TIMESTAMP (9). Ad esempio, Oracle per la piattaforma a 64 bit può decidere di archiviare tutti i timestamp, a prescindere dalla scelta, come interi a 64 bit senza dirlo. Ma se si specifica TIMESTAMP (9), Oracle garantisce che non perderà mai la precisione. Per quanto riguarda le prestazioni, ripeto, potresti notare una perdita di prestazioni solo su carichi ** molto pesanti **, che potrebbero essere improbabili o meno a seconda dell'applicazione –
La mia domanda è dove è ** la perdita di prestazioni ** derivante dal timestamp se Oracle utilizza numeri interi per memorizzare frazioni di secondo? TIMESSTAMP qui in questione è di tipo Oracle e non ha nulla a che fare con SQL. – Leonid