sql >> Databasteknik >  >> RDS >> PostgreSQL

Finns det en prestandaträff med decimaldatatyper (MySQL / Postgres)

Pavel har helt rätt, jag skulle bara vilja förklara lite.

Om du antar att du menar en prestandapåverkan jämfört med flyttal, eller ett heltal med fast punktförskjutning (dvs. lagra tusendelar av en cent som ett heltal):Ja, det finns en mycket stor prestandapåverkan. PostgreSQL, och genom ljudet av saker MySQL, lagra DECIMAL / NUMERIC i binärt kodad decimal. Det här formatet är mer kompakt än att lagra siffrorna som text, men det är fortfarande inte särskilt effektivt att arbeta med.

Om du inte gör många beräkningar i databasen är effekten begränsad till det större lagringsutrymme som krävs för BCD jämfört med heltal eller flyttal, och därmed bredare rader och långsammare skanningar, större index etc. Jämförelseoperationer i b -Träindexsökningar är också långsammare, men inte tillräckligt för att spela roll om du inte redan är CPU-bunden av någon annan anledning.

Om du gör många beräkningar med DECIMAL / NUMERIC värden i databasen, kan prestandan verkligen lida. Detta är särskilt märkbart, åtminstone i PostgreSQL, eftersom Pg inte kan använda mer än en CPU för en viss fråga. Om du gör ett stort gäng division och multiplikation, mer komplex matematik, aggregering, etc på numeriska kan du börja hitta dig själv CPU-bunden i situationer där du aldrig skulle vara när du använder en flytande eller heltalsdatatyp. Detta är särskilt märkbart i OLAP-liknande (analytiska) arbetsbelastningar och i rapportering eller datatransformation under laddning eller extraktion (ETL).

Trots att det finns en prestandapåverkan (som varierar beroende på arbetsbelastning från försumbar till ganska stor) bör du i allmänhet använda numeric / decimal när det är den mest lämpliga typen för din uppgift - d.v.s. när mycket höga intervallvärden måste lagras och/eller avrundningsfel inte är acceptabelt.

Ibland är det värt besväret med att använda en stor och fast punktoffset, men det är klumpigt och oflexibelt. Att använda flyttal istället är mycket sällan det rätta svaret på grund av alla utmaningar med att arbeta tillförlitligt med flyttal för saker som valuta.

(BTW, jag är ganska exalterad över att vissa nya Intel-processorer och IBMs Power 7-serie av processorer inkluderar hårdvarustöd för IEEE 754 decimal flyttal. Om detta någonsin blir tillgängligt i lägre processorer kommer det att vara en stor vinst för databaser .)



  1. Jag vill använda CASE-satsen för att uppdatera några poster i sql server 2005

  2. Returnera noll om ingen post hittas

  3. visa data från SQL-databasen till php/html-tabellen

  4. Hur SQLite Random() fungerar