PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe um impacto de desempenho usando tipos de dados decimais (MySQL / Postgres)


Pavel está certo, eu só gostaria de explicar um pouco.

Presumindo que você quer dizer um impacto no desempenho em comparação com o ponto flutuante ou inteiro com deslocamento de ponto fixo (ou seja, armazenar milésimos de centavo como um inteiro):Sim, há muito impacto no desempenho. PostgreSQL, e pelo que parece MySQL, armazena DECIMAL / NUMERIC em decimal codificado em binário. Este formato é mais compacto do que armazenar os dígitos como texto, mas ainda não é muito eficiente para trabalhar.

Se você não estiver fazendo muitos cálculos no banco de dados, o impacto será limitado ao maior espaço de armazenamento necessário para BCD em comparação com inteiro ou ponto flutuante e, portanto, as linhas mais largas e varreduras mais lentas, índices maiores, etc. Operações de comparação em b -Tree pesquisas de índice também são mais lentas, mas não o suficiente para importar, a menos que você já esteja vinculado à CPU por algum outro motivo.

Se você estiver fazendo muitos cálculos com o DECIMAL / NUMERIC valores no banco de dados, então o desempenho pode realmente sofrer. Isso é particularmente perceptível, pelo menos no PostgreSQL, porque o Pg não pode usar mais de uma CPU para qualquer consulta. Se você está fazendo um monte de divisão e multiplicação, matemática mais complexa, agregação, etc em números, você pode começar a ficar limitado pela CPU em situações em que nunca estaria ao usar um tipo de dados flutuante ou inteiro. Isso é particularmente perceptível em cargas de trabalho do tipo OLAP (analítica) e em relatórios ou transformação de dados durante o carregamento ou extração (ETL).

Apesar do fato de que existe um impacto no desempenho (que varia de acordo com a carga de trabalho de insignificante a muito grande), você geralmente deve usar numeric / decimal quando é o tipo mais apropriado para sua tarefa - ou seja, quando valores de intervalo muito altos devem ser armazenados e/ou erro de arredondamento não é aceitável.

Ocasionalmente, vale a pena o incômodo de usar um deslocamento de ponto fixo e bigint, mas isso é desajeitado e inflexível. Usar ponto flutuante raramente é a resposta certa devido a todos os desafios de trabalhar de forma confiável com valores de ponto flutuante para coisas como moeda.

(A propósito, estou bastante animado que alguns novos CPUs Intel e a linha de CPUs Power 7 da IBM incluem suporte de hardware para ponto flutuante decimal IEEE 754. Se isso estiver disponível em CPUs de baixo custo, será uma grande vitória para bancos de dados .)