Articles

SQL 세계

이전 문서에서 나는 아이디어를 업데이트하는 방법에 대한 기록에서 sql. 이 기사에서는 여러 예제로 오라클 데이터베이스에서 대량의 레코드를 업데이트하는 방법에 대한 자세한 아이디어를 제공하고 싶습니다.Oracle one one table named Customer 및 다른 table named Company 에서 대량의 레코드를 업데이트하는 예제를 제공하고 싶습니다.

oracle 데이터베이스에서 대량의 레코드를 업데이트하는 다른 방법은 무엇입니까?

oracle 데이터베이스에서 대량의 레코드를 업데이트하는 데 사용하고있는 다양한 방법론이 있습니다. 실생활 업계의 예를 통해 다음과 같은 방법에 대해 자세히 논의하고 싶습니다. 이 예제는 오라클의 업데이트 프로세스에 대한 명확한 아이디어를 자세히 제공합니다.

가정:

우리가 추측하고 있다는 것은 두 가지가 있는 테이블–고객 정보는 고객의 이름을 방문하여 지정한 전자 상거래 사이트입니다. 고객 테이블에 수백만 개의 레코드가 있지만 고객 테이블에 999999 개의 레코드가 있다고 가정하고 있습니다. Customer_Entry 라는 또 다른 테이블이 있으며 777777 레코드가 있습니다. Customer_id 라는 기본 키는 두 테이블에 있습니다.

업데이트 유형:

1.업데이트 For loop

2 를 사용합니다.기존 업데이트(개별적으로 레코드 업데이트)

3.대량 수집을 사용하여 대량 업데이트하고 모든 문에 대해

4.직접 업데이트 SQL

5.업데이트 기록에 문을 병합 빠른

6.인라인 뷰 방법을 사용하여 업데이트하십시오.모든 방법을 실행해야하며 다른 업데이트 문의 e 성능을 확인해야합니다.

시나리오 1 : 개별 레코드를 업데이트하고 for loop

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 여기서
면 콘트롤=c.면 콘트롤
end loop;commit;
끝;

PL/SQL 절차를 성공적으로 완료되었습니다.나는 이것을 할 수 없다.36

경우에 확인할 수 있습니다 첫 번째 예에서 우리가 어디를 업데이트하려고 모든 레코드를 이용한 루프를 사용하여 다음 commit 문입니다. 특정 PL SQL 블록을 실행할 수 있다면. 절차를 완료하고 기록을 업데이트하는 데 약 2 분 42 초가 소요됩니다.

시나리오 2:개별 레코드를 업데이트하고 loop

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 여기서
면 콘트롤=c.면 콘트롤
commit;
end loop;
끝;

PL/SQL 절차를 성공적으로 완료되었습니다.

경과:00:03:58.39

경우 우리가 확인할 수 있습니다 프로세스 및 타이밍을 실행하는 기록이나 업데이트 레코드에 데이터베이스에 그것은 약 3 분 58 초입니다. 여기서 루프는 모든 레코드 업데이트 후에 커밋 문을 실행하므로 레코드를 업데이트 할 시간이 단일 커밋 레코드보다 높습니다.

시나리오 3: 일괄 업데이트를 사용하여 대량 수집하고 모든

선언

유형 customer_t 은 테이블의 고객%로우 타입하여 인덱스가

pls_integer;l_customer_data customer_t;

시작을 선택*

대량으로 수집 l_customer_data 에서 고객;

forall 레크리에이션에서 1.. l_customer_data.customer_entry e set 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 프로 시저가 성공적으로 완료되었습니다.

경과:00:00:53.55

대량 수집 방법은 빠른 방법보다는 전통적인 방법입니다. 우리는 필요한 형식을 만들 변수가 우리가 가져올 수 있는 모든 고객 데이터 그리고 우리를 사용하여 대량 수집 문서든 절도록 기록에서든 절 또는 지정된 테이블이 올바르게 업데이트됩니다. 우리가 경과 시간을 볼 수 있다면 그것은 다른 방법보다 더 빠른 약 54 초입니다.4. DIRECT UPDATE SQL

begin

update customer_entry ent

set(customer_no,customer_name,customer_product)=

(customer_no,customer_name,customer_product from customer c 여기서 c.customer_id=ent.면 콘트롤)

c.면 콘트롤에(선택하면 콘트롤 고객으로부터);

commit;

끝;

PL/SQL 절차를 성공적으로 완료되었습니다. 나는 이것을 할 수 없다.22

직접 업데이트는 모든 레코드를 업데이트하는 데 58 초가 걸립니다. 면 우리는 비교할 수 있는 대량 수집했다 3-4 초 추가 업데이트하는 모든 레코드

시나리오 5: MERGE–가장 빠르게 업데이트하는 방법 대량의 레코드

시작

병합으로 customer_entry er 를 사용하여

고객 c

on(er.면 콘트롤=c.면 콘트롤)

일치 할 때 그

업데이트 세트 er.customer_number=c.나는 이것을 할 수 없다.cutomer_name=c.customer_name,

er.customer_product=c.customer_product;

commit;

end;

PL/SQL 프로시저가 성공적으로 완료되었습니다.

경과:00:00:36.23

를 업데이트하는 가장 빠른 방법은 대량의 레코드를 사용하여 병합 문입니다. Merge 문은 빠른 방법으로 레코드를 업데이트하는 데 36 초가 걸렸습니다.

시나리오 6:를 사용하여 업데이트인 방법

시작

업데이트

(

선택 r.면 콘트롤,r.처럼,r.customer_name,r.customer_product

e.처럼 cnum,e.customer_name cname,e.customer_product cprod

에서 customer_entry r,고객 e

r.면 콘트롤=e.면 콘트롤

)9

설정처럼=cnum

customer_name=cname,

customer_product=cprod;

commit;

끝;

PL/SQL 절차를 성공적으로 완료되었습니다.

경과:00:00:37.97

으로 사용하인 방법을 일괄 업데이트를 완료에 약 38 초에는 빠른 방법은 다음과 같이 병합 문입니다.

우리가 배우는 것?

모든 SQL 또는 PLSQL 개발자의 생각은 대량 수집이며 모든 문에 대해 대량 작업을 수행하는 것이 좋습니다. 면 우리가 관찰할 수 있는 상세정보에서 6 위에 쿼리를 업데이트 SQL 문을 주는 것보다 더 나은 성능을 대량 수집합니다. 따라서 pl/SQL API 에서 sql 코드를 사용하여 빠른 업데이트를 수행하십시오. 그러나 시나리오마다 시나리오가 다르므로 항상 시나리오를 확인할 수 있습니다. 가장 빠른 성능을 원한다면 merge 문 또는 인라인 뷰를 작성하십시오.