Anlamayabilirim, ama cevaplamaya çalışıyorum.
Sık çalışan (minimum 2 dakikada bir) yüksek performanslı bir çözüme ihtiyacınız olduğunu ve kilitlemeden hızlı olması gereken iyi bir yaklaşıma ihtiyacınız olduğunu söylediniz. Ama bir kara kutu sistemi istemiyorsun.
Milyonlarca kurulumda iyi sonuçlarla kullanılan bir kara kutu sistemi yerine, tekerleği tekrar icat etmeye ve kendi çözümünüzü oluşturmaya çalışıyorsunuz? Hm, biraz garip geliyor.
Aslında bunlar benim önerilerim.
- Kullanmayacağınızı söylemiş olsanız bile çoğaltma . Bunun için kullanabileceğiniz en kolay ve en iyi çözüm. Çoğaltma kurulumu kolaydır, hızlı çoğaltma yapar ve tekerleği tekrar icat etmenize gerek yoktur. Kilitleme hakkında garip sen, belirlediğiniz çalışabilir
ISOLATION LEVEL
için READ_COMMITTED_SNAPSHOT
. Burada daha fazla bilgi edinebilirsiniz . Bu tempdb'nizin bir bölümünü kullanır, ancak tablonuz her zaman okunabilir ve yazılabilir ve çoğaltma arka planda çalışabilir.
Aşağıdaki örneğe bakın:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- CDC (Veri Yakalamayı Değiştir) de bir çözüm olabilir. Ama bu şekilde neredeyse her şeyi kendi başınıza inşa etmeniz gerekiyor. Ve
CDC
bazı durumlarda kırılgan bir şey olabilecek deneyimi yaptım . CDC
izlenen bir tablodaki tüm verileri yakalar (izlenen her tabloyu manuel olarak belirtmeniz gerekir). Ardından bir sonraki önce değer ve değer elde edersiniz INSERT
, UPDATE
ya da DELETE
. CDC
bu bilgileri bir süre saklar (kendiniz belirtebilirsiniz). Yaklaşım, CDC
bu değişiklikleri izlemeniz ve diğer veritabanına el ile çoğaltmanız gereken belirli tablolarda kullanmak olabilir . Bu arada, CDC
başlık altında SQL Server Çoğaltma'yı da kullanır. ;-) Burada daha fazla bilgi edinebilirsiniz .
Uyarı: -değişikliklerin CDC
farkında DDL
olmayacak. Bu, bir tabloyu değiştirir ve yeni bir sütun eklerseniz CDC
, tabloyu izleyecek, ancak yeni sütundaki tüm değişiklikleri yok sayacak demektir. Aslında sadece NULL
önce değer ve sonra değer olarak kaydeder . DDL
İzlenen bir tablodan sonra -Değiştirildikten sonra yeniden başlatmanız gerekir .
- Yukarıda tarif ettiğiniz yol, SQL Server Profiler kullanarak bir iş yükünü yakalamak ve bazı karşılaştırmalar için başka bir veritabanında tekrar çalıştırmak gibi bir şeydir. Workţe yarayabilir. Ancak çok fazla yan etkinin olması benim için biraz fazla ağır. İstemcinizde bir prosedür çağrısı yakalarsanız ne yaparsınız? Daha sonra prensip veritabanınızda senkronize olmadığı için aynı komutu çalıştırıyor musunuz? Yordam çalıştırılabilir, ancak istemcinizde bulunmayan satırları silebilir / güncelleyebilir / ekleyebilir. Veya birden fazla istemciyi tek bir ilke ile nasıl ele alırsınız? Bence bu çok zor. En kötü durumda, muhtemelen bütünlüğünüzü yok edersiniz.
- Başka bir fikir, uygulamaya dayalı veya bir tetikleyici kullanmak olabilir. Senkronize etmek istediğiniz tablo sayısına bağlı olarak. Tüm değişiklikleri ayrı bir aşamalandırma tablosuna yazabilir ve aşamalandırma tablosundaki bu satırları ana verilerinizle eşitlemek için bir SQL Server Agent Job all x Minutes çalıştırabilirsiniz. Ancak, 150 tabloyu senkronize etmeye çalışırsanız (örn.) Bu biraz ağır olabilir. Büyük bir yükünüz olurdu.
Bunlar benim 2 sentim. Umarım iyi bir genel bakışa sahip olabilirsiniz ve belki de sizin için çalışan bir çözüm buldunuz.