Numeric vs Integer untuk ukuran dan kinerja kolom

11

Saya memiliki aplikasi yang menggunakan tabel PostgreSQL. Tabelnya sangat besar (miliaran baris) dan memiliki kolom yang merupakan bilangan bulat.

The integerbisa sampai 6 digit, yaitu 0-999,999, tidak ada negatif.

Saya berpikir untuk mengubahnya numeric(6,0).

Apakah ini ide yang bagus? Akan numeric(6,0)mengambil byte lebih sedikit? Bagaimana dengan kinerjanya (tabel ini banyak ditanyakan)?

Ofiris
sumber

Jawaban:

11

Apakah ini ide yang bagus?

Tidak.

akan numeric(6,0)memakan waktu kurang byte?

Tidak.

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

bagaimana dengan kinerjanya (tabel ini banyak ditanyakan)?

Lebih lambat. Ini disimpan sebagai desimal berkode biner karena ini merupakan nilai presisi yang arbitrer.

Craig Ringer
sumber
Semua setuju, sebagai catatan samping numerik memiliki satu keuntungan karena secara otomatis memberlakukan domain 0-999999. Namun itu dapat diselesaikan dengan kendala terpisah dalam kasus int
Lennart
1
Apakah ada masalah saat mengubah numerickolom int?
Pembalap SQL
@RacerSQL Ya jika Anda memiliki nilai yang akan meluap ukuran int.
DylanYoung
5

Jawaban pasti adalah tidak untuk semua pertanyaan Anda. Integer selalu merupakan cara untuk mencari apa pun yang dapat Anda gunakan. (Uang, misalnya)

Pikirkan dulu sebentar. Ketika mesin basis data menemukan bilangan bulat, ia menangani dengan sangat efisien karena tidak ada banyak interpretasi untuk itu. Ini adalah bilangan bulat. Tipe numerik berperilaku lebih seperti string. Mesin pertama-tama harus mencari tahu bagian mana yang sebelum dan sesudah titik desimal, dan memijatnya dengan tepat untuk melakukan operasi numerik.

Menggunakan integer akan selalu lebih efisien daripada numerik, meskipun tipe numerik seringkali lebih nyaman bagi manusia.

stubsthewizard
sumber
Saya tidak setuju dalam hal uang. Menggunakan bilangan bulat berskala, seperti menyimpan decicents (1000 per dolar) tidak apa-apa, tetapi canggung. Dengan cepat menjadi lebih praktis untuk digunakan NUMERIC. Bilangan bulat berskala jauh lebih baik daripada menggunakan nilai floating point untuk uang.
Craig Ringer
2
@CraigRinger Saya tidak berpikir Anda benar-benar tidak setuju dengan saya! Saya setuju bahwa menggunakan desimal untuk uang selalu kurang canggung bagi pengembang, tetapi pertanyaannya adalah efisiensi kueri, bukan? Menangani bilangan bulat selalu lebih cepat. Juga, ketika menulis aplikasi perbankan, Anda dapat masuk ke beberapa masalah pembulatan aneh yang kebanyakan orang tidak akan pedulikan, tetapi sangat penting bagi bank. Jadi, saya juga setuju dengan Anda untuk tidak menggunakan floating point untuk uang juga!
stubsthewizard
1
Poin bagus tentang pembulatan. Saya berharap PostgreSQL mendapatkan dukungan kebijakan. Jangan berharap itu cukup untuk mengimplementasikannya;)
Craig Ringer