Saklı bir işlemi başlatabilir ve bitmesini beklemeden hemen geri dönebilir miyim?


41

Kullanıcıların gün boyunca sürekli kullanılan bir rapor için güncellenmiş bazı sayıları almak için manuel olarak çalıştırabilecekleri saklı bir prosedürümüz var.

Bu ilk saklı yordamdan elde edilen sayılara dayandığından, ilk saklı yordam çalıştırıldıktan sonra çalıştırılması gereken ikinci bir saklı yordam var, ancak çalışması daha uzun sürüyor ve ayrı bir işlem için, bu nedenle istemiyorum. Bu 2. saklı yordam çalıştırılırken kullanıcıyı bekleyin.

Bir saklı yordamın ikinci bir saklı yordam başlatıp sonuçları beklemeden hemen geri dönmesinin bir yolu var mı?

SQL Server 2005 kullanıyorum.


Saklı yordamlar nasıl aranıyor? ASP.NET web uygulaması? SSRS?
Mr.Brownstone


@ Mr.Brownstone Genellikle bir ASP.Net web uygulamasından çağrılır, ancak bunlardan biri tarafından aranıyor olabilir. İki kez kontrol etmeliyim. Aynı zamanda SSRS'den manuel olarak da çalıştırılabilir.
Rachel,

@MartinSmith Geçmişte SQL servis aracısıyla bir kez çalıştım ve daha kolay bir yol olacağını umuyordum. Bu kadar basit bir şey için böyle karmaşık bir kurulum gibi görünüyor.
Rachel,

1
@MartinSmith, düşündüğüm kadarıyla - ayrıca, SSRS için yapamazsınız ama yapabileceğiniz şey, Report Viewer'ı uygulamaya dahil etmek ve rdl'nizin içine taşımak - asenkron aramalar yapmak mümkün olacak raporlar için de.
Bay Brrowns

Yanıtlar:


27

Bunu başarmanın birden fazla yolu var gibi gözüküyor, ancak en basit yöntem, Martin'in bir SQL işinde prosedürü kurma önerisini ve saklı yordamımdan asenkron sp_start_job komutunu kullanarak başlatmanın önerisiydi .

EXEC msdb.dbo.sp_start_job @job_name='Run2ndStoredProcedure'

Bu sadece benim için çalışıyor çünkü saklı yordam için herhangi bir parametre belirtmem gerekmiyor.

Durumunuza bağlı olarak işe yarayabilecek diğer öneriler

  • Kullanımı SQL Service Broker gibi Martin ve Sebastian düşündürmektedir. Bu, kurulumun ve nasıl çalıştığını öğrenmenin karmaşıklığına aldırış etmiyorsanız, muhtemelen en iyi öneridir.
  • Mr.Brownstone'un önerdiği gibi, işlemi saklı yordamın yürütülmesinden sorumlu olan kodda eşzamansız çalıştırma .

    Kötü bir fikir değil, ancak benim durumumda saklı yordam birden çok yerden çağrılıyor, bu nedenle tüm bu yerleri bulmak ve 2. yordam olarak adlandırılmasını sağlamak o kadar da pratik görünmüyordu. Ayrıca, 2. saklı prosedür oldukça kritiktir ve çalışmayı unutmak şirketimiz için büyük sorunlara neden olabilir.

  • 1. prosedürü bir bayrak olarak ayarlayın ve o bayrağı kontrol etmek ve Jimbo'nun önerdiği gibi ayarlanmışsa koşmak için tekrar eden bir iş yapın . Sürekli çalışan ve birkaç dakikada bir değişiklikleri kontrol eden büyük bir iş hayranı değilim, ancak durumunuza bağlı olarak düşünmeye değer bir seçenek kesinlikle.

3
Göz at Asenkron Prosedürü Yürütme Service Broker kullanarak bir hazır kullanımlı örneğin. Sp_job'a göre avantajları Express Edition'da çalışması ve tamamen DB içermesi (MSDB iş masalarına bağımlılık olmaması). Daha sonra DBM yerine çalışma ve HA / DR kurtarma işlemlerinde çok önemlidir.
Remus Rusanu

Çekin, Martin'in aynı yazıyı bağladığını gördüm. Yük devretme / DR argümanları için yorum bırakacağım.
Remus Rusanu

