2013-01-19 15 views
6

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)); 
    } 
} 
+0

L'articolo suggerisce che se si utilizza 'RegexOptions.Compiled' allora potrebbe essere memorizzato nella cache, ma non riesco a vedere altre prove ... –

+0

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

+0

Non riutilizzerebbe la stessa * istanza * effettiva, ma potrebbe riutilizzare tutto il lavoro svolto per creare l'istanza precedente. –

risposta

2

tuo UDF della vostra regex statico non è probabilmente ancora riutilizzato, tuo meglio di chiamare la versione statica di

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

direttamente.

Si noti che in modalità di debug le cose funzionano diversamente da quello che fanno in produzione e che SQL sta per liberare memoria quando è necessario.

Inoltre, provare a utilizzare RegexOptions.Compiled e CultureInvariant.

+0

I sovraccarichi statici utilizzano una cache sotto il cofano, motivo per cui questa risposta è buona. +1 – usr

+0

Stranamente perché il metodo statico di sola lettura non può nemmeno essere riutilizzato? – ca9163d9