Sql 在使用另一个表作为模式的表中使用REGEXP(速度太慢)

Sql 在使用另一个表作为模式的表中使用REGEXP(速度太慢),sql,tsql,Sql,Tsql,首先谢谢你的帮助 我刚开始使用tsql,但在性能方面遇到了问题 我有两个表表1和表2,表2给我很多f模式,如果我在表1的每一行中找到,我会检查这些模式,如果出现这种情况,我会保存到表1的另一列 所以我将这个字符串转换成一个regexp,并使用像这样的“Like”表达式 UPDATE table1 AS tb1 SET CASE WHEN tb1.ft IS NOT NULL tb1.ft = tb1.ft + ',' +tb2.[as] ELSE tb1.ft = tb2.[a

首先谢谢你的帮助

我刚开始使用tsql,但在性能方面遇到了问题

我有两个表表1表2表2给我很多f模式,如果我在表1的每一行中找到,我会检查这些模式,如果出现这种情况,我会保存到表1的另一列

所以我将这个字符串转换成一个regexp,并使用像这样的“Like”表达式

UPDATE table1 AS tb1
SET CASE 
    WHEN tb1.ft IS NOT NULL tb1.ft = tb1.ft + ',' +tb2.[as]
    ELSE tb1.ft = tb2.[as]    
FROM table1,
INNER JOIN (
    SELECT DISTINCT [as]
    FROM table2
           ) AS tb2
ON fn like '%' +tb2.[as]+'%' OR fp like '%' +tb2.[as]+'%'
你们认为有办法提高绩效吗?我有点陷入了这个解决方案


p、 s:我没有测试更新,只是选择了一个。首先,正确的语法应该是这样的:

UPDATE t1
    SET ft = COALESCE(tb1.ft + ',' +tb2.x, tb2.x)
    ELSE tb1.ft = tb2.x  
FROM table1 t1 INNER JOIN
     (SELECT DISTINCT [as] as x
      FROM table2
     ) t2
     ON t1.fn like '%' + tb2.x + '%' OR t1.fp like '%' + t2.x + '%';
性能仍然很差,但这至少可以满足您的需要


至于进一步的性能改进,我想你需要放弃。这在SQLServer中很难改进。我注意到您似乎正在构建一个逗号分隔的列表。这表明数据模型非常糟糕。因此,可能有不同的数据模型来解决您的问题。如果您感兴趣,请询问另一个问题,并提供有关您试图完成的任务的更多详细信息,并提供示例数据和所需结果。

首先,正确的语法更像这样:

UPDATE t1
    SET ft = COALESCE(tb1.ft + ',' +tb2.x, tb2.x)
    ELSE tb1.ft = tb2.x  
FROM table1 t1 INNER JOIN
     (SELECT DISTINCT [as] as x
      FROM table2
     ) t2
     ON t1.fn like '%' + tb2.x + '%' OR t1.fp like '%' + t2.x + '%';
性能仍然很差,但这至少可以满足您的需要


至于进一步的性能改进,我想你需要放弃。这在SQLServer中很难改进。我注意到您似乎正在构建一个逗号分隔的列表。这表明数据模型非常糟糕。因此,可能有不同的数据模型来解决您的问题。如果您感兴趣,请询问另一个问题,并提供有关您试图完成的任务的更多详细信息,并提供示例数据和所需结果。

如果不知道表的数量/大小,则很难评估查询性能。我通常单独查询临时表步骤。如果每个临时表的数据集都很小

-- put to temp table t2
SELECT DISTINCT [as] as x 
into #t2
FROM table2;

-- put to temp table t3
SELECT tb1.id, tb1.ft, #t2.x into #t3
FROM table1 t1 INNER JOIN #t2 on t1.fn like '%' + #t2.x + '%' OR t1.fp like '%' + #t2.x + '%';

--collapse it as Gordon Linoff or try the following methods
--refer to https://stackoverflow.com/questions/194852/how-to-concatenate-text-from-multiple-rows-into-a-single-text-string-in-sql-serv
UPDATE t1
SET ft = COALESCE(tb1.ft + ',' +tb2.x, tb2.x)
        ELSE tb1.ft = tb2.x 
FROM table1 t1 INNER JOIN #t3 on t1.id = #t3.id
指 因为崩溃


请在我的SQL编辑器中找到清晰的版本

如果不知道表的体积/大小,很难评估查询性能。我通常单独查询临时表步骤。如果每个临时表的数据集都很小

-- put to temp table t2
SELECT DISTINCT [as] as x 
into #t2
FROM table2;

-- put to temp table t3
SELECT tb1.id, tb1.ft, #t2.x into #t3
FROM table1 t1 INNER JOIN #t2 on t1.fn like '%' + #t2.x + '%' OR t1.fp like '%' + #t2.x + '%';

--collapse it as Gordon Linoff or try the following methods
--refer to https://stackoverflow.com/questions/194852/how-to-concatenate-text-from-multiple-rows-into-a-single-text-string-in-sql-serv
UPDATE t1
SET ft = COALESCE(tb1.ft + ',' +tb2.x, tb2.x)
        ELSE tb1.ft = tb2.x 
FROM table1 t1 INNER JOIN #t3 on t1.id = #t3.id
指 因为崩溃

请在我的SQL编辑器中找到清除版本