Более быстрое выражение регулярного выражения для извлечения имени хранимой процедуры

#c# #regex

#c# #регулярное выражение

Вопрос:

У меня есть эта хранимая процедура, и мне дано имя таблицы (например: « userCompanyGrouping_tbl «). Я должен извлечь сохраненные имена процессов, в которых используется данное имя таблицы.
Я использую выражение регулярного выражения CREATE PROCEDURE\s*(?<proc_name>.*|n)(.|n)*userCompanyGrouping_tbl для извлечения хранимой процедуры из приведенного ниже файла sample .sql, и он работает очень медленно.

Я должен выполнить поиск по нескольким файлам в каталоге размером в ГБ. Результат получается очень медленным. Мне нужно более быстрое выражение регулярных выражений для извлечения имени процедуры.

Я использую движок регулярных выражений C #.

  USE [BI]
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ActiveUsersRelatedCompanies_prc]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[ActiveUsersRelatedCompanies_prc]

    GO

    CREATE PROCEDURE  [dbo].[ActiveUsersRelatedCompanies_prc]  
        @Usercompanyid INT
    AS     
    Begin  

    select * 
    FROM dbo.ActiveUsersRelatedCompanies_tbl (NOLOCK)
    WHERE userCompanyId in (
            select  ucg2.userCompanyId
            from    `userCompanyGrouping_tbl` u
                    inner join userCompanyGrouping_tbl ucg2
                        on isNull(u.subParentCompanyId,u.parentCompanyId) = 
                            (case when u.subParentCompanyId is not null then ucg2.subParentCompanyId 
                                else ucg2.parentCompanyId end)
            where   u.userCompanyId = @userCompanyID
    )       
    order by userCompanyName, userGroup, fullName
    END
 

Комментарии:

1. Первое, что приходит на ум: попробуйте добавить ^s* в начале регулярного выражения, если оно соответствует вашим требованиям.

2. @Smileek это не соответствует моим требованиям: (

3. Вы уверены, что регулярное выражение является вашим узким местом? Как обстоят дела с вводом-выводом с диска? Использовали ли вы какое-либо профилирование производительности для подтверждения своей гипотезы? 🙂

4. @Luaan для ввода-вывода я использую «var txtFiles = Directory . Перечислять файлы (sourceDirectory, » . «, SearchOption. AllDirectories);» для чтения файлов внутри каталогов……. Поэтому я думаю, что в этом есть большая проблема

Ответ №1:

Следующее регулярное выражение будет лучше, как написано выше:

 ^s*[^(--)]{0}(CREATE  PROCEDURE|ALTER  PROCEDURE)s (?<ParentProcName>(w|_|[|]|.)*)
 

«ParentProcName» будет фиксировать имя хранимой процедуры, которая либо создана, либо изменена