Articles

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文–大量のレコードを更新する最速の方法

シナリオ5:MERGE文-大部分を更新する最速の方法

begin

を使用してcustomer_entry erにマージします

customer c

on(er.customer_id=c.customer_id)

一致した場合、

セットerを更新します。customer_number=c.customer_number,

er.cutomer_name=c.customer_name,

er.customer_product=c.customer_product;

commit;

end;

PL/SQLプロシージャが正常に完了しました。 Elapsed:00:00:36.23

大部分のレコードを更新する最速の方法は、Mergeステートメントを使用することです。 Mergeステートメントは、レコードを高速に更新するのに36秒かかりました。

シナリオ6:インラインビューメソッドを使用した更新

begin

update

(

select r.customer_id,r.customer_number,r.customer_name,r.p>

customer_product=cprod;

commit;

end;

pl/sqlプロシージャが正常に完了しました。

Elapsed:00:00:37.97

インラインビューメソッドを使用すると、一括更新は約38秒で完了します。

私たちは何を学びますか?すべてのSQLまたはPLSQL開発者の考え方はBULK COLLECTであり、FOR ALL文はbulk操作を行う方が優れています。 上記の6つのクエリの詳細を観察することができれば、Update SQL文はBulk collectおよびfor allよりも優れたパフォーマンスを提供します。 そのため、PL/SQL APIでSQLコードを使用して高速更新を実行してください。 あなたは常にシナリオを確認することができますので、しかし、それはシナリオにシナリオを変更します。 最速のパフォーマンスが必要な場合は、merge文またはインラインビューを記述してみてください。