リンク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));
}
}
この記事では、 'RegexOptions.Compiled'を使用するとキャッシュされる可能性があると示唆していますが、他の証拠は表示されません。 –
興味深い。 Regexのコンストラクタは、それがコンパイルされ、同じパターンのオプションを持っている場合、Regexのインスタンスを再利用するでしょうか?私はシングルトンのパターンを考えていましたが、シングルトンの人生は確かではありませんでした。 – ca9163d9
同じ実際のインスタンス*は再利用されませんでしたが、前のインスタンスを作成するためにすべての作業が再利用される可能性があります。 –