PL/SQLでバルク・バインドを使用する際に問題があります。基本的には、テーブル(Component)がComponent_idとfieldnameに依存してフィールド値を更新する必要があります。これらはすべてパラメタとして渡されます(varchar2_nested_tableの型は効果的であり、発生する必要のある各更新ステートメントの要素の1つです)。たとえば、Component_id = 'Compid1'、fieldname = 'name'の場合、fieldvalueは '新しいコンポーネント名'に更新する必要があります。PL/SQL一括バインド/一括更新文
このhttp://www.oracle.com/technetwork/issue-archive/o14tech-plsql-l2-091157.htmlと関連して以下のコードを入力しました。コードは機能しますが、INパラメータのすべての要素の更新を実行する単純なループより高速ではありません。したがって、パラメータに1000の要素がある場合、1000の更新文が実行されます。私はBULK COLLECT INTOを使用していないことも認識していますが、私はデータベースから何も選択する必要はないので、私は必要と思っていませんでした。
現時点では、両方とも1000回の更新で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;
はあなたが測定するために、 'dbms_utility.get_timeを'追加することができます参照しますpartition_eligibilityの前、afterの後、update_componentsの後に時間が費やされた場所を表示します。 – Eggi
私はすでにそれを測定しました。 update_componentsを実行しないと、25ミリ秒かかります。 update_componentsには4500ミリ秒かかります。 – user1255191