2012-11-08 19 views
7

Dün bir db field türünü almak için bir senaryo aldık ve bunun temelini alanın açıklamasını yazmamız gerekti.Veritabanı İşlevi VS Vaka Açıklaması

Select (Case DB_Type When 'I' Then 'Intermediate' 
         When 'P' Then 'Pending' 
         Else 'Basic' 
     End) 
From DB_table 

Sanki bunu daha fazla yeniden kullanılabilir olacaktır çünkü bu durumda ifadenin yerine db işlevi yazmak önerdi.

ilginç parçasıdır
Select dbo.GetTypeName(DB_Type) 
from DB_table 

gibi, bizim geliştirici biri kullanılarak veritabanı işlevi Case statement daha yavaş olan verimsizdatabase functions gibi olacaktır söyledi. Verimlilik açısından daha iyi bir yaklaşım olan cevabı bulmak için internette araştırdım ama maalesef tatmin edici bir cevap olarak değerlendirilebilecek hiçbir şey bulamadım. Lütfen düşüncelerinle beni aydınlat, hangi yaklaşım daha iyi?

+1

Bu 'dbo.GetTypeName (DB_Type)', aynı "CASE" ifadesine sahip mi? Yani: "CASE" ifadesinin doğrudan bir sorguya yazılması ile performans ve yeniden kullanılabilirlik açısından kullanıcı tanımlı bir işlev *** içine koymak arasındaki farkı soruyorsunuz. Sağ? –

+0

Evet! Her şey aynı. –

cevap

7
UDF function is always slower than case statements 

aşağıdaki makale

http://www.sql-server-performance.com/2005/sql-server-udfs/

UDF kullanılacağını göstermektedir makale

http://blogs.msdn.com/b/sqlserverfaq/archive/2009/10/06/performance-benefits-of-using-expression-over-user-defined-functions.aspx

bakınız

Özet: Kullanıcı tanımlı fonksiyonlar malıdır.Bu ceza sorgu sıraları, tipik olarak, 1000 veya daha fazla olan çok sayıda bir UDF geçerli olarak kötü sorgu gerçekleştirme zamanı gösterir olduğunda

var olan büyük bir performans ceza ödenir. Ceza, SQL Server veritabanı motoru, işlem gibi kendi iç imlecini oluşturması gerektiğinden oluşur. Her satırdaki her UDF'yi çağırmalıdır. UDF WHERE maddesinde kullanılıyorsa, bu satırların filtrelenmesinin bir parçası olarak gerçekleşebilir. Seçim listesinde UDF kullanılıyorsa, sorgu işleminin bir sonraki aşamasına geçmek için sorgu sonuçları oluşturulurken bu olur. SQL Server'ı en çok yavaşlatan satır işlemesi bu satırdır.

1

Bir skaler işlev (bir değer döndüren bir işlev) kullanıldığında, işlevin içeriği her satırda bir kez yürütülür, ancak büyük/küçük harf ifadesi tüm kümede yürütülür.

Tüm kümeye karşı çalışarak sunucunuzun sorgunuzu daha verimli bir şekilde optimize etmesine izin verirsiniz.

Bu nedenle, aynı sorgu, aynı sorguyu büyük bir veri kümesine karşı iki yolu da çalıştırır ve işlev daha yavaş olmalıdır. Bununla birlikte, verilerinize karşı çalışırken farklılıklar önemsiz olabilir; bu nedenle, her iki yöntemi de denemeniz ve herhangi bir performans ticaretinin bir işlevin artan faydasına değip değmeyeceğini belirlemek için test etmeniz gerekir.