私は、多くのフィールドと1億のデータを持ち、いくつかのフィールドに複合キーを持つテーブルを作成しています。数百万人のうち、いくつかの行のサンプルテーブルEMPを以下に示します。数百万のレコードを持つテーブル内の行のOracle 11g更新
+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+------+
| 11 | 21 | 31 | X |
| 12 | 22 | 32 | X |
| 14 | 24 | 34 | X |
| 11 | 21 | 31 | 555 |
| 11 | 21 | 31 | 551 |
| 12 | 22 | 32 | 89 |
| 14 | 24 | 34 | 45 |
+------+------+------+------+
複合キーがCol4
からCol1
の上にあると仮定します。 Col1、Col2、Col3がグループIdを表しているとします。最初の行はCol4
で、X
であるため、Col1 = 11
ととCol3 = 31
のテーブルからすべてのレコードを選択する必要があります。次の行は12,22,32、 'X'なので、Col1 = 11
とCol2 = 22
とCol3=32
のすべての行を選択する必要があります。そして、すべての場合に同様にCol4 =X
。
私はカーソル付きのループを使用しようとしましたが、テーブルには1億のデータと複合キーがあるので、時間がかかります。非常に長い時間がかかります。
ループ文の疑似コード私が試した:
result= select Col1,Col2,Col3 from emp where `Col4=X`.
for each row in result
do
finalresult += select * from table where Col1 = row.Col1 and Col2 = row.Col2 and Col3 = row.Col3
done
finalresultを必要なすべてのデータを持っています。しかし、これは非常に長い間実行されています。
はまた、私は
merge into emp t1
using (select * from emp t where t.col4=X) t2
on t1.col1=t2.col1
and t1.col2=t2.col2
and t1.col3=t3.col3
when matched then update set col4=Y
and t1.col4!='X';
以下のように更新するようにマージを試みた。しかし、これはすべての行を更新していません。
この問題は本当に助かりました。
単純な更新クエリを試しましたか? –
あなたが言ったことは明確ではありません.Col4 = Y、現在のCol4 = Xの行、または他のすべての行を更新する必要がありますか?その後、ループでこれをしないでください。カーソルなどを使用しないでください。完了するまでに2年かかります。ハンマーで熊の葉を試そうとしないでください。ハンマーは釘を動かすことです。レイクはレーキで葉。つまり、UPDATEステートメントを使用します(単純SQL、ループのような手続き型コードの必要はありません)。 – mathguy
私はあなたが示したステートメントが少なくとも2つの理由でコンパイルされることに疑いを持っています( "0行を返す"とはどういう意味ですか?) - まず、col4 = Yを設定することはできません。 = 'Y'、そして最後の行が外れています(あなたはどこにいたのですか... ...そして、そして、t1 ... ...?)それでは、col1-col4はどのようにしてプライマリキーになりますか? col4の値を 'Y'に変更することで重複することになります。構文を有効にしても、主キー制約はほとんどの変更を拒否する必要があります。要件自体は意味をなさない! – mathguy