Sto cercando di migliorare la funzione Clr nel collegamento http://msdn.microsoft.com/en-us/magazine/cc163473.aspx.Creare una funzione clr di espressione regolare più veloce
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));
}
}
Quando eseguire select * from Table1 where dbo.RegexMatch(col1, 'pattern') = 1
, la funzione Clr creare un nuovo oggetto Regex per ogni riga della tabella.
È possibile creare un solo oggetto Regex per ogni istruzione Sql? Per ogni riga basta chiamare il numero regex.Ismatch(...)
. Il seguente codice è valido? esempio basato
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));
}
}
L'articolo suggerisce che se si utilizza 'RegexOptions.Compiled' allora potrebbe essere memorizzato nella cache, ma non riesco a vedere altre prove ... –
Interessante. Il costruttore di Regex riutilizzerà l'istanza Regex se ha la possibilità di compilare e lo stesso modello? Stavo pensando ad alcuni pattern di Singleton ma non sono sicuro della vita del singleton. – ca9163d9
Non riutilizzerebbe la stessa * istanza * effettiva, ma potrebbe riutilizzare tutto il lavoro svolto per creare l'istanza precedente. –