Wow, jawaban yang benar "Jangan izinkan NULL ketika Anda tidak harus melakukannya karena mereka menurunkan kinerja" adalah jawaban yang dinilai terakhir. Saya akan mengangkatnya dan menguraikannya. Ketika RDBMS memungkinkan NULL untuk kolom non-jarang, kolom itu ditambahkan ke bitmap yang melacak apakah nilainya NULL untuk setiap baris individual. Jadi dengan menambahkan kemampuan NULL ke kolom dalam tabel di mana semua kolom tidak mengizinkan NULL, Anda menambah ruang penyimpanan yang diperlukan untuk menyimpan tabel. Selanjutnya, Anda memerlukan RDBMS untuk membaca dan menulis ke bitmap, menurunkan kinerja pada semua operasi.
Lebih lanjut, dalam sejumlah contoh, memungkinkan NULL akan merusak 3NF. Meskipun saya bukan penganut 3NF seperti kebanyakan kolega saya, pertimbangkan skenario berikut:
Di tabel Orang ada kolom, yang disebut DateOfDeath, yang dapat dibatalkan. Jika seseorang telah meninggal, itu akan diisi dengan DateOfDeath mereka, jika tidak maka NULL akan ditinggalkan. Ada juga kolom bit yang tidak dapat dibatalkan yang disebut IsAlive. Kolom ini diatur ke 1 jika orang tersebut masih hidup, dan 0 jika orang itu sudah mati. Sebagian besar prosedur tersimpan menggunakan kolom IsAlive, mereka hanya peduli jika seseorang hidup, bukan DateOfDeath mereka.
Namun, kolom IsAlive memecah normalisasi database, karena sepenuhnya turunan dari DateOfDeath. Tetapi karena IsAlive terprogram ke dalam mayoritas SP, solusi langsung adalah membuat DateOfDeath tidak dapat dibatalkan, dan menetapkan nilai default ke kolom jika orang tersebut masih hidup. Beberapa SP yang menggunakan DateOfDeath kemudian dapat ditulis ulang untuk memeriksa kolom IsAlive, dan hanya menghormati DateOfDeath jika orang tersebut tidak hidup. Sekali lagi, karena mayoritas SP hanya peduli tentang IsAlive (sedikit) dan bukan DateOfDeath (tanggal) menggunakan pola ini mempercepat akses.
Skrip T-SQL yang berguna untuk menemukan kolom yang dapat dibatalkan tanpa NULL di semua skema adalah:
select 'IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' WHERE ' + QUOTENAME(c.name) + ' IS NULL)
AND (SELECT COUNT(*) FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ') > 1 PRINT ''' + s.name + '.' + t.name + '.' + REPLACE(c.name, '''', '''''') + ''''
from sys.columns c
inner join sys.tables t ON c.object_id = t.object_id
inner join sys.schemas s ON s.schema_id = t.schema_id
where c.is_nullable = 1 AND c.is_computed = 0
order by s.name, t.name, c.name;
Jika Anda menjalankan ini pada salinan basis data produksi Anda, Anda dapat menemukan kolom yang ditandai pengembang sebagai memungkinkan NULL yang tidak memiliki NULL dalam praktiknya. Sebagian besar dari ini dapat ditandai sebagai NOT NULL, sehingga meningkatkan kinerja dan menurunkan ruang penyimpanan.
Mungkin tidak mungkin untuk menghilangkan semua NULL di semua tabel dan masih memiliki desain yang bersih, tetapi ada keuntungan yang cukup besar dalam menghilangkan NULL sebanyak mungkin. Pengoptimal bekerja lebih cepat dengan informasi ini, dan jika Anda bisa menghilangkan semua NULL dalam sebuah tabel, Anda bisa mendapatkan kembali ruang penyimpanan yang cukup besar.
Saya tahu bahwa kinerja bukanlah sesuatu yang banyak dipikirkan oleh DBA, tetapi Anda hanya dapat membuang sejumlah memori dan daya prosesor pada suatu solusi, suatu titik yang harus Anda mulai pikirkan tentang desain logis dan fisik. .
Juga perhatikan bahwa ini hanya untuk RDBMSes yang benar dan saya mendasarkan bagian teknis dari jawaban saya dari SQL Server. T-SQL yang terdaftar untuk menemukan kolom yang dapat dibatalkan tanpa null juga dari SQL Server.