Secara umum, saya selalu menggunakan Ints. Saya tahu bahwa secara teori ini bukan praktik terbaik, karena Anda harus menggunakan tipe data terkecil yang akan dijamin untuk menyimpan data.
Misalnya, lebih baik digunakan tinyint
ketika Anda tahu bahwa satu-satunya data yang akan Anda simpan adalah 1, 0 atau nol (dengan kemungkinan sangat kecil untuk memperluasnya menjadi 2 atau 3 nanti).
Namun, satu-satunya alasan saya tahu untuk melakukan ini adalah untuk tujuan penyimpanan - menggunakan 1 byte berturut-turut, bukan 4 byte.
Apa dampak menggunakan tinyint
(atau smallint
bahkan bigint
) lebih dari sekadar int
, selain menghemat ruang pada hard drive Anda?
sql-server
database-theory
Richard
sumber
sumber
I'd use an ENUM for such a thing.
Tidak di SQL Server, Anda tidak akan, karena tidak ada enumerasi dalam bentuk apa pun.Jawaban:
Ruang disk murah ... bukan itu intinya!
Berhenti berpikir dalam hal ruang penyimpanan, alih-alih pikirkan tentang kolam penyangga dan bandwidth penyimpanan . Pada akhirnya, cache CPU dan bandwidth bus memori . Artikel yang ditautkan adalah bagian dari seri yang menyoroti masalah-masalah dengan pemilihan kunci berkerumun yang buruk (INT vs GUID vs Sequential GUID) tetapi menyoroti perbedaan yang bisa dihasilkan oleh byte.
Pesan utama adalah masalah desain. Perbedaannya tidak akan muncul dalam database individual pada server yang ditentukan secara tepat sampai Anda menekan wilayah VLDB tetapi jika Anda dapat menyimpan beberapa byte, mengapa tidak melakukannya.
Saya teringat akan lingkungan yang dijelaskan dalam pertanyaan sebelumnya . 400+ basis data, mulai dari ukuran 50mb-50GB, per contoh SQL. Menggosok beberapa byte per rekaman, per tabel, per basis data di lingkungan itu dapat membuat perbedaan yang signifikan.
sumber
Selain jawaban lain ...
Baris dan entri indeks disimpan dalam halaman 8k. Jadi sejuta baris pada 3 byte per baris bukan 3 MB pada disk: ini mempengaruhi jumlah baris per halaman ("kepadatan halaman").
Hal yang sama berlaku untuk nvarchar ke varchar, smalldatetime ke datetime, int ke tinyint dll
Edit, Juni 2013
http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx
Artikel ini menyatakan
Jadi, pilihan tipe data penting
sumber
Bukan hanya penyimpanan meja yang menjadi pertimbangan. Jika Anda menggunakan indeks di mana kolom int adalah bagian dari kunci majemuk, Anda tentu ingin halaman indeks selengkap mungkin, ini menjadi hasil entri indeks sekecil mungkin.
Saya pasti berharap menemukan bahwa memeriksa entri indeks di halaman BTREE akan sedikit lebih cepat dengan tipe data yang lebih kecil. Namun, setiap VARCHAR yang terlibat dalam entri indeks akan mengimbangi (membatalkan) keuntungan kinerja dari penggunaan TINYINT atas INT.
Meskipun demikian, jika entri indeks memiliki entri majemuk dan semua adalah bilangan bulat, semakin kecil bilangan bulat itu, semakin baik dan semakin cepat.
sumber
Semua hal menjadi semakin rumit saat database semakin besar:
Dan apa tipe data yang harus dilakukan dengan itu? SEGALA SESUATU. Menggunakan ukuran baris yang lebih besar dari yang diperlukan membuat halaman database diisi sebelum dari yang dibutuhkan atau bahkan membuang-buang ruang jika ukuran baris sedemikian rupa sehingga tidak lebih dari satu catatan yang dapat direkam pada halaman. Hasilnya adalah lebih banyak halaman yang diperlukan untuk ditulis dan dibaca, lebih banyak memori RAM digunakan untuk cache itu (catatan yang lebih besar membutuhkan memori yang lebih besar). Dan karena tipe data Anda ditentukan lebih besar dari yang dibutuhkan dari disk, indeks Anda akan mengalami masalah yang sama - khususnya jika Anda mengelompokkan 2 kunci kolom BIGINT komposit tersebut karena indeks lain yang dibuat akan menyalin kunci primer secara implisit pada definisi mereka.
Jika Anda tahu bahwa beberapa kolom dalam tabel yang akan memiliki jutaan baris atau bahkan sedikit tabel yang akan FK'ed ke multi-juta-baris yang tidak memerlukan integer 4 byte untuk menyimpan data mereka, tetapi 2 byte akan cukup - gunakan SMALLINT . Jika nilai dalam kisaran 0-255 sudah cukup, TINYINT . Bendera Ya / Tidak? Ada BIT .
sumber
Sementara untuk
tinyint
vsint
ada perbedaan yang jelas seperti ruang disk, pemisahan halaman dan waktu perawatan, tidak akan ada untuk semua inivarchar
.Jadi mengapa tidak mendeklarasikan semua bidang teks sebagai
varchar(4000)
, karena bagaimanapun juga hanya akan menggunakan ruang yang dibutuhkan? Terlebih lagi Anda akan dijamin bahwa data Anda tidak akan pernah terpotong.Jawabannya tentu saja:
Alasan yang sama juga berlaku untuk ini
tinyint
.sumber