@RemusRusanu: peki, bu Servis Aracısı ile ilgili en iyi bilgi kaynaklarından biri, ama zaten biliyorsunuzdur ;-).
Marian,

Bağlantıyı @Rusanu'dan beğendim, ancak yanıtı olmayan bir şey istedim (sanırım bu soruna uyuyor). Basitleştirilmiş versiyonumu abamacus.blogspot.com
Abacus

Ayrıca, bir SQL Agent işi başlatmaya çalışırsanız EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'., Azure'da The Service Broker veya Sql Agent da bulunmaz. Microsoft’un neden on yıl sonra insanların yarısını sorduğunu eklemeyi reddettiğini bilmiyorum EXECUTE ASYNC RematerializeExpensiveCacheTable.
Ian Boyd,

8

Servis aracısını kuyruktaki etkinleştirme ile birlikte kullanabilirsiniz. Bununla birlikte sıradaki işlem çağrısı parametrelerini kaydedebilirsiniz. Bu bir insert kadar zaman alıyor. İşlem tamamlandıktan ve potansiyel olarak birkaç saniye daha sonra, etkinleştirme otomatik olarak alıcı prosedürünü eşzamansız olarak arayacaktır. Sadece wuold'un kuyruğun parametrelerini alması ve istenen işi yapması gerekenden daha fazla.


7

Bu eski soru daha kapsamlı bir cevabı hak ediyor. Bunlardan bazıları buradaki diğer cevaplarda / yorumlarda belirtilmiştir, diğerleri OP'nin kendine özgü durumu için çalışabilir veya çalışmayabilir, ancak saklanan procs'leri SQL'den eşzamansız olarak aramak isteyen başkaları için de çalışabilir.

Sadece tamamen açık olmak: TSQL yapar değil (kendi başına) uyumsuz diğer TSQL harekat düzenleme yeteneğine sahip .

Bu hala çok fazla seçeneğiniz olmadığı anlamına gelmez:

  • SQL Agent işleri : Birden fazla SQL işi oluşturun ve bunları istenen zamanda çalışacak şekilde zamanlayın veya bunları kullanarak proc kullanılarak depolanan "ana kontrol" den asenkron olarak başlatın sp_start_job. İlerlemelerini programlı olarak izlemeniz gerekiyorsa, işlerin her birinin özel bir JOB_PROGRESS tablosu güncellediğinden emin olun (veya Gregory A. Larsen tarafından bu mükemmel makaledexp_sqlagent_enum_jobs açıklandığı gibi belgelenmemiş işlevi kullanarak henüz tamamlanmamış olup olmadıklarını kontrol edebilirsiniz ). Aynı saklı işlemi farklı parametrelerle çalıştırsalar bile, paralel işlemlerin çalışmasını istediğiniz kadar ayrı iş oluşturmanız gerekir.
  • SSIS Paketi : Daha karmaşık asenkron senaryolar için, basit bir dallanma görev akışına sahip bir SSIS paketi oluşturun. SSIS, bu görevleri SQL'in paralel olarak uygulayacağı bireysel spidslerde başlatacak. SSIS paketini bir SQL aracı işinden çağırın.
  • Özel uygulama : İstediğiniz dilde (C #, Powershell, vb.), O dilin sağladığı asenkron yöntemleri kullanarak basit bir özel uygulama yazın. Her uygulama iş parçacığında bir SQL saklı proc arayın.
  • OLE Otomasyonu : SQL'de, sp_oacreateve bu makaledesp_oamethod açıklandığı gibi, depolanan proc'ları , Gregory A. Larsen tarafından çağıran yeni bir işlem kullanın ve başlatın .
  • Hizmet Aracısı : kullanarak içine bak Service Broker , bir bu makalede asenkron yürütme iyi bir örnek .
  • CLR Paralel Yürütme : CLR komutlarını Parallel_AddSqlve bu makalede Alan Kaplan tarafından Parallel_Executeaçıklanan şekilde kullanın (yalnızca SQL2005 +).
  • Zamanlanmış Windows Görevleri : Tamamlanmak üzere listelenmiştir, ancak bu seçeneğin hayranı değilim.

Ben olsaydım, muhtemelen daha basit senaryolarda birden fazla SQL Agent İşi ve daha karmaşık senaryolarda bir SSIS paketi kullanırdım.

Senin durumunda, SQL Agent işlerini aramak, basit ve yönetilebilir bir seçim gibi geliyor.

Son bir yorum : SQL, yapabildiği her seferinde bireysel işlemleri paralel hale getirmeye çalışıyor *. Bu, birbiri ardına değil, aynı anda 2 görevi yürütmenin, daha erken biteceğinin garantisi değildir. Bir şeyi gerçekten iyileştirip iyileştirmediğini görmek için dikkatlice test edin.

Aynı anda 8 görevi çalıştırmak için bir DTS paketi oluşturan bir geliştiricimiz vardı. Ne yazık ki, sadece 4 işlemcili bir sunucuydu :)

