Bir OLTP sisteminde anahtarlar ve kümeler olarak GUID ile ilgili yanlış bir şey yoktur (tabloda kümenin artan boyutundan muzdarip çok sayıda dizin yoksa). Aslında, IDENTITY sütunlarından çok daha ölçeklenebilir.
GUID'in SQL Server'da büyük bir sorun olduğuna dair yaygın bir inanç var - büyük ölçüde, bu oldukça basit bir şekilde yanlış. Nitekim, GUID yaklaşık 8'den fazla çekirdeğe sahip kutularda önemli ölçüde daha ölçeklenebilir olabilir:
Üzgünüm, ama geliştiricileriniz haklı. GUID hakkında endişelenmeden önce diğer şeyler için endişelen.
Nihayet: neden ilk önce bir küme indeksi istiyorsunuz? Endişeniz çok sayıda küçük dizine sahip bir OLTP sistemiyse, bir yığınla daha iyi durumda olursunuz.
Şimdi, parçalanmanın (GUID'in sunacağı) okumalarınıza ne yaptığını ele alalım. Parçalanma ile ilgili üç önemli sorun vardır:
- Sayfa maliyet diski G / Ç'yi böler
- Tam sayfaların yarısı tam sayfalar kadar bellek tasarruflu değildir
- Sayfaların sıra dışı depolanmasına neden olur, bu da sıralı G / Ç'yi daha az olası kılar
Sorunuzdaki endişeniz "Daha fazla donanım eklemek sistemi daha hızlı hale getiriyor" olarak tanımlayabileceğimiz ölçeklenebilirlikle ilgili olduğundan, bunlar sorunlarınızın en azıdır. Her birini sırayla ele almak için
Reklam 1) Ölçek istiyorsanız, G / Ç satın almaya gücünüz vardır. Ucuz bir Samsung / Intel 512GB SSD bile (birkaç USD / GB) 100K IOPS'un üzerine çıkacaktır. Yakında 2 soketli bir sistemde bunu tüketmeyeceksiniz. Ve eğer buna girerseniz, bir tane daha satın alın ve hazırsınız
Reklam 2) Tablonuzda silme işlemi yaparsanız, yine de yarım dolu sayfanız olur. Ve olmasanız bile, bellek ucuz ve en büyük OLTP sistemleri hariç herkes için - sıcak veriler oraya sığmalıdır. Ölçek ararken, sayfalara daha fazla veri toplamak alt optimizasyon sağlar.
Reklam 3) Sık sayfa bölünmüş, yüksek oranda parçalanmış verilerden oluşan bir tablo, sıralı olarak doldurulmuş tablolarla tam olarak aynı hızda rastgele G / Ç yapar
Birleşmeyle ilgili olarak, OLTP'de iş yükü gibi görebileceğiniz iki ana birleştirme türü vardır: Karma ve döngü. Her birine sırayla bakalım:
Karma birleştirme: Karma birleştirme, küçük tablonun tarandığını ve daha büyük olanın genellikle arandığını varsayar. Küçük tabloların bellekte olması çok olasıdır, bu nedenle burada G / Ç endişeniz değildir. Parçalanmış endekste parçalanmayan bir endekste aynı maliyetin bulunmasına zaten değindik
Döngü birleştirmesi: Dış tablo aranacaktır. Aynı maliyet
Ayrıca çok sayıda kötü tablo taraması da devam ediyor olabilir - ancak GUID yine endişeniz değil, uygun indeksleme.
Şimdi, bazı yasal aralık taramalarınız devam edebilir (özellikle yabancı anahtarlara katılırken) ve bu durumda, parçalanmış veriler parçalanmamış verilere kıyasla daha az "paketlenir". Ancak, iyi bir şekilde dizine eklenmiş bir 3NF verilerinde hangi birleştirmelerin göreceğinizi düşünelim:
Başvurduğu tablonun birincil anahtarına yabancı anahtar başvurusu olan bir tablodan birleştirme
Diğer taraftan
Reklam 1) Bu durumda, birincil anahtara tek bir arama yapacaksınız - n'yi 1'e katıyorsunuz. Parçalanma veya değil, aynı maliyet (bir arama)
Reklam 2) Bu durumda, aynı anahtara katılıyorsunuz, ancak birden fazla satır alabilir (aralık arama). Bu durumda birleştirme 1'den n'ye kadardır. Bununla birlikte, aradığınız yabancı tablo, parçalanmış bir dizinde parçalanmış olmayan bir dizinde aynı sayfada olması muhtemel olan AYNI anahtarını arıyorsunuz.
Bir an için bu yabancı anahtarları düşünün. Birincil anahtarlarımızı "mükemmel" bir şekilde sıralamış olsanız bile - bu anahtara işaret eden herhangi bir şey yine de sıralı olmayacaktır.
Tabii ki, bazı bankalarda para konusunda ucuz ve işlemde yüksek olan bir sanal makinede çalışıyor olabilirsiniz. Sonra tüm bu tavsiye kaybolacak. Ancak bu sizin dünyanızsa, ölçeklenebilirlik muhtemelen aradığınız şey değildir - her ikisi de farklı şeyler olan performans ve yüksek hız / maliyet arıyorsunuz.