2017-12-28 46 views
0

숙제로는 dwdimartist 테이블에서 모든 레코드를 제거한 다음 테이블 아티스트의 모든 레코드로 테이블을 채우고 오늘의 날짜 필드를 추가하는 절차가 포함 된 패키지를 만들어야합니다.PL SQL에서 INSERT INTO SELECT가있는 날짜를 추가하는 방법은 무엇입니까?

이것은 내가 만든 것으로, 작동하지만 성능면 충분하지는 않습니다. 테이블 아티스트의 각 레코드를 반복하는 커서를 사용하는 것이 더 좋습니까?

CREATE OR REPLACE PACKAGE BODY dwh AS 

    PROCEDURE filldwh IS 
    today_date DATE := SYSDATE; 
    BEGIN 
    DELETE FROM dwdimartist; 

    INSERT INTO dwdimartist (artistkey, name) (SELECT artistid, name FROM artist); 
    UPDATE dwdimartist SET added = today_date; 
    END filldwh; 
END dwh; 
+1

커서 루프가 동등한 SQL 문보다 성능이 좋은 경우는 매우 드뭅니다. 커서가 성능을 한 번 향상시키는 것을 보았습니다. –

답변

5

간단한 SQL 쿼리는 커서 나 암시 적 루프보다 나은 선택입니다.

개선 가능성 : 업데이트하지 않고 즉시 수행해야합니다. 삽입 중에 날짜를 설정하십시오.

INSERT INTO dwdimartist (artistkey, name, added) 
    (SELECT artistid, name, sysdate FROM artist); 

는 당신은 커서를 사용할 필요가 없습니다

1

도움이되기를 바랍니다. 당신은 SQL 자체이기 때문에 Insert ... select를 거의 칠 수 없으며 대부분의 경우 원시 dbms 최적화로 인해 어떤 프로그래밍 구조보다 잘 작동합니다. 그러나 입출력 조작의 수를 줄이면 더 잘 수행 할 수 있습니다. 여기서 업데이트 할 필요는 없습니다. sysdate를 선택에 추가하고 모든 것을 함께 삽입하기 만하면됩니다.

insert into dwdimartist(artistkey, name, added) select artistid, name, sysdate from artist; 

또 다른 개선 사항은 '삭제'입니다. 학습 목적으로는 작은 테이블이지만 삭제와 잘라 내기 사이에는 아무런 차이가 없지만 실제 ETL 작업과 큰 테이블에 대해서는 확실히 볼 수 있습니다. 예 당신은 당신의 PL/SQL에서 직접 잘라 사용할 수 있지만, 그것을 할 수있는 3 가지 방법이 있습니다 :

  1. 'dwdimartist을 절단'즉시 실행은;
  2. Dbms_utility.exec_ddl_statement ('truncate ...;');

  • DBMS_SQL 패키지는하지만, 잘라 내기를 호출하면 모든 DDL 명령처럼 커밋 실행됩니다 기억 해요. 따라서 삭제가 유일한 옵션 일 수 있습니다. 그러나 그것이 그렇다고하더라도, 전체 테이블을 위해 그것을 피해야합니다.