将多个Cross Applies合并到一个查询中

时间:2016-02-11 00:28:54

标签: sql-server tsql cross-apply

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

我使用表值RegEx函数(master.dbo.RegExMatches)来解析这九个字段中的单词并将它们放入具有记录ID(DataWordFullMap)的表中({ {1}}在下面的示例中),单词(Id),列名(第一个查询中为wordtoadd,第二个中为DE87)和列中的起始字符位置({ {1}})。

函数DE150采用参数MatchIndex。当前设置必须为每个字段扫描一次表(每个都在单独的查询中),而不是在一次扫描中将函数应用于九列中的每一列。

是否有一种有效的方法将这些master.dbo.RegExMatches语句合并到一个查询中?也许通过在regex, column name, options结果中添加一个附加列,该结果具有正则表达式函数中使用的列的名称?有些列大多数是CROSS APPLY,有些列没有CROSS APPLY值,因此对九个中的每一个进行完全扫描似乎都很浪费,因为九个中的一些对于大多数扫描都没有结果

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

NULL

1 个答案:

答案 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;