NOT: Bu cevap adresleri kurumsal sınıf geliştirme hakkında geniş çaplı .
Bu sadece SQL Server değil, bir RDBMS sorunudur ve davranış çok ilginç olabilir. Birincisi, birincil anahtarların otomatik olarak (benzersiz olarak) endekslenmesi yaygın olsa da mutlak DEĞİLDİR. Birincil anahtarın benzersiz bir şekilde dizine eklenmemesinin gerekli olduğu zamanlar vardır.
Çoğu RDBMS'de, eğer zaten mevcut değilse , birincil anahtar üzerinde benzersiz bir dizin otomatik olarak oluşturulur . Bu nedenle, birincil anahtar sütununda kendi dizininizi birincil anahtar olarak tanımlamadan önce oluşturabilirsiniz, ardından birincil anahtar bildirimini uyguladığınızda bu dizin veritabanı motoru tarafından (kabul edilebilirse) kullanılacaktır. Genellikle, birincil anahtarı oluşturabilir ve varsayılan benzersiz dizininin oluşturulmasına izin verebilir, ardından bu sütunda kendi alternatif dizininizi oluşturabilir ve ardından varsayılan dizini bırakabilirsiniz.
Şimdi işin eğlenceli kısmı - ne zaman benzersiz bir birincil anahtar dizini İSTEMİYORSUNUZ? Tablonuz, dizinin bakımını çok pahalı hale getirmek için yeterli veri (satır) aldığında bir tane istemezsiniz ve birini tolere edemezsiniz. Bu, donanıma, RDBMS motoruna, tablonun ve veritabanının özelliklerine ve sistem yüküne bağlı olarak değişir. Bununla birlikte, tipik olarak bir tablo birkaç milyon satıra ulaştığında ortaya çıkmaya başlar.
Temel sorun, birincil anahtar sütununun her bir satır eklemesinin veya güncellemesinin, benzersizliği sağlamak için bir dizin taramasıyla sonuçlanmasıdır. Bu benzersiz dizin taraması (veya hangi RDBMS'deki eşdeğeri), tablonun performansına hakim olana kadar tablo büyüdükçe çok daha pahalı hale gelir.
Günde iki milyar satır, 8 TB depolama alanı ve kırk milyon satır eki kadar büyük tablolarla bu sorunu defalarca ele aldım. İlgili sistemi yeniden tasarlamakla görevlendirildim, buna benzersiz birincil anahtar indeksini pratik olarak birinci adım olarak kaldırmak da dahil. Gerçekten de, biz yeniden tasarıma yaklaşmadan önce, üretimde kesintiyi kurtarmak için bu endeksi kaldırmak gerekliydi. Bu yeniden tasarım, birincil anahtarın benzersizliğini sağlamak ve verilere hızlı erişim sağlamak için başka yollar bulmayı içeriyordu.