Stored Procedure Prefix : sp_ vs diğerleri #QueryOptimization

Hız artık her şeyimiz oldu. Daha hızlı alışveriş yapabilmek için kredi kartlarımızdaki temassız özelliğini kullandığımız, alışveriş sitelerine sonraki seferde zaman kaybetmemek için kaydettiğimiz bilgilerimizin sebebi hız.

Hızın bu kadar önemli olduğu bir dünyada SQL Server’ımızın daha hızlı olması için yapabileceğimiz bütün geliştirmeleri uygulamaya çalışıyoruz.

Peki procedure’lerimizde “sp_” prefix’i ya da başka bir prefix kullanmanın bize nasıl bir yararı veya zararı olabilir.

Şöyle ki;

1 — SQL Server system procedure’lerini “sp_” prefix’i kullanarak oluşturuyor. Bu sebeple “sp_” ile başlayan bir procedure çalıştırdığınızda öncelikle arayacağı yer system database’leri oluyor.

2 — “sp_” prefix’i kullanıldığında procedure düzenleme işlemleri sırasında yanlışlıkla system procedure’lerine zarar verebilirsiniz. İşte Microsoft dökümanı.

Avoid the use of the sp_ prefix when naming procedures. This prefix is used by SQL Server to designate system procedures. Using the prefix can cause application code to break if there is a system procedure with the same name.

3- User database’leri üzerinde, system procedure’leriyle aynı isimde bir procedure oluşturup aşağıdaki şekilde çalıştırsanız bile, SQL Engine öncelikle master database’ine bakacağı için oradaki procedure’ü çalıştıracaktır.

Demolarımıza geçelim…

Şimdi system procedure’lerinden biriyle aynı isimde kendi database’im üzerinde bir procedure oluşturuyor ve çalıştırıyorum.

EXEC StackOverflow2010.dbo.sp_helpdb

Görüldüğü gibi benim procedure’de belirttiğim çıktıyı vermeyip, system database’leri altında olan aynı isimdeki SQL Server’a ait procedure’ü çalıştırarak sonuç verdi.

Şimdi başta bahsettiğimiz gibi “sp_” prefix’i olan ve olmayan aynı iki procedure arasındaki performans değerlerine bakalım.

Procedure içerikleri;

CREATE PROC [dbo].[sp_Posts] AS
BEGIN   
     SELECT top 10 * FROM Posts p
END

-----------------------------------

CREATE PROC [dbo].[usp_Posts] AS
BEGIN
     SELECT top 10 * FROM Posts p
END

Yine SQLQueryStress aracılığıyla procedure’lerimi 2 thread üzerinde 100’er kez çalıştırıyorum ve aynı IO işlemini yaptıkları halde CPU ve Elapsed Time üzerindeki farklılıkları elde ediyorum.

EXEC sp_Posts
  • Okunan page sayısı : 22.0000
  • Execute süresi : 0.0230 ms
  • CPU tüketimi : 0.0048 ms
EXEC usp_Posts
  • Okunan page sayısı : 22.0000
  • Execute süresi : 0.0134 ms
  • CPU tüketimi : 0.0035 ms

Değerler ufak gibi gözüküyor ama binlerce, milyonlarca kez çalışacak procedure’ler için önemli bir kazanç olacaktır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.