PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Има ли удар в производителността при използване на десетични типове данни (MySQL / Postgres)

Павел го има съвсем правилно, просто бих искал да обясня малко.

Предполагайки, че имате предвид въздействие върху производителността в сравнение с цяло число с плаваща запетая или фиксирана точка с изместване (т.е. съхраняване на хилядни от цента като цяло число):Да, има много голямо влияние върху производителността. PostgreSQL и според звуците на MySQL съхранявайте DECIMAL / NUMERIC в двоично кодиран десетичен знак. Този формат е по-компактен от съхраняването на цифрите като текст, но все още не е много ефективен за работа.

Ако не правите много изчисления в базата данни, въздействието е ограничено до по-голямото пространство за съхранение, необходимо за BCD в сравнение с цяло число или с плаваща запетая, и по този начин по-широките редове и по-бавното сканиране, по-големите индекси и т.н. Операции за сравнение в b -търсенията в индекс на дървото също са по-бавни, но не са достатъчни, за да имат значение, освен ако вече не сте свързани с процесора по някаква друга причина.

Ако правите много изчисления с DECIMAL / NUMERIC стойности в базата данни, тогава производителността може наистина да пострада. Това е особено забележимо, поне в PostgreSQL, защото Pg не може да използва повече от един процесор за дадена заявка. Ако правите огромен набор от делене и умножение, по-сложна математика, агрегиране и т.н. върху числата, можете да започнете да се оказвате свързани с процесора в ситуации, в които никога не бихте били, когато използвате тип данни с плаваща или целочислена стойност. Това е особено забележимо при подобни на OLAP (аналитични) натоварвания и при отчитане или преобразуване на данни по време на зареждане или извличане (ETL).

Въпреки факта, че има въздействие върху производителността (което варира в зависимост от работното натоварване от незначително до доста голямо) обикновено трябва да използвате numeric / decimal когато това е най-подходящият тип за вашата задача – т.е. когато трябва да се съхранят много високи стойности на диапазона и/или грешката при закръгляването не е приемлива.

Понякога си струва да си струва да използвате офсет на bigint и фиксирана точка, но това е тромаво и негъвкаво. Вместо това използването на плаваща запетая много рядко е правилният отговор поради всички предизвикателства да работите надеждно със стойности с плаваща запетая за неща като валута.

(Между другото, много се вълнувам, че някои нови процесори на Intel и гамата процесори на IBM Power 7 включват хардуерна поддръжка за IEEE 754 десетична плаваща запетая. Ако това някога стане достъпно в процесори от по-нисък клас, това ще бъде огромна печалба за базите данни .)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получавате стойностите по подразбиране на колоните на таблицата в Postgres?

  2. Как да импортирам данни от CSV файл в PostgreSQL таблица?

  3. Използване на PgBouncer Connection Pooler за PostgreSQL с ClusterControl 1.8.2

  4. Има ли някакъв начин да се изпълни заявка вътре в стойността на низа (като eval) в PostgreSQL?

  5. Generate_series в Postgres от начална и крайна дата в таблица