Павел го има съвсем правилно, просто бих искал да обясня малко.
Предполагайки, че имате предвид въздействие върху производителността в сравнение с цяло число с плаваща запетая или фиксирана точка с изместване (т.е. съхраняване на хилядни от цента като цяло число):Да, има много голямо влияние върху производителността. PostgreSQL и според звуците на MySQL съхранявайте DECIMAL
/ NUMERIC
в двоично кодиран десетичен знак. Този формат е по-компактен от съхраняването на цифрите като текст, но все още не е много ефективен за работа.
Ако не правите много изчисления в базата данни, въздействието е ограничено до по-голямото пространство за съхранение, необходимо за BCD в сравнение с цяло число или с плаваща запетая, и по този начин по-широките редове и по-бавното сканиране, по-големите индекси и т.н. Операции за сравнение в b -търсенията в индекс на дървото също са по-бавни, но не са достатъчни, за да имат значение, освен ако вече не сте свързани с процесора по някаква друга причина.
Ако правите много изчисления с DECIMAL
/ NUMERIC
стойности в базата данни, тогава производителността може наистина да пострада. Това е особено забележимо, поне в PostgreSQL, защото Pg не може да използва повече от един процесор за дадена заявка. Ако правите огромен набор от делене и умножение, по-сложна математика, агрегиране и т.н. върху числата, можете да започнете да се оказвате свързани с процесора в ситуации, в които никога не бихте били, когато използвате тип данни с плаваща или целочислена стойност. Това е особено забележимо при подобни на OLAP (аналитични) натоварвания и при отчитане или преобразуване на данни по време на зареждане или извличане (ETL).
Въпреки факта, че има въздействие върху производителността (което варира в зависимост от работното натоварване от незначително до доста голямо) обикновено трябва да използвате numeric
/ decimal
когато това е най-подходящият тип за вашата задача – т.е. когато трябва да се съхранят много високи стойности на диапазона и/или грешката при закръгляването не е приемлива.
Понякога си струва да си струва да използвате офсет на bigint и фиксирана точка, но това е тромаво и негъвкаво. Вместо това използването на плаваща запетая много рядко е правилният отговор поради всички предизвикателства да работите надеждно със стойности с плаваща запетая за неща като валута.
(Между другото, много се вълнувам, че някои нови процесори на Intel и гамата процесори на IBM Power 7 включват хардуерна поддръжка за IEEE 754 десетична плаваща запетая. Ако това някога стане достъпно в процесори от по-нисък клас, това ще бъде огромна печалба за базите данни .)