Bir sütun için sayısal ve tamsayı - boyut ve performans


11

Bir PostgreSQL tablosu kullanan bir uygulama var. Tablo çok büyük (milyarlarca satır) ve bir tamsayı olan bir sütunu var.

integer6 basamak, yani 0-999,999, hiçbir olumsuzluk kadar olabilir.

Bunu değiştirmeyi düşündüm numeric(6,0).

Bu iyi bir fikir olur mu? Misiniz numeric(6,0)az bayt almak? Performans ne durumda (bu tablo çok sorgulanıyor)?

Yanıtlar:


11

Bu iyi bir fikir olur mu?

Hayır.

daha numeric(6,0)az bayt alır mı?

Hayır.

test=> SELECT pg_column_size(INT4 '999999'), pg_column_size(NUMERIC(6,0) '999999');
 pg_column_size | pg_column_size 
----------------+----------------
              4 |             10
(1 row)

performans hakkında (bu tablo çok sorgulanıyor)?

Yavaş. İkili kodlu ondalık sayı olarak depolanır, çünkü keyfi bir hassasiyet değeridir.


Kabul edilenlerin tümü, bir yan not sayısal olarak 0-999999 etki alanını otomatik olarak zorladığı için bir avantaja sahiptir. Ancak bu, int durumunda ayrı bir kısıtlama ile çözülebilir
Lennart

1
numericSütunu değiştirirken bir sorun mu var int?
Racer SQL

@RacerSQL Int boyutundan taşacak değerleriniz varsa evet.
DylanYoung

5

Kesin cevap tüm sorularınıza hayır. Tamsayı her zaman kullanabileceğiniz herhangi bir şey için gitmenin yoludur. (Örneğin para)

Bir dakika düşünün. Veritabanı motoru bir tamsayı ile karşılaştığında, çok verimli bir şekilde ele alır, çünkü çok fazla yorum yoktur. Bu bir tam sayı. Sayısal tür daha çok bir dize gibi davranır. Motor önce ondalık noktadan önce ve sonra hangi parçaların olduğunu bulmalı ve sayısal işlemler yapmak için uygun şekilde masaj yapmalıdır.

Bir tamsayı kullanmak her zaman bir sayısaldan daha verimli olacaktır, ancak sayısal türler genellikle insanlar için daha uygundur.


Para söz konusu olduğunda katılmıyorum. Decicents (dolar başına 1000) depolamak gibi ölçekli bir tamsayı kullanmak tamam, ama garip. Hızlı bir şekilde kullanımı daha pratik hale gelir NUMERIC. Ölçekli bir tam sayı, para için bir kayan nokta değeri kullanmaktan çok daha iyidir.
Craig Ringer

2
@CraigRinger Benimle gerçekten aynı fikirde olmadığınızı sanmıyorum! Para için ondalık kullanmanın geliştirici için her zaman daha az garip olduğunu kabul ediyorum, ancak soru sorgu verimliliği, değil mi? Tamsayıları kullanmak her zaman daha hızlıdır. Ayrıca, bankacılık uygulamaları yazarken, çoğu insanın umursamayacağı, ancak bankalar için çok önemli olan bazı garip yuvarlama sorunlarına girebilirsiniz. Bu yüzden, ben de para için kayan nokta kullanmama konusunda aynı fikirdeyim!
stubsthewizard

1
Yuvarlamada iyi bir nokta. Keşke PostgreSQL'in yuvarlama politikası desteği olsaydı. Yine de uygulamak için yeterince diliyorum;)
Craig Ringer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.