PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

C'è un calo delle prestazioni utilizzando i tipi di dati decimali (MySQL / Postgres)

Pavel ha perfettamente ragione, vorrei solo spiegare un po'.

Presumendo che tu intenda un impatto sulle prestazioni rispetto a virgola mobile o intero con offset in virgola fissa (ovvero memorizzare i millesimi di centesimo come numero intero):Sì, c'è un impatto sulle prestazioni. PostgreSQL e, a giudicare dalle cose MySQL, memorizza DECIMAL / NUMERIC in codice binario decimale. Questo formato è più compatto rispetto alla memorizzazione delle cifre come testo, ma non è ancora molto efficiente da utilizzare.

Se non stai eseguendo molti calcoli nel database, l'impatto è limitato al maggiore spazio di archiviazione richiesto per BCD rispetto al numero intero o alla virgola mobile, e quindi alle righe più larghe e alle scansioni più lente, agli indici più grandi, ecc. Operazioni di confronto in b -Le ricerche dell'indice ad albero sono anche più lente, ma non abbastanza per essere importanti a meno che tu non sia già vincolato alla CPU per qualche altro motivo.

Se stai facendo molti calcoli con il DECIMAL / NUMERIC valori nel database, quindi le prestazioni possono davvero risentirne. Ciò è particolarmente evidente, almeno in PostgreSQL, perché Pg non può utilizzare più di una CPU per una determinata query. Se stai facendo un sacco di divisioni e moltiplicazioni, matematica più complessa, aggregazione, ecc. Sui numeri, puoi iniziare a trovarti vincolato alla CPU in situazioni in cui non saresti mai quando usi un tipo di dati float o intero. Ciò è particolarmente evidente nei carichi di lavoro di tipo OLAP (analitico) e nei rapporti o nella trasformazione dei dati durante il caricamento o l'estrazione (ETL).

Nonostante il fatto che c'è un impatto sulle prestazioni (che varia in base al carico di lavoro da trascurabile a abbastanza grande) dovresti generalmente utilizzare numeric / decimal quando è il tipo più appropriato per la tua attività, ad esempio quando è necessario memorizzare valori di intervallo molto elevati e/o un errore di arrotondamento non è accettabile.

Occasionalmente vale la pena di usare un offset bigint e a virgola fissa, ma è goffo e inflessibile. L'uso della virgola mobile invece è molto raramente la risposta giusta a causa di tutte le difficoltà di lavorare in modo affidabile con valori in virgola mobile per cose come la valuta.

(A proposito, sono piuttosto entusiasta del fatto che alcune nuove CPU Intel e la gamma di CPU Power 7 di IBM includano il supporto hardware per virgola mobile decimale IEEE 754. Se questo dovesse mai essere disponibile nelle CPU di fascia bassa, sarà un'enorme vittoria per i database .)