将多个交叉应用合并为一个查询
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;
我有一个 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;