Salah satu pelanggan kami menggunakan beberapa kolom tipe data DECIMAL(18,0)
dalam database SQL Server 2008R2-nya. Karena kolom tumbuh cukup lambat, dia baru-baru ini mengusulkan untuk mengubah tipe data DECIMAL(5,0)
untuk mendapatkan kembali beberapa penyimpanan.
Menurut perpustakaan MSDN , ruang penyimpanan DECIMAL(5,0)
tipe data adalah, sama seperti DECIMAL(9,0)
tipe data, 5 byte. INT
berukuran 1 byte lebih kecil, tetapi dapat menyimpan semuanya dalam kisaran -2 ^ 31 hingga 2 ^ 31 sebagai ganti -99.999 hingga 99.999 yang DECIMAL(5,0)
dapat disimpan. Bahkan yang terbesar DECIMAL
yang masuk ke dalam 5 byte ( DECIMAL(9,0)
) dapat menyimpan hanya bilangan bulat dalam kisaran -999.999.999 hingga 999.999.999 (yang kurang dari setengah dari kisaran INT
penawaran dalam 4 byte).
Saya dapat memikirkan dua "manfaat" menggunakan DECIMAL
lebih dari INT
:
- Kemampuan untuk menambah skala sesudahnya, tanpa menggunakan lebih banyak ruang penyimpanan
- Kemampuan untuk skala presisi hingga 38 digit, tanpa mengubah tipe data
tapi ini bukan manfaat nyata menurut saya:
- Menambahkan skala ke bilangan bulat hanya masuk akal dalam beberapa kasus (dalam kebanyakan kasus di mana skala membuat perbedaan, itu juga dapat ditambahkan sebelumnya)
- SQL Server melihat setiap kombinasi presisi / skala sebagai tipe data yang berbeda, sehingga tipe data tidak dibiarkan sendirian ketika meningkatkan presisi atau skala.
Ini membuat saya bertanya-tanya: apa manfaat tambahan dari DECIMAL(5,0)
tipe data untuk bilangan bulat?
sumber
decimal(x,0)
dan tipe integer menunjukkan dirinya dalam divisi aritmatika. Jika Anda membagi int dengan int, Anda mendapatkan int. Jika Anda membagi desimal (x, 0) dengan int, Anda mendapatkan desimal (x + 6,6).Jawaban:
Saya setuju bahwa tidak ada manfaat nyata dalam hal ruang penyimpanan selama Anda membandingkan DECIMAL (9, 0) vs INT atau DECIMAL (18, 0) vs BIGINT. (Dalam satu byte.)
Dalam hal pemrosesan, seperti @Andriy mengatakan DECIMAL secara alami akan membagi menjadi jenis yang tidak kehilangan bagian pecahan, jika itu penting bagi Anda.
Di sisi lain, bekerja dengan tipe INT asli jauh lebih cepat dari sudut pandang numerik jika Anda melakukan banyak SUM () atau perbandingan (seperti mencari pada nilai-nilai) karena mereka disalurkan lebih efisien oleh CPU. Perbandingan int adalah dua opcode rakitan (MOV, CMP) tetapi perbandingan desimal akan banyak, banyak lagi.
sumber
DECIMAL(9, 0)
bukanINT
?DECIMAL
masih memakan waktu yang agak lama (setidaknya pada sistem pengembangan saya). Dalam menjalankan 10 tes sekitar 51 ms DEC vs 46 ms INT.Sepertinya tidak akan ada manfaat dalam hal ruang penyimpanan.
Jika klien Anda khawatir bahwa nilai Anda akan lebih besar dari 2 ^ 32-1 (integer nilai positif maksimum dapat disimpan) maka Anda harus mempertimbangkan untuk pindah ke BigInt - dengan 64 bit ( 8 byte) .
sumber