2013-07-02 2 views
0

나는 설명을 찾을 수없는 상황이있다. 여기있다.SQL 로더, 트리거 채도?

table_a 
------------- 
name 
last name 
dept 
status 
notes 

을 그리고이 테이블에 검증을 많이하지 삽입에 대한 트리거를 가지고 : (. 원래는 정말 큰이기 때문에 나는 가상의 정보를 사용할 것이다) 나는 테이블이

을의 말을하자 [정보] 유효성 검사의 결과에 따라 새 레코드의 상태 필드를 변경하려면 검증의 일부는 다음과 같습니다

- check for the name existing in a dictionary 
- check for the last name existing in a dictionary 
- check that fields (name,last name,dept) aren't already inserted in table_b 
- ... and so on 

것은, 내가

같은 쿼리를 통해 테이블에 삽입을 할 경우
insert into table_a 
(name,last_name,dept,status,notes) 
values 
('john','smith',1,0,'new'); 

은, 모든 검증 과정을 수행 상태 필드를 업데이트하고 테이블에 레코드를 삽입 만 173 밀리합니다. (유효성 검사 프로세스는 인덱스를 통해 모든 검색을 수행합니다)

그러나 SQLloader를 통해이 레코드를 읽으면 5000 레코드가있는 파일을 읽는다면 유효성을 검사하고 149 개의 레코드를 삽입하는 데 40 분이 걸립니다. 물론 ...)

그래서 데이터를 로딩하여 (속도 검사를 위해) 데이터를로드하려고 시도했는데 10 초 이내에 모든 레코드가로드됩니다.

그래서 제 질문은 내가이 프로세스를 개선하기 위해 무엇을 할 수있다? 내 유일한 이론은 너무 빨리로드되고 트리거의 많은 인스턴스를 시작하기 때문에 데이터베이스가 포화 상태 일 수 있다는 것이지만 실제로는 알지 못합니다.

내 목표는 정보와 함께 약 60 파일을로드하고 (하지만 다른 옵션을 시도 할 의사가) 트리거의 과정을 확인하는 것입니다.

난 정말 당신이 제공 할 수있는 어떤 도움을 appreciatte 것입니다!

COMPLEMENT- ------------------------------------------ --------------------------------------

덕분에 대답, 지금은 ' 이 모든 것에 대해 읽을 것이니, 이제이 부분을 도와 줄 수 있기를 바랍니다. 제가 필요한 기능 중 일부를 설명 할 (그리고 내가 다른 것을 생각하지 못했습니다 트리거 원인을 사용)

때문에 테이블 데이터는이 (중요한) 필드와 함께 제공 :

pid name lastname birthdate dept cicle notes 

데이터

  1. 칼 : 지금이

    name lastname birthdate dept 
    

    처럼 제공, 트리거는 데이터에이 작업을 수행 (알고리즘을 사용하여 이름, 성 및 생년월일을 기반으로 계산 됨)

  2. 사전에서 이름을 확인하는 함수를 호출합니다. 즉, 사전에 단일 이름, 의미 사람이 존 아론 스미스 존스라는 이름을 가진다면 두 사람이 죤 아론을 분리하고 사전에 죤과 아론을 검색합니다. 즉, 외래 키를 사용하지 않은 이유입니다. [죤 아론 (john aaron) 존 앨런, 존 피어스 ..etc]) ---> 좀처럼 사전을 바꾸지 않고 키를 가지고 이것을 구현하는 방법에 대해 고민했다. 아마도 CHECK를 사용했을 것이다. 성 외래 키는 좋은 생각 일 것이다.

  3. dept와 현재 날짜에 따라 다른 표에서 cicle을 가져옵니다. 왜냐하면 사람이 같은 부서의 표에 두 번 나타날 수 있지만 다른 기분에 나타날 수 있습니다. ---> 어떻게이 cicle 값을 얻을 수 있습니까? 올바른 검색을 수행하는보다 효율적인 방법?

  4. 그리고이 모든 유효성 검사를 완료 한 후 마지막으로, 나는 (따라서 필드 노트)을 충족하므로 트리거가이 같은 실패 검증의 모든 문자열을 연결해되지 않은 검증을 정확히 알아야합니다

    lastname not in dictionary, cannot calculate pid (invalid date), name not in dictionary

내가 제약 사항이 충족되지 않는 경우 내가 할 수있는 모든 제약 - 실패 오류 메시지가 다른 테이블에 레코드를 삽입 것을 알고 있지만, 단 하나의 유효성 검사 나 잎, 바로 내가 오전 ? 하지만 나는 그들 모두를 검증하고 보고서를 다른 부서에 보내서 데이터를 검토하고 필요한 모든 조정을 할 수 있어야합니다.

