1

約 25,000 行のテーブルで次の UPDATE を実行しようとしましたが、24 時間以上実行されていましたが、完了していません。この UPDATE を実行する必要があるのは 1 回だけなので、時間はそれほど問題ではありませんが、それほど長くは機能しません。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%'
4

3 に答える 3

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%'
于 2011-06-23T16:39:32.557 に答える
0

私は小さな予感があります。間違っているかもしれませんが、クレイジーなランタイムと小さなデータセットに基づいています。追加してみてください

LIMIT 1

サブクエリに。

于 2011-06-23T16:39:52.523 に答える
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 の各行で多くの行を取得していないことを確認してください。

于 2011-06-23T17:13:07.803 に答える