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

Er der et præstationshit ved hjælp af decimaldatatyper (MySQL / Postgres)

Pavel har det helt ret, jeg vil lige forklare lidt.

Hvis du antager, at du mener en præstationspåvirkning sammenlignet med et flydende komma eller et heltal med fast punktforskydning (dvs. lagring af tusindedele af en cent som et heltal):Ja, der er i høj grad en præstationspåvirkning. PostgreSQL, og ved lyden af ​​MySQL, gem DECIMAL / NUMERIC i binært kodet decimal. Dette format er mere kompakt end at gemme cifrene som tekst, men det er stadig ikke særlig effektivt at arbejde med.

Hvis du ikke laver mange beregninger i databasen, er virkningen begrænset til den større lagerplads, der kræves for BCD sammenlignet med heltal eller flydende komma, og dermed de bredere rækker og langsommere scanninger, større indekser osv. Sammenligningsoperationer i b. -træindekssøgninger er også langsommere, men ikke nok til at betyde noget, medmindre du allerede er CPU-bundet af en anden grund.

Hvis du laver mange beregninger med DECIMAL / NUMERIC værdier i databasen, så kan ydeevnen virkelig lide. Dette er især bemærkelsesværdigt, i det mindste i PostgreSQL, fordi Pg ikke kan bruge mere end én CPU til en given forespørgsel. Hvis du laver en enorm masse af division og multiplikation, mere kompleks matematik, aggregering, osv. på numeriske, kan du begynde at finde dig selv CPU-bundet i situationer, hvor du aldrig ville være, når du bruger en flydende eller heltalsdatatype. Dette er især bemærkelsesværdigt i OLAP-lignende (analytiske) arbejdsbelastninger og i rapportering eller datatransformation under indlæsning eller ekstraktion (ETL).

På trods af at der er en præstationspåvirkning (som varierer baseret på arbejdsbelastning fra ubetydelig til ret stor), bør du generelt bruge numeric / decimal når det er den mest passende type til din opgave - dvs. når meget høje intervalværdier skal lagres og/eller afrundingsfejl ikke er acceptabel.

Indimellem er det besværet værd at bruge en bigint og fast-punkt offset, men det er klodset og ufleksibelt. At bruge floating point i stedet er meget sjældent det rigtige svar på grund af alle udfordringerne ved at arbejde pålideligt med floating point-værdier for ting som valuta.

(BTW, jeg er ret begejstret for, at nogle nye Intel-CPU'er og IBM's Power 7-serie af CPU'er inkluderer hardware-understøttelse af IEEE 754 decimal flydende komma. Hvis dette nogensinde bliver tilgængeligt i lavere ende-CPU'er, vil det være en kæmpe gevinst for databaser .)



  1. 13 blogartikler om bedste praksis og tips til databasedesign

  2. Fjern en sammenkædet server i SQL Server ved hjælp af T-SQL

  3. Rækketælling med BOB

  4. org.postgresql.util.PSQLEundtagelse:Store objekter må ikke bruges i auto-commit-tilstand