2016-04-03 14 views
0

私は更新しようとしている大きなテーブルを持っていますが、(選択)としてCreate Tableを行うほうがはるかに速いと言われました。たとえば、あなたは(明らかに)1はこれを行うだろうか、これが本当であると仮定すると、テーブルを別のテーブルから選択しますか?

Create TableANew as (Select UPPER(Field1),Field2,FieldN from TableA); 
Drop Table TableA; 
Rename Table TableANew to TableA 

を行うには速いだろうUPPERに千万レコードテーブルにフィールド1を更新したい場合は、更新フィールドが行われる必要があります参加として?言い換えれば、私の当初の計画だった場合:

Update TableA as T1 
Inner Join TableB as T2 
On T1.Product=T2.Product 
Set T1.ProductID=T2.ProductID 

は、どのようにその更新を(表から選択)構造として作成し、表に組み込むことができますか?明確にするために、非常に基本的なCreate TableをSelectとして使用して、理解しているようにそのクエリの構造を表示しました。私は実際にSelect(Field、Field、Join)としてCreate Tableを必要とし、最初の答えのコンテキストでもそれを設定する方法が不明ですが、テーブルの名前を変更すると、how/if私はCreate as Selectの中で参加することができます

+0

IMOこれは行く方法ではありません。通常の更新を行います。 –

+0

@ juergen dだからあなたの意見では速度の向上はありませんか?問題は、私が1700万レコードのテーブルを更新しており、それを4万レコードテーブルに追加する必要があるということです。 – user3649739

答えて

0

joinupdateで何をしているのですか? 2つのアプローチがある:

update tableA 
    set a.field1 = upper(a.field1); 

対:

create table temp_tableA as 
    select upper(a.field1) as field1, field2, field3 
    from tableA; 

-- check, check, check that the data is right 

truncate table tableA; 

insert into tableA(field1, field2, field3) 
    select field1, field2, field3, 
    from temp_tableA; 

注:最後の2つの手順のためrenameを使用することができます。ただし、この方法では、索引、外部キーの関係、およびトリガー(および他のデータベースの制約も)を維持します。

最初のアプローチは明らかに簡単です。しかし、大きなテーブルでは、更新トランザクションのロギングが非常に高価になる可能性があります。一般に、create table as,truncate table、および大きいinsertは、更新よりも速い。これは、テーブル上の更新トリガーも(より良いか悪いかに関わらず)避けることに注意してください。

+0

2つの互換性のない例を作るのが悪いです。私は、テーブルからの基本的な作成テーブルが基本的な更新/結合ステートメントからのものであることを単純に示すことを試みていました。私がしなければならないことは、あなたが言うことです。テーブルの作成を使用してトランザクションを更新しないようにしますが、必要な更新は '上位'ではありません。各レコードのフィールドを別のレコードとの関係に基づいて更新する必要があるため、結合が必要です。今はちょうどUpdate/Joinとして実行していますが、すぐに起こることについてあまり信用できません。私の理解から、更新テーブルからインデックスを削除して元に戻すことが最善です。 – user3649739

+0

@ user3649739 。 。あなたが求める質問にのみ答えることができます。あなたの実際の問題について、より適切な詳細を持つ*別の質問をすることをお勧めします。この質問を改訂すると、この答えが無効になる可能性があります。これは順番に下線を引くことができるため、失礼です。 –