나는 사악한 문제가있다.다른 테이블과 뷰에서 삭제/삽입하는 방법
proc_log('DELETE 1');
DELETE FROM table_1;
proc_log('INSERT 1');
INSERT INTO table_1 SELECT * FROM view_1;
proc_log('FINISH 1');
그리고보기/표 2, 3, 4, 5와 같은 ... 그리고 36
를 : 오라클 10에서 또 다시 그런 일이 끝난 수행 뷰와 테이블의 쌍과가있다PROCEDURE proc_import(p_table VARCHAR2) IS
BEGIN
proc_log('DELETE ' || p_table);
EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table;
proc_log('INSERT ' || p_table);
EXECUTE IMMEDIATE 'INSERT INTO table_' || p_table || ' SELECT * FROM view_' || p_table;
proc_log('FINISH || p_table);
COMMIT;
END;
을 그리고 모든 36쌍의 함수를 호출 :
나는 같은 것을 할 싶습니다.
놀랍지 않게도이 항목은 하드 코딩 된 것보다 약 50 % 느립니다.
내 질문 : 누구보다 빨리 만드는 방법에 대한 아이디어가 있습니까? 또는 더 좋게, 나는이 재료를 어떻게 다르게 그러나 유사하게 우아하게 할 수 있습니까?
편집
전체 물건이 같이 내장되어 있습니다 : 프로 시저 proc_import 한 번 밤 작업에 의해 불려
CREATE OR REPLACE PACKAGE PKG_IMPORT IS PROCEDURE proc_log IS BEGIN [funky not important stuff] END; PROCEDURE proc_import IS BEGIN proc_import_table('1', TRUE); proc_import_table('2'); proc_import_table('3'); proc_import_table('4', TRUE); proc_import_table('5'); ... proc_import_table('36'); END; PROCEDURE proc_import(p_table VARCHAR2, p_whole BOOLEAN DEFAULT FALSE) IS BEGIN proc_log('DELETE ' || p_table); IF p_whole THEN EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table; ELSE EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table || ' WHERE business_logic_applies'; END IF; proc_log('INSERT ' || p_table); EXECUTE IMMEDIATE 'INSERT INTO table_' || p_table || ' SELECT * FROM view_' || p_table; proc_log('FINISH || p_table); COMMIT; END; END PKG_IMPORT;
. 모든 proc_import_table 호출이 하드 코딩 된 이유는 일부 테이블에 추가 가져 오기 정보가 필요하기 때문입니다.
내가 할 수 있는지 알 수 없기 때문에 여기에 원본 코드를 복사하거나 붙여 넣을 수 없습니다. 희망 ...
전체로 작성하십시오. 여전히'proc_import'를 36 번 호출해야합니다. 이것은 귀하의 질문에 대한 답변이 아니지만 마치 데이터베이스의 구조에 문제가있는 것처럼 들립니다. – Ben
여기 뭔가가 제대로 보이지 않습니다. 야간 작업이고 도움말 성능을 잘라내거나 추가하는 경우 실행하는 데 몇 초 이상 걸리는 것으로 가정합니다. 그러나 실행하는 데 몇 초 이상 걸리면 동적 SQL을 몇 번 사용하는 오버 헤드로 인한 차이를 느끼지 않아야합니다. 어쩌면 테스트를 몇 번 더 실행해야 할 것입니다. 아마도 다른 요인이 성능 차이를 야기했을 것입니다. –