2010-10-10 14 views
12

Oracle consente di specificare la precisione del tipo TIMESTAMP in una tabella: il numero di cifre nella parte frazionaria del campo SECOND datetime. Ci sono degli svantaggi nel specificare la massima precisione TIMESTAMP(9)?Quali sono gli svantaggi della scelta di una maggiore precisione di timestamp in Oracle?

Una ragione per cui posso pensare è che questa informazione possa essere utilizzata per un output più accurato dagli strumenti Oracle.

Il numero massimo di 9 cifre indica che il campo è memorizzato come un intero di 4 byte, quindi non dovrebbe avere implicazioni sulle prestazioni, correggere se ho torto qui.

risposta

14

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.

0

Il problema è la prestazione. Devi scambiarlo con precisione. I numeri più piccoli vengono letti e scritti in un numero inferiore di istruzioni della CPU. Un'istruzione della CPU richiede meno di un nanosecondo, ma se il tuo server serve milioni di transazioni potresti riscontrare un calo delle prestazioni, e questo ti suggerisce di adottare meno precisione, o anche nessuna precisione (arrotondare tutti i timestamp ai secondi è abbastanza accettabile nella maggior parte degli scenari , anche nel settore bancario).

Ma se, per qualche motivo, vale a dire. registrazione del sistema in tempo reale, richiede più precisione, sei costretto a usare una precisione più elevata e quindi ottenere una riduzione delle prestazioni. Se il tuo server non elabora un numero elevato di tps, non hai praticamente alcun impatto sulle prestazioni, ma se non hai bisogno di precisione stai sprecando memoria.

Spero di essere stato di aiuto. Se vuoi condividere con noi i tuoi requisiti di DB, potremmo aiutarti a scegliere il tuo miglior compromesso.

+0

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

+0

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 –

+0

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

0

La differenza non è nell'utilizzo tecnico del tipo di dati Timestamp, ma dell'applicazione. FERC e NERC richiedono spesso una certa precisione quando vengono utilizzati nelle applicazioni contrassegnate con critical infrastructure e pertanto utilizzeranno la massima precisione resa disponibile.

Naturalmente, rendendo gli abiti felici con la loro sequenza di eventi record richiede spesso fare più di tracciato da CIP-002 through CIP-009

0

Nessun svantaggi se sempre intenzione di utilizzare i dati come "data/timestamp" tipo di dati all'interno di Oracle e nel livello intermedio, tuttavia, devi vedere come l'intera applicazione/soluzione sta usando quella colonna.

  • Stai troncando i dati prima di visualizzarli?
  • È un requisito per la conformità e viene letto principalmente?
  • Stai convertendo quella colonna in una stringa per confrontarla con un'altra colonna?
  • è un requisito per il controllo o per l'acquisizione degli ordini?

Non preoccuparti troppo delle letture e scrive le differenze di prestazioni, ci sono trascurabili, valuta i tuoi requisiti generali in generale dall'archiviazione all'interfaccia utente.

Problemi correlati