我有一个表(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
答案 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;