2013-01-19 20 views
6

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx linkindeki Clr işlevini geliştirmeye çalışıyorum.Daha hızlı bir normal ifade clr işlevi oluşturun

public static partial class UserDefinedFunctions 
{ 
    public static readonly RegexOptions Options = 
     RegexOptions.IgnorePatternWhitespace | 
     RegexOptions.Singleline; 

    [SqlFunction] 
    public static SqlBoolean RegexMatch(
     SqlChars input, SqlString pattern) 
    { 
     Regex regex = new Regex(pattern.Value, Options); 
     return regex.IsMatch(new string(input.Value)); 
    } 
} 

select * from Table1 where dbo.RegexMatch(col1, 'pattern') = 1 yürütmek zaman, Clr fonksiyonu tablodaki her satır için yeni Regex nesne oluşturmak.

Her Sql ifadesi için yalnızca bir Regex nesnesi oluşturmak mümkün mü? Her satır için sadece regex.Ismatch(...)'u arayın. Aşağıdaki kod geçerli mi? statik regex ait

public static partial class UserDefinedFunctions 
{ 
    public static readonly RegexOptions Options = 
     RegexOptions.IgnorePatternWhitespace | 
     RegexOptions.Singleline; 

    static Regex regex = null; 

    [SqlFunction] 
    public static SqlBoolean RegexMatch(
     SqlChars input, SqlString pattern) 
    { 
     if (regex == null) 
      regex = new Regex(pattern.Value, Options); 
     return regex.IsMatch(new string(input.Value)); 
    } 
} 
+0

Makale, "RegexOptions.Compiled" işlevini kullanırsanız önbelleğe alınmış olabilir, ancak bununla ilgili başka bir kanıt göremediğimizi belirtir ... –

+0

İlginç. Regex kurucusu derlenmiş ve aynı desen seçeneğine sahipse Regex örneğini yeniden kullanır mı? Singleton modelini düşünüyordum ama singletonun hayatından emin değilim. – ca9163d9

+0

Aynı gerçek * örneği * yeniden kullanmaz, ancak önceki örneği oluşturmak için yapılan tüm işleri yeniden kullanabilir. –

cevap

2

Kişisel UDF tabanlı örneği, muhtemelen doğrudan

System.Text.RegularExpressions.RegEx.IsMatch(string input, string pattern, RegexOptions options);

statik versiyonunu çağıran Sizin daha iyi bile yeniden kullanılmamaktadır.

Hata ayıklama modunda işler, üretimde yaptıklarından farklı çalışır ve SQL'in ihtiyaç duyduğu anda belleği boşaltacağını unutmayın.

Ayrıca, RegexOptions.Compiled ve CultureInvariant kullanmayı deneyin.

+0

Statik aşırı yüklenmeler, kaputun altında bir önbellek kullanır. Bu cevap güzel. +1 – usr

+0

Statik salt okunur yöntemin neden tekrar kullanılmayacağının merakı nedir? – ca9163d9