SQL WORLD
以前の記事では、sqlでレコードを更新する方法について考えました。 この記事では、Oracle Databaseの大部分のレコードを複数の例で更新する方法についての詳細なアイデアを示したいと思います。Customerという名前のoracle one oneテーブルとCompanyという名前の他のテーブルのレコードの大部分を更新する例を挙げたいと思います。oracle databaseの大部分のレコードを更新するには、どのような方法がありますか。oracle databaseの大部分のレコードを更新するために使用しているさまざまな方法があります。 私は実際の業界の例で以下の方法を詳細に議論したいと思います。 これらの例では、oracleの更新プロセスに関する明確なアイデアを詳細に説明します。
仮定:
私たちは、2つのテーブルがあることを前提としています–顧客情報–指定された電子商取引のウェブサイトに訪問した顧客の名前です。 Customerテーブルには何百万ものレコードがありますが、customerテーブルには999999のレコードがあると仮定しています。 また、777777レコードを持つCustomer_Entryという名前の別のテーブルがあります。 Customer_Idという名前の主キーは両方のテーブルにあります。更新の種類:
1.Forループを使用して更新
2。伝統的な更新(レコードを個別に更新する)
3。BULK COLLECTおよびFOR ALLステートメントを使用した一括更新
4.直接更新SQL
5.マージステートメントは、高速レコードを更新します
6。インラインビューメソッドを使用して更新します。すべての方法を実行し、さまざまなupdateステートメントのパフォーマンスを確認する必要があります。
すべての方法を実行する必要があります。
シナリオ1 : 個々のレコードを更新し、forループの後にコミットする伝統的な方法
begin
for cusrsor_1in(select*from customer)
loop
update customer_entry
set
customer_no=cursor_1。customer_no,customer_name=cursor_1.customer_name,customer_product=c.customer_product where
customer_id=c.customer_id;
end loop;commit;
end;
/PL/SQLプロシージャが正常に完了しました。経過:00:02:42.36
forループを使用してすべてのレコードを更新しようとしている最初の例を確認し、commitステートメントを使用できる場合。 特定のPL SQLブロックを実行できる場合。 手順を完了してレコードを更新するのに約2分42秒かかります。
シナリオ2:個々のレコードを更新し、forループ内でコミットする伝統的な方法
begin
for cusrsor_1in(select*from customer)
ループ
update customer_entry
set
customer_no=cursor_1。customer_no,customer_name=cursor_1.customer_name,customer_product=c.customer_product where
customer_id=c.customer_id;
commit;
end loop;
end;
/PL/SQLプロシージャが正常に完了しました。経過:00:03:58.39
レコードを実行するプロセスとタイミングを確認したり、データベース内のレコードを更新したりすることができれば、約3分58秒です。 ここでループは、レコードを更新するたびにcommit文を実行するため、レコードを更新する時間は単一のcommitレコードよりも長くなります。P>
シナリオ3:一括収集を使用して一括更新し、すべての
宣言
type customer_tはcustomer%rowtype index byのテーブルです
pls_integer;l_customer_data customer_t;
begin select*
bulk collect into l_customer_data from customer;
forall REC in1.. l_customer_data.count
customer_entryを更新e e.customer_no=l_customer_data(rec)を設定します。customer_no,
e.customer_name=l_employee_data(rec).customer_name,
e.customer_product=l_employee_data(rec).customer_product
ここで、r.customer_id=l_employee_data(rec)。customer_id;
commit;
end;
PL/SQLプロシージャが正常に完了しました。 Elapsed:00:00:53.55
一括収集メソッドは、従来のメソッドよりも高速なメソッドです。 すべての顧客データをフェッチできる型変数を作成する必要があり、forall句または指定されたテーブルのレコードが正しく更新されるように、forall句でbulk collect文 経過時間を見ることができれば、それは他の方法よりも高速である約54秒です。
4. 直接更新SQL
begin
update customer_entry ent
set(customer_no,customer_name,customer_product)=
(select customer_no,customer_name,customer_product from customer c where c.customer_id=ent.ここで、C.customer_id in(select customer_id from customer);
commit;
end;
PL/SQLプロシージャが正常に完了しました。 経過:00:00:58.22
直接更新は、すべてのレコードを更新するのに58秒かかります。 それをbulk collectと比較すると、すべてのレコードを更新するのに3〜4秒かかりました
シナリオ5:MERGE文–大量のレコードを更新する最速の方法
Leave a Reply