2013-01-19 13 views
6

リンクhttp://msdn.microsoft.com/en-us/magazine/cc163473.aspxでClr関数を改善しようとしています。より速い正規表現clr関数を作成する

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を実行するCLR関数は、テーブル内の行ごとに新しい正規表現オブジェクトを作成します。

Sql文ごとにRegexオブジェクトを1つだけ作成できますか?各行については、regex.Ismatch(...)を呼び出してください。次のコードは有効ですか?

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

この記事では、 'RegexOptions.Compiled'を使用するとキャッシュされる可能性があると示唆していますが、他の証拠は表示されません。 –

+0

興味深い。 Regexのコンストラクタは、それがコンパイルされ、同じパターンのオプションを持っている場合、Regexのインスタンスを再利用するでしょうか?私はシングルトンのパターンを考えていましたが、シングルトンの人生は確かではありませんでした。 – ca9163d9

+0

同じ実際のインスタンス*は再利用されませんでしたが、前のインスタンスを作成するためにすべての作業が再利用される可能性があります。 –

答えて

2

あなたの静的正規表現のあなたのUDFベースのインスタンスは、おそらく直接

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

の静的バージョンを呼び出すのも、再使用、あなたのより良いではありません。

デバッグモードでは、プロダクションでの作業とは異なる作業と、必要なときにSQLがメモリを解放することに注意してください。

また、RegexOptions.CompiledCultureInvariantを試してみてください。

+0

静的オーバーロードでは、キャッシュがフード内で使用されますこの答えは良いです。 +1 – usr

+0

なぜ静的読み取り専用メソッドは再利用さえできないのでしょうか? – ca9163d9