2017-09-27 6 views
0

巨大なSQL Serverテーブルに1つのパフォーマンスの問題があります。私たちは、このクエリを持っている:SQL Serverクエリのパフォーマンスの代替(LIKEステートメントでの文字列の連結)

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が含まれます。

そこで、この問題を解決するために、私の提案は、この1のためにそのクエリを変更です:

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%')) 

私は2番目のクエリを実行すると、それはかなり高速かつスムーズに実行されます。

私の提案は有効ですか?私の提案を使用して、最初のクエリと同じ結果を得ることはできますか?

おかげ

+3

ロジックは私に違って見える削除しようとすることができます。実際のデータを含めると、最初のクエリを改善する方法がわかるはずです。 2番目のクエリが同じ結果を返してよりうまく実行される場合は、もちろんそれを使用します。 –

+3

これらのクエリは2つの異なる結果を返します –

+0

クエリは同じ結果セットを返しますか?大括弧とAND/OR演算子には非常に注意が必要です。 –

答えて

1

は、あなたはこの1つでOR部分を変更できますか?

OR (pr.cycle = LEFT(prd.cycle, LEN(pr.cycle)) AND prd.cycle LIKE '%-EXECUTED%') 
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%' 

秒(ご提案)である: のは仕方を以下にあなたの2つのクエリを書き換えてみましょう、私たちは、条件に集中参加することができますis

pr.cycle = prd.cycle 
    OR (pr.cycle = prd.cycle AND pr.cycle LIKE '-EXECUTED%') 
あなたが最初にあなたが(例えばを探しに、この簡略化した形で簡単に見ることができるように

この後者は

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

に相当します。 if pr.cycle = '100') '100'と '100-EXECUTED%'となります。後者では、 '100'(またはpr.cycle LIKE 'EXECUTED%')を検索します。

サンプルデータを投稿すると、結果を分析してパフォーマンスを分析できます。

0

あなたの第一の質問への答えはNOである、あなたのソリューションは、あなたの製品やproductdetailsテーブル上でアクティブであるインデックスを分析する必要があるクエリを最適化するために、元のクエリ

よりdiiferent結果が得られます。..

お試しいただけます。これは、2つのクエリでそれを分割します

SELECT cycle 
FROM product AS pr 
INNER JOIN productdetails AS prd ON pr.cycle = prd.cycle 
WHERE prd.label = 'XRT354511' 

UNION ALL 

SELECT cycle 
FROM product AS pr 
INNER JOIN productdetails AS prd 
ON SUBSTRING(prd.cycle, 1, LEN(pr.cycle)+9) COLLATE LATIN1_GENERAL_BIN = (pr.cycle + '-EXECUTED') COLLATE LATIN1_GENERAL_BIN 
WHERE prd.label = 'XRT354511' 
AND pr.cycle <> prd.cycle 

、第一は、おそらくインデックスと第二を使用すると、わずかに高速である必要があり、その後のようなオペレータ

しかし、あなたはまた、"-EXECUTED"の位置は重要ではないことを告げましたあなたは第二を変更する必要がある。この場合productdetails.cycle

ON prd.cycle COLLATE LATIN1_GENERAL_BIN LIKE (pr.cycle + '-%-EXECUTED%') COLLATE LATIN1_GENERAL_BIN 

に結合条件を01に注意してくださいまた、第二のクエリの最後の条件を注意し"-EXECUTED"

前に、あなたは簡単なUNIONUNION ALLを変更し、AND pr.cycle <> prd.cycle

関連する問題