将多个交叉应用合并为一个查询

Consolidating multiple Cross Applies into one query

我有一个 table (Data),其中包含九个长文本字段。它目前有 1,000,000 条记录并且还在增长,所以我想加快速度。

我正在使用 Table-Valued RegEx 函数 (master.dbo.RegExMatches) 从这九个字段中解析出单词并将它们放入 table (DataWordFullMap ) 具有记录 ID(下例中的 Id)、单词(wordtoadd)、列名(第一个查询中的 DE87,第二个查询中的 DE150)和列中的起始字符位置 (MatchIndex)。

函数master.dbo.RegExMatches接受参数regex, column name, options。当前设置必须为每个字段扫描一次 table(每个字段在单独的查询中),而不是在一次扫描中将函数应用于九列中的每一列。

有没有一种有效的方法可以将这些 CROSS APPLY 语句合并到一个查询中?也许通过向 CROSS APPLY 结果添加一个附加列,该列具有正则表达式函数中使用的列的名称?有些列大部分是 NULL,其他列没有 NULL 值,因此对九个中的每一个进行完整扫描似乎很浪费,因为九个中的一些对于大部分扫描都没有结果.

以下代码片段显示了所涉及的九个查询中的两个:

INSERT INTO DataWordFullMap
SELECT Id ,
       CAST ( Match AS nvarchar( 255 ))  AS wordtoadd ,
       'DE87' ,
       MatchIndex
  FROM
       Data CROSS APPLY master.dbo.RegExMatches( '[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?' , DE87 , master.dbo.RegExOptionEnumeration( 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 ));

INSERT INTO DataWordFullMap
SELECT Id ,
       CAST ( Match AS nvarchar( 255 ))  AS wordtoadd ,
       'DE150' ,
       MatchIndex
  FROM
       Data CROSS APPLY master.dbo.RegExMatches( '[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?' , DE150 , master.dbo.RegExOptionEnumeration( 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 ));
INSERT INTO datawordfullmap(
    -- ...
)
SELECT
    d.id,
    rems.wordtoadd
    rems.cn,
    rems.matchindex
FROM
    data AS d
    CROSS APPLY (
        SELECT 
            cn='DE87',
            wordtoadd=CAST(rem.match AS NVARCHAR(255)),
            rem.matchindex
        FROM
            master.dbo.RegExMatches (
                '[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?',
                d.DE87,
                master.dbo.RegExOptionEnumeration( 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 )
            ) AS rem
        UNION ALL
        SELECT 
            cn='DE150',
            wordtoadd=CAST(rem.match AS NVARCHAR(255)),
            rem.matchindex
        FROM
            master.dbo.RegExMatches (
                '[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?',
                d.DE150,
                master.dbo.RegExOptionEnumeration( 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 )
            ) AS rem
        -- UNION ALL
        -- ...
    ) AS rems;