Işlem çoğaltma yayımlama saklı yordamı yürütme
Yayımcı yürütmek ve yayımlanmış tabloları etkileyen bir veya daha fazla saklı yordamlar varsa, saklı yordamı yürütme makale olarak, yayınınızdaki bu saklı yordamları eklemeyi düşünün. Abonelik başlatıldığında yordam (create procedure deyimi) tanımını abone çoğaltılır; yordam Yayımcı tarafında çalıştırıldığında, çoğaltma abone adresindeki ilgili yordamı yürütür. Yalnızca yordamı yürütme çoğaltıldığından gerek her satır için tek tek değişiklikleri çoğaltmak için yan yol bu durumlarda büyük toplu işlemleri burada yapılır, önemli ölçüde daha iyi bir performans sağlayabilir. Örneğin, aşağıdaki saklı yordam yayını veritabanında oluşturmak varsayalım:
CREATE PROC give_raise AS
UPDATE EMPLOYEES SET salary = salary * 1.10
CREATE PROC give_raise AS
UPDATE EMPLOYEES SET salary = salary * 1.10
Bu yordamı her 10.000 çalışanların yüzde 10 pay artışı şirketinizde verir. Bu saklı yordam yayımcı çalıştırdığınızda, her çalışan için maaş güncelleştirir. Saklı yordamı yürütme çoğaltma güncelleştirme büyük, çok hareket olarak abonelere gönderilecektir:
BEGIN TRAN
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 1'
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 2'
BEGIN TRAN
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 1'
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 2'
Ve bu 10.000 güncelleştirmeler için yineler.
Saklı yordam yürütme çoğaltmayla çoğaltma yalnızca abone, yerine tüm güncelleştirmeleri dağıtım veritabanına yazma ve sonra abone için ağ üzerinden göndermeden saklı yordamı yürütmek için komutu gönderir:
EXEC give_raise
EXEC give_raise
Önemli |
---|
Saklı yordam çoğaltma tüm uygulamalar için uygun değildir. Satır yayımcı abone farklı ayarlar böylece bir makale yatay olarak filtre, hem de aynı saklı yordamı yürütme farklı sonuçlar verir. Benzer şekilde, bir güncelleştirme, başka bir alt sorguyu temel alıyorsa, Publisher ve abone aynı saklı yordamı yürütme çoğaltılmamış tablo farklı sonuçlar verir. |
Saklı yordam yürütme yayımlamak için
SQL Server Management Studio'yu:İşlemsel bir yayını (SQL Server Management Studio'yu) içinde saklı bir yordam yürütülmesini Yayımla
Çoğaltma Transact-sql programlama: idam eşdeğerdirsp_addarticle (Transact-sql)ve seri hale getirilebilir yordam exec' değerini belirtin (önerilen) veya yordam exec' parametre @ türü. Makaleleri tanımlama hakkında daha fazla bilgi için bkz: Bir makale tanımlamak.
Abone adresindeki yordamı değiştirme
Varsayılan olarak, her abone için yayımcı saklı yordam tanım yayılır. Ancak abone saklı yordamı da değiştirebilirsiniz. Publisher ve abone yürütülecek farklı mantık istiyorsanız bu yöntem yararlıdır. Örneğin, sp_big_delete, bir saklı yordam yayımcı iki işlevi vardır: çoğaltılmış tablodan 1.000.000 satırları siler big_table1 ve çoğaltılmamış tablosunu güncelleştirir big_table2. Ağ kaynaklarına olan talebin azaltmak için size 1 milyon satır silme bir saklı yordam Yayıncılık tarafından yayılması sp_big_delete. Abone, değiştirebileceğiniz sp_big_delete 1 milyon satırları silmek ve sonraki güncelleştirme gerçekleştirmek değil big_table2.
[!NOT]
Varsayılan olarak, abone için yayımcı alter yordam kullanılarak yapılan değişiklikler yayılır. Bunu önlemek için şema değişiklikleri yayma alter procedure yürütmeden önce devre dışı bırakın. Şema değişiklikleri hakkında daha fazla bilgi için bkz: Yayını veritabanları üzerinde şeması değişiklikler yapmak.
Saklı yordam yürütme makaleleri türleri
Saklı yordam yürütme yayımlanabilir iki farklı yolu vardır: seri hale getirilebilir yordamı yürütme makale ve yordamı yürütme makale.
Seri hale getirilebilir seçeneği, yalnızca seri hale getirilebilir bir işlem bağlamında yordam yürütülen bu yordamı yürütme çoğaltıldığı için önerilir. Saklı yordam dışında bir seri hale getirilebilir işlem yürütülür, dml deyimleri dizisi olarak yayımlanan tablolardaki verileri değişiklikler çoğaltılır. Bu davranış, veri abone adresindeki Yayımcı veri ile tutarlı yapmak için katkıda bulunur. Bu, özellikle büyük temizleme işlemleri gibi toplu işlemler için kullanışlıdır.
Yordamı yürütme seçeneği ile yürütme olup saklı yordam tek tek deyimleri başarılı bakılmaksızın tüm aboneleri çoğaltılmış mümkündür. Ayrıca, saklı yordam tarafından verilerinde yapılan değişiklikleri nedeniyle oluşabilir birden fazla işlem veri aboneleri yayımcı veri ile tutarlı olmayabilir. Bu sorunları gidermek için bunu gerekli aboneleri salt okunur ve bir yalıtım düzeyi read UNCOMMITTED büyük kullanın. Read UNCOMMITTED kullanırsanız, dml deyimleri dizisi olarak yayımlanan tablolardaki verileri değişiklikler çoğaltılır.
Çoğaltma işlemleri seri hale getirilebilir yordam makaleleri olarak ayarlamanız önerilir neden aşağıdaki örnekte gösterilmiştir.
BEGIN TRANSACTION T1
SELECT @var = max(col1) FROM tableA
UPDATE tableA SET col2 = <value>
WHERE col1 = @var
BEGIN TRANSACTION T2
INSERT tableA VALUES <values>
COMMIT TRANSACTION T2
BEGIN TRANSACTION T1
SELECT @var = max(col1) FROM tableA
UPDATE tableA SET col2 = <value>
WHERE col1 = @var
BEGIN TRANSACTION T2
INSERT tableA VALUES <values>
COMMIT TRANSACTION T2
Önceki örnekte, hareket T1 select hareket T2 INSERT önce olmuyor varsayılır.
Prosedür (SERIALIZABLE için ayarla yalıtım düzeyi ile) seri hale getirilebilir bir işlem içinde yürütülür, hareket T2 T1 ve o select deyimi aralığı içinde yeni bir satır eklemek için izin T1 önce taahhüt. Buna da daha önce T1 abone uygulanacaktır. T1 abone adresindeki uygulandığında seçin potansiyel olarak daha farklı bir değer yayımcı döndürebilir ve Update farklı bir sonuca yol açabilir.
Yordam seri hale getirilebilir bir işlem içinde yürütülen, hareket T2 T2 select deyiminde kapsamındaki aralığı içinde eklemek için izin verilmez. Abone adresindeki aynı sonuçları sağlamada T1 tamamlar kadar engellenir.
Seri hale getirilebilir bir hareketin içinde yordamını yürütün ve azaltılmış eşzamanlılık neden olabilir, kilitleri uzun yapılacaktır.
xact_abort ayarı
Saklı yordam yürütme oturum ayarı, saklı yordamı yürütme çoğaltma yapılırken xact_abort on belirtmeniz gerekir. xact_abort off için ayarlanır ve yayımcı adresindeki yordamı yürütme sırasında bir hata oluşursa, abone Dağıtım Aracısı başarısız olmasına neden olan, aynı hata oluşacaktır. xact_abort on belirterek, Dağıtım Aracısı başarısız kaçınarak, geri alınması için yayımcı neden tüm yürütme yürütme sırasında karşılaşılan hataları sağlar. xact_abort ayarı hakkında daha fazla bilgi için bkz: set xact_abort (Transact-sql).
KAPALI xact_abort ayarı gerektiriyorsa belirtmek - SkipErrors parametresi dağıtım aracısı için. Bu hata oluşursa bile abone adresindeki değişiklikler uygulayarak devam etmek aracı sağlar.