PL/SQL에서 대량 바인드를 사용하는 데 문제가 있습니다. 기본적으로 내가 원하는 것은 Component_id와 fieldname에 따라 필드 값을 업데이트하는 테이블 (Component)입니다. 이들 모두는 매개 변수로 전달됩니다 (유형 varchar2_nested_table은 효율적이고 문자열 배열입니다. 발생해야하는 각 업데이트 문에 대해 하나의 요소). 예를 들어 Component_id = 'Compid1'및 fieldname = 'name'인 경우 fieldvalue를 'new component name'으로 업데이트해야합니다.PL/SQL 대량 바인드/빠른 업데이트 문
이 코드는 http://www.oracle.com/technetwork/issue-archive/o14tech-plsql-l2-091157.html과 관련하여 아래에 입력했습니다. 코드는 작동하지만 IN 매개 변수의 모든 요소에 대해 업데이트를 수행하는 간단한 루프보다 빠릅니다. 따라서 매개 변수에 1000 개의 요소가 있으면 1000 개의 업데이트 문이 실행됩니다. 나는 또한 BULK COLLECT INTO를 사용하고 있지 않다는 것을 알았지 만 데이터베이스에서 아무것도 선택하지 않아도되므로 업데이트 할 필요가 없다고 생각했습니다.
현재 모두 업데이트를 위해 4-5 초가 걸립니다. 내가 대량 일괄 바인딩을 잘못 사용하고 있거나 사람들이 2 초 등 50,000 행을 실행하고 찾을 수있는 예제에서 오해가 있다고 가정합니다. 나는 FORALL 이해 컨텍스트 스위치 수를 줄임으로써 성능을 향상시켜야합니다. 필자는 커서와 대량 바인드를 사용하여 온라인에서 찾은 다른 방법을 시도했지만 동일한 결과를 보았습니다. 아마도 내 공연 기대치가 너무 많습니까? 나는 다른 사람들의 결과를 보면서 그렇게 생각하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.
create or replace procedure BulkUpdate(sendSubject_in IN varchar2_nested_table_type,
fieldname_in IN varchar2_nested_table_type,fieldvalue_in IN varchar2_nested_table_type) is
TYPE component_aat IS TABLE OF component.component_id%TYPE
INDEX BY PLS_INTEGER;
TYPE fieldname_aat IS TABLE OF component.fieldname%TYPE
INDEX BY PLS_INTEGER;
TYPE fieldvalue_aat IS TABLE OF component.fieldvalue%TYPE
INDEX BY PLS_INTEGER;
fieldnames fieldname_aat;
fieldvalues fieldvalue_aat;
approved_components component_aat;
PROCEDURE partition_eligibility
IS
BEGIN
FOR indx IN sendSubject_in.FIRST .. sendSubject_in.LAST
LOOP
approved_components(indx) := sendSubject_in(indx);
fieldnames(indx):= fieldname_in(indx);
fieldvalues(indx) := fieldvalue_in(indx);
END LOOP;
END;
PROCEDURE update_components
IS
BEGIN
FORALL indx IN approved_components.FIRST .. approved_components.LAST
UPDATE Component
SET Fieldvalue = fieldvalues(indx)
WHERE Component_id = approved_components(indx)
AND Fieldname = fieldnames(indx);
END;
BEGIN
partition_eligibility;
update_components;
END BulkUpdate;
를 참조 선택 ...에 ... 절
를 가져
이미 측정했습니다. update_components를 실행하지 않으면 25 밀리 초가 소요됩니다. update_components는 4500 밀리 초가 걸립니다. – user1255191