私は Oracle 10g のストアド プロシージャを開発していますが、約 2 ~ 3k の項目のリストをプロシージャに渡そうとしているときに、かなり重いパフォーマンスのボトルネックにぶつかっています。これが私のコードです:
TYPE ty_id_list
AS TABLE OF NUMBER(11);
----------------------------------------------------------
PROCEDURE sp_performance_test (
p_idsCollection IN schema.ty_id_list )
AS
TYPE type_numeric_table IS TABLE OF NUMBER(11) INDEX BY BINARY_INTEGER;
l_ids type_numeric_table;
data type_numeric_table;
empty type_numeric_table;
BEGIN
EXECUTE IMMEDIATE
'ALTER TABLE schema.T_TEST_TABLE NOLOGGING';
COMMIT;
SELECT COLUMN_VALUE BULK COLLECT INTO l_ids
FROM TABLE(p_idsCollection);
FOR j IN 1 .. l_ids.COUNT LOOP
data(data.count+1) := l_ids(j);
IF(MOD(data.COUNT,500) = 0 ) THEN
FORALL i IN 1 .. data.COUNT
INSERT INTO schema.T_TEST_TABLE (REF_ID, ACTIVE)
VALUES (data(i), 'Y');
data := empty;
END IF;
END LOOP;
IF(data.count IS NOT NULL) THEN
FORALL i IN 1 .. data.COUNT
INSERT INTO schema.T_TEST_TABLE (REF_ID, ACTIVE)
VALUES (data(i), 'Y');
END IF;
COMMIT;
EXECUTE IMMEDIATE
'ALTER TABLE schema.T_TEST_TABLE LOGGING';
COMMIT;
END sp_performance_test;
したがって、プロセスに非常に大幅に追加されるのは、次の部分のようです: data(data.count+1) := l_ids(j) ; コレクションからの要素の取得をスキップして、この行を data(data.count+1) := j ; に変更すると、プロシージャの実行時間は 3 ~ 4 倍速くなります (30 秒以上から 3k アイテムの場合は 8 ~ 9 秒)。このロジックは明らかに私が望むものではありません。
データ挿入のパフォーマンスを向上させるためにコードを改善できるヒントを教えてください。本当に改善できれば。
ありがとう、プレゼメク