使用另一个TABLE作为模式在TABLE中使用REGEXP(太慢)

时间:2018-03-01 00:21:05

标签: sql tsql

首先感谢你的帮助。

我刚开始使用tsql而且我遇到了性能问题。

我有两个表 table1 table2 table2 给我很多f模式,如果我在每行中找到,我会检查 table1 ,如果发生,我会保存到 table1 中的另一列。

所以我将这个字符串转换为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:我没有测试更新,只有一个选择。

2 个答案:

答案 0 :(得分:3)

首先,正确的语法看起来更像是这样:

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 + '%';

性能仍然不好,但这至少可以达到你想要的效果。

至于进一步的性能提升,我怀疑你需要放弃它。这在SQL Server中很难改进。我注意到您似乎正在构建以逗号分隔的列表。这表明数据模型非常糟糕。因此,可能有一些方法可以使用不同的数据模型来解决您的问题。如果您有兴趣,可以提出另一个问题,详细了解您要完成的工作 - 并提供样本数据和所需结果。

答案 1 :(得分:0)

在不知道表的数量/大小的情况下,很难评估查询性能。我通常将查询分为临时表步骤。如果每个临时表的数据集都很小。

-- 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

参考How to concatenate text from multiple rows into a single text string in SQL server? 崩溃。

请在我的SQL编辑器https://sqleditor.net/q/HJIWTnSuM

中找到明确版本