2011-06-23 8 views
1

約25k行のテーブルで次のUPDATEを実行しようとしましたが、24時間以上実行されていて完了していません。私は一度だけこのUPDATEを実行する必要がありますので、時間はそれほど問題ではありませんが、長いことは私にとってはうまくいくものではありません。ちょうどいくつかのレコードでそれを単独で実行しようとしたので、UPDATEステートメントは機能しますが、完全なテーブルに適用すると、それは枯渇します。LIKEでSQL UPDATEを最適化

イムLIKEはスローダウンを引き起こしていることは確かが、私は、これは任意の単純またはより高速にする方法任意のアイデアを持っていない、任意の手掛かりをいただければ幸いです。

UPDATE INVENTORY i2 

SET i2.BVRTLPRICE01 = 

(SELECT i1.BVRTLPRICE01 FROM INVENTORY i1 

WHERE 

i1.CODE = REPLACE(LEFT(i2.CODE,1), 'S', 'C') + SUBSTRING(i2.CODE,2,LENGTH(i2.CODE)))   

WHERE 

i2.CODE like 'S%' 
+0

どのRDBMSを使用していますか、どのバージョンですか? – Yuck

+0

そのPERVASIVE SQL v8.7 – seb

答えて

0

私はPervasiveを1回か2回しか使用していませんでしたが、問題が単純にLIKEのようにエンジンが恐ろしいことは想像できません。問題はおそらくサブクエリです。

私の代わりにこれをしようとするだろう:

UPDATE 
    I2 
SET 
    BVRTLPRICE01 = I1.BVRTLPRICE01 
FROM 
    INVENTORY I2 
INNER JOIN INVENTORY I1 ON 
    I1.CODE = REPLACE(LEFT(I2.CODE, 1), 'S', 'C') + 
       SUBSTRING(I2.CODE, 2, LENGTH(I2.CODE))) 
WHERE 
    I2.CODE LIKE 'S%' 

また、あなただけI1から1行に参加し、I2の行ごとに多くの行を取得していないことを確認してください。

+0

がありがとう、数秒以内に実行されました! – seb

0

ではなく、サブクエリの参加適切な使用

UPDATE INVENTORY i2 
SET i2.BVRTLPRICE01 = i1.BVRTLPRICE01 
FROM INVENTORY i1,INVENTORY i2 
WHERE i1.CODE = REPLACE(LEFT(i2.CODE,1), 'S', 'C') + SUBSTRING(i2.CODE,2,LENGTH(i2.CODE))) 
AND i2.CODE like 'S%' 
0

私は少し鋭敏です。間違っているかもしれませんが、狂ったランタイムと小さなデータセットに基づいています。あなたのサブクエリに

LIMIT 1 

を追加してください。