我在庞大的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%'))
当我执行第二次查询时,它运行得非常快速和流畅。
我的提案是否有效,我可以使用我的提案并获得与首次查询相同的结果吗?
由于
答案 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}}