2011-07-19 14 views
-1

ユーザーテーブルを移行するためのスクリプトを作成しています。 基本的に、私は3つのdbテーブルを持っています:イベント、ユーザー、newusers。 usersテーブルはnewusersテーブルに置き換えられ、後で削除されます。 newusersテーブルには、oldusers id(PK)値を持つカラムがあります。SQLクエリのパフォーマンス

events2テーブルには、2人のFKがあります.1人はユーザー、1人はnewusersです。 私は既にレコードユーザーを新しいユーザーに移行する部分を書いています。ここでは、イベント2の表のFKを更新することが苦労しています。

私は次のように書いた:

update events2 
set newusersid = newuser.id 
from events2 e 
inner join newusers newuser on newuser.olduserid = e.userid; 

をそれが実行に非常に長い時間がかかります。改善された方法がありますか?

移行の理由の1つは、newusersテーブルのid値を変更して、対応するユーザーレコードに同じPK値を再使用できないということです。あなたの助けのための

おかげで

N.

+1

一時的なインデックスを 'olduserid'に追加して、アップグレードを完了した後で削除する必要があるかもしれません。 – Blazes

+0

「非常に長い時間ですか?これは1回限りの操作です。高速にする必要がありますか? –

+0

@marc_s私はpostgresqlを使用しています8.4 – Nikko

答えて

2

あなたはそのためにolduseridとユーザーIDでNEWUSERテーブルにインデックスを持っていますか?それは質問をかなり高速化するはずです。

関連するイベントテーブルの何百万もの行を更新している場合、クエリの実行速度の限界に達します。

+0

そして、 'newuser.olduserid'にインデックスがありますか? –

0
  1. あなたはnewusers.olduserid events2.useridにINDEXとを持っていることを確認し
  2. あなたは、わからない

詳しい情報は、データベースについて必要とされ、パフォーマンスへの影響をSELECT INTOクエリを使用して試すことができます、テーブル、およびハードウェア。

+0

ヒントをお寄せいただきありがとうございます。私の無知を赦してください。イベント2の既存のレコードを更新する必要があります。この場合、select intoの使い方はわかりません。 – Nikko

+0

私はもっとはっきりしていたはずです。 SELECT INTOまたはINSERT INTOで 'events2'を作成したと仮定しました。それをして更新するのではなく、 'events2'の作成時に更新を行うと言っていました。 – vol7ron

1

あなたの質問は間違っているようです。次のようなはずはありませんか?

update events2 
set newusersid = newuser.id 
from newusers newuser 
where newuser.olduserid = events2.userid; 
+0

ありがとうございます! – Nikko

関連する問題