어쨌든, 지금 상황입니다. 가능성을 모색하고 전반적인 프로세스에 대해 의견을 나눌 수 있기를 바랍니다. 시간 내 주셔서 대단히 감사합니다.

+1

'name'과'last_name'의 경우, 트리거를 사용하는 대신 사전을 나타내는 테이블을 참조하는 외래 키 제약 조건을 고려 했습니까? 세 번째 유효성 검사를 위해서'table_a' 또는'table_b'을 의미합니까? 만약 당신이'table_a'를 의도했다면 당신은 대신 고유의 제약 조건을 고려 했습니까? 만약 당신이'table_b'을 의미했다면 당신은 고유 한 제약을 사용하여 고유성을 적용 할 수 있도록 단일 테이블을 대신 사용하는 것을 고려할 수 있습니다 - 동시에 동시 삽입/업데이트 하에서이를 올바르게 수행하기위한 트리거를 작성하는 것은 놀랍지 않습니다. 잠금을 사용해야 함). –

+0

당신의 사전은 얼마입니까? Namex 사이트 http://www.namethesaurus.com/에서 통계를 확인하십시오. – APC

답변

2

당신은 이미 솔루션에 중간 위치 :

". 그래서 (속도를 확인하는이 ...)이 10 초 미만의 모든 레코드처럼로드 트리거를 사용하지 않도록 데이터를로드 시도"

놀라운 것은 아닙니다. 현재 구현은 테이블 B에 삽입하는 각 행에 대해 단일 행 SELECT 문을 많이 실행합니다. 그러면 필연적으로 성능 프로필이 좋지 않게됩니다. SQL은 세트 기반 언어이며 다중 행 조작으로 더 잘 수행됩니다.

그럼,보다 효율적인 대안 인 모든 SELECT 문을 대체하는 방법을 찾아야합니다. 그런 다음 트리거를 영구적으로 삭제할 수 있습니다. 예를 들어, 테이블 A 컬럼과 참조 테이블 사이의 외부 키로 딕셔너리의 룩업을 대체하십시오. 내부 Oracle 코드 인 관계형 무결성 제약 조건은 우리가 작성할 수있는 모든 코드보다 훨씬 뛰어납니다 (다중 사용자 환경에서도 작동합니다).

테이블 B에 이미 열의 조합이있는 경우 테이블 A에 삽입하지 않는 규칙이 더 문제가됩니다. 그것은하기가 어렵지 않기 때문에 가난한 관계형 디자인처럼 들리므로. 그들이 테이블 B에서 이미 종료 할 때 테이블 A에 레코드를로드하지 않으려면 왜 테이블 B에 직접로드하지 않는 것입니까? 또는 표 A 표 B에서 추출하여 표 C (A와 B와 외래 키 관계를 가질 수 있음)에서 추출해야하는 열의 하위 집합이 있습니까?

어쨌든, 한쪽으로두면 SQL * Loader를 외부 테이블로 바꿔서 set-based SQL로 할 수 있습니다. 외부 테이블을 사용하면 일반 테이블 인 것처럼 CSV 파일을 데이터베이스에 표시 할 수 있습니다. 이것은 일반적인 SQL 문에서 사용할 수 있음을 의미합니다. Find out more.

따라서 사전 및 외부 테이블에 대한 외래 키 제약 조건을 사용하면 SQL 로더 코드를이 문으로 대체 할 수 있습니다 (다른 규칙이 "..."에 포함되어 있음).등 ") :

insert into table_a 
select ext.* 
from external_table ext 
    left outer join table_b b 
    on (ext.name = b.name and ext.last_name = b.last_name and ext.dept=b.dept) 
where b.name is null 
log errors into err_table_a ('load_fail') ; 

이 집합 기반 방식으로 모든 행에 대한 제약 조건 오류를 캡처하는 DML 오류 로깅 구문을 사용 Find out more 그것은 이미 B 테이블에 존재하는 행에 대한 예외를 발생하지 않습니다.. 오버플로 테이블로 행을 라우트하려면 이벤트 the multi-table INSERT ALL을 사용하거나 테이블 A에없는 외부 테이블의 행을 찾기 위해 이벤트 후 MINUS 세트 조작을 g 용하십시오. 최종 목표 W보고하는 f}에 따라 다 (니다.

예상보다 복잡한 대답 일 수 있습니다. Oracle SQL은 대량 작업의 효율성을 높이기위한 많은 기능을 갖춘 매우 광범위한 SQL 구현입니다. Microsoft가 개념 안내서 및 SQL 참조 서를 읽으면서 Oracle이 얼마나 많은 노력을 기울이고 있는지 알아보십시오.

+0

대단히 고마워, 지금은 정보를 확대, 당신이 그것을 검토하고 내게 몇 가지 팁을 주길 바래, 고마워! –