SQL Server查询性能替代(在LIKE状态中连接字符串)

时间:2017-09-27 11:29:23

标签: sql sql-server sqlperformance

我在庞大的SQL Server表上遇到了一个性能问题。我们有这个问题:

    SELECT cycle
       FROM   product AS pr
       INNER JOIN productdetails AS prd
           ON prd.label = 'XRT354511' 
           AND ( pr.cycle = prd.cycle OR prd.cycle LIKE pr.cycle+ '-EXECUTED%' ) 

OR语句使用之后的条件就像将产品表循环连接到-EXECUTED(我们不关心循环中的' -EXECUTED'位置,我们只需要知道循环是否包含-EXECUTED)。

然后,我解决此问题的建议是更改查询此问题:

SELECT cycle
   FROM   product AS pr
   INNER JOIN productdetails AS prd
       ON prd.label = 'XRT354511' 
       AND ( pr.cycle = prd.cycle
          OR (pr.cycle = prd.cycle AND pr.cycle LIKE '-EXECUTED%'))

当我执行第二次查询时,它运行得非常快速和流畅。

我的提案是否有效,我可以使用我的提案并获得与首次查询相同的结果吗?

由于

3 个答案:

答案 0 :(得分:1)

你可以用这个更改OR部分吗?

OR (pr.cycle = LEFT(prd.cycle, LEN(pr.cycle)) AND prd.cycle LIKE '%-EXECUTED%')

答案 1 :(得分:1)

您的问题:"我的提案是否有效,我可以使用我的提案并获得与首次查询相同的结果吗?"

不,他们不一样。 让我们按照以下方式重写您的两个查询,这样我们就可以专注于连接条件:

SELECT cycle
FROM   product AS pr
INNER JOIN productdetails AS prd ON  pr.cycle = prd.cycle OR prd.cycle LIKE pr.cycle+ '-EXECUTED%'
WHERE prd.label = 'XRT354511' ;

SELECT cycle
FROM   product AS pr
INNER JOIN productdetails AS prd ON  pr.cycle = prd.cycle
      OR (pr.cycle = prd.cycle AND pr.cycle LIKE '-EXECUTED%')
WHERE prd.label = 'XRT354511' ;

第一个条件是

pr.cycle = prd.cycle OR prd.cycle LIKE pr.cycle+ '-EXECUTED%'

第二个(你的建议)是

  pr.cycle = prd.cycle
    OR (pr.cycle = prd.cycle AND pr.cycle LIKE '-EXECUTED%')

后者相当于

 pr.cycle = prd.cycle OR pr.cycle LIKE '-EXECUTED%

正如您可以通过这种简化形式轻松看到的,在您首先寻找(例如,如果pr.cycle =' 100')' 100'并且' 100-EXECUTED%'。在后者你寻找' 100' (或者是周期性的' EXECUTED%')

如果您发布样本数据,我可以尝试与您一起查看结果并尝试分析性能。

答案 2 :(得分:0)

你的第一个问题的答案是否定的,你的解决方案将得到比原始查询不同的结果

要优化查询,您应该分析产品和产品详细信息表中哪些索引处于活动状态..

你可以试试;

"-EXECUTED"

这会将它分成两个查询,第一个可能会使用一个索引而第二个应该是快速的,然后是类似的运算符

但你也告诉我productdetails.cycle

ON prd.cycle COLLATE LATIN1_GENERAL_BIN LIKE (pr.cycle + '-%-EXECUTED%') COLLATE LATIN1_GENERAL_BIN 的位置不应该很重要

在这种情况下,您需要将第二个连接条件更改为

"-%"

请注意"-EXECUTED" 之前的<{strong> UNION ALL

还要注意第二个查询的最后一个条件,您可以尝试使用简单UNION更改AND pr.cycle <> prd.cycle并删除{{1}}