Optimizasyon: Değişken bildirimlerini prosedürünüzün üstüne taşıma


15

Bazı saklı yordamları optimize etmeye çalışırken, DBA ile oturdum ve yüksek engelleme ve / veya yüksek okuma / yazma etkinliği olan bazı saklı yordamlar geçirdim.

DBA'nın bahsettiği bir şey, TABLEyeniden derlemeleri önlemek için saklı yordamın üstündeki tüm değişkenleri (özellikle değişkenleri ) bildirmem gerekti.

Bunu ilk duydum ve sahip olduğumuz tüm farklı saklı prosedürleri tekrar gözden geçirmeden önce bazı onaylar arıyordum. Ona "kodun geç görüntülenmesi" diyordu ve yeniden derleme engellemeyi açıklayacak şemayı kilitliyordu.

Tüm değişken bildirimlerini saklı yordamınızın üstüne taşımak yeniden derlemeleri azaltır mı?

Yanıtlar:


18

Hayır.

Bu ya uzun zaman önce doğruydu (ve en azından SQL Server 2000'den beri değil), ya da asla doğru değildi ve DBA'nız tavsiyesini aşağıdakilerle karıştırdı :

Saklı yordamın başlangıcında geçici tablolar için tüm DDL deyimlerini (dizin oluşturma gibi) birlikte gruplandırmak önemlidir. Bu DDL ifadelerini bir araya getirerek şema değişikliğine bağlı gereksiz derlemeler önlenebilir.

Bu önerinin ardındaki gerekçenin başka bir açıklamasını bu sayfada bulabilirsiniz .

Bu Microsoft KB'ye bakarsak, saklı yordam yeniden derlemesinin nedeninin aşağıdakilerden biri olabileceğini görürüz (SQL Server 2005+):

  1. Şema değişti.
  2. İstatistikler değişti.
  3. DNR'yi yeniden derleyin.
  4. Ayarlama seçeneği değiştirildi.
  5. Sıcaklık tablosu değişti.
  6. Uzak satır kümesi değişti.
  7. Göz atma izinleri için değiştirildi.
  8. Sorgu bildirim ortamı değişti.
  9. MPI görünümü değişti.
  10. İmleç seçenekleri değişti.
  11. Yeniden derleme seçeneği ile.

Bir değişkenin (bir tablo değişkeni bile (yani @table_variable)) bildirilmesi, bu olayların hiçbirini tetikleyemez, çünkü bir değişkenin bildirilmesi DDL olarak sayılmaz . Bir değişken (bir tablo değişkeni bile), yalnızca T-SQL programlamanız için kullanılan geçici bir nesnedir. Bu yüzden tablo değişkenleri hiçbir istatistikleri almak ve olan işlemler bağlı değildir . Bir değişkeni (tabloyu ya da değil) bildirmek proc derlemesini tetikleyemez.

Geçici bir tablo (yani oluşturma #temp_table) ya da bir dizin, ancak, bir veritabanının fiziksel tanımını etkileyen DDL. Geçici tablolar ve dizinler, istatistiklere ve işlem denetimine sahip "gerçek" nesnelerdir, bu nedenle bunları oluşturmak yukarıdaki listede 1, 2 veya 5 olaylarından herhangi birini tetikleyebilir ve böylece bir proc derlemesini tetikleyebilir.


3

Bir fark yaratmamalı veya derleme kilitlerini azaltmamalı veya daha az yeniden derlemenin yığının yarısında veya üstünde bir değişken bildirmesine neden olmamalıdır. Bunu daha fazla okunabilirlik için en üstte yapıyorum.

Sorunun "DBA düşüncem nedir?" Kısmına gelmek için, gelebileceğim tek şey (Nick'in eskiden nasıl bir şey olduğunu düşündükleri dışında) belki de Parametre Sniffing'den bahsediyorlar (Bkz. Basit konuşma üzerine bu bağlantıda Seçenek 2 )

Engellemeniz hakkında -> Gerçek engelleme görüyorsanız, DBA'nızın büyük olasılıkla bahsettiği derleme kilidi çekişmesi türü bu değildir. Bunu etkileyen bazı şeyler olduğu doğru olsa da (örneğin şema kalifikasyon tabloları değil, saklı yordam çağrılarınızı nitelendiren şema değil), bu kesinlikle yüksek okumalarınızın nedeni değildir ve muhtemelen engellemenizin nedeni değildir. Bu derleme kilitlerinden kaçınmak için elinizden geleni yapmalısınız. Ancak, ayarlanan yordam kodunun geri kalanını ayarlama ve optimize etme, değişkenlerin nerede olduğu hakkında endişelenmekten daha önemli bir görev olarak bakacağım. Ayrıca , burada sorun yaşamadığınızı doğrulamak istiyorsanız, Derleme kilitlerinin nasıl tanımlanacağı ve çözüleceği konusunu da okuyabilirsiniz.

Bunlardan önce / sonra örnekleri gönderin ve burada DBA'nın ne sürdüğünü göreceğiz.

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.