* Varsayılan ayarları varsayarak. Bu, sunucunun Maksimum Paralellik Derecesi Derecesi veya Affinity Maskesi değiştirilerek veya MAXDOP sorgu ipucu kullanılarak değiştirilebilir.


6

Evet, bir yöntem:

  1. 1. saklı yordam tamamlandığında, ikinci saklı yordamın çalışması için gereken tüm bilgileri içeren bir kayıt ekler.
  2. İkinci saklı yordam, her dakika veya istediğiniz zaman karar verdiğiniz bir iş olarak uygulanır.
  3. Girilen kayıtları kontrol eder, işlemini yapar ve kaydı eksiksiz olarak işaretler.

Bu, saklı yordamın yürütülmesini, çalıştırdığınız işlerin sayısıyla sınırlandırır; bu, bir kerede yalnızca bir istemci tarafından aranmasını istiyorsanız, aynı anda aynı işlemi çağıran birden fazla müşteriniz olabilir. . Ayrıca, müşteri bir bayrak yerleştirilip yerleştirilmediğini öğrenmek için veritabanını tekrar tekrar sorgulamadan işin tamamlandığını nasıl bilebilir?
Mr.Brownstone

1
@ Mr.Brownstone - İş, çalıştırıldığında farklı saklı yordam çağrılarıyla sıralanan birden fazla bekleyen görevi işleyebilir. Saklı yordam muhtemelen sp_start_jobher dakika oylamayı önlemek için dinamik olarak gerektiğinde başlatmaya veya gerekli işleri yaratmaya da çağrı yapabilir , ancak bu durumda karmaşıklık muhtemelen hizmet komisyoncusu kadar basit olmayacağı anlamına gelir.
Martin Smith

@MartinSmith Aslında bu 2. saklı yordam için bir iş ayarına sahibim, çünkü ilk işlem sayıları ile doğru bir şekilde eşitlenemeyen bazı problemler bulana kadar her gece çalıştırıldı. İşi ilk saklı yordamdan başlatırsam, asenkronize olur ve hemen SP'den geri döner mi?
Rachel,

@Rachel - Evet. sp_start_jobhemen döner. Gerektiği hangi izinleri hatırlayamıyorum.
Martin Smith

1
Büyük bir güvenlik açığı açmak istemiyorsanız, başka bir prosedürden / veritabanından bir işe başlamak oldukça karmaşık bir sorundur. Erland Sommarskog'un birleştirmeniz gereken farklı teknikler hakkında bir makalesi var: sommarskog.se/grantperm.html Ancak, burada tam bir çözüm yok.
Sebastian Meine

1

Diğer bir olasılık, tamamlanan bir denetim masasına bir denetim masasına yazma ve denetim masasına yazıldığında 2. saklı işlemi başlatan denetim masasına bir tetikleyici yerleştirmek olacaktır. Sürekli olarak anket yapmaya ve fazladan bir SQL Server Agent işine gerek yok.


3
İlk saklı prosedür denetim masasına ekleme tamamlanıncaya kadar geri dönmeyecek ve tetikleyici çalışmayı bitirinceye kadar gerçekleşmeyecekti (2. saklı yordama yapılan çağrı dahil)
Martin Smith

1
Bir Tetikleyici kullanmaya zaten baktım, ancak tetikleyiciler asenkronize değil , INSERTveya UPDATEdeyimiyle eşzamanlı olarak çalıştırılıyor , bu nedenle Martin, 1. işlemin bitinceye kadar beklemesinin beklediğini düşünüyor.
Rachel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.