2012-04-18 3 views
1

내 질문은 주로 "성능에 가장 좋은 것"과 관련이 있지만 다소 "철학적으로"말하기도합니다 (차이가 나는 경우) ... 그래서 점프합시다SQL Server - 삽입 트리거 대 분당 작업

[표 A]. [ColumnB]는 [TableC]. [ColumnD]에 존재해야하는 값을 저장합니다. 방망이에서 벗어난 외래 키과 관련된 답변이 없습니다. 어떤 이유로 든이 환경에서 "허용되지 않는"것으로 가정합니다.

[상황 x, y, z]로 인해 [TableA]. [TableB]는 [TableC]. [ColumnD]에 존재하지 않는 값을 가져 오는 경우가 있습니다. "직렬화 된 BLOB"로 실행 코드에 존재하는 객체, 데이터의 메모리 내 표현 및 [ColumnB] ​​값이 [TableC]. [ColumnD]에서 다른 프로세스에 의해 삭제되기 전에 채워집니다. 어쨌든, 이것은 예를 든 것입니다. 그래서 "왜 이런 일이 생깁니 까?"라는 말에 매료되어서는 안된다.

문제를 "수정"하려면이 두 가지 방법 중 가장 좋은 방법은 다음과 같습니다. 1. [TableA]에서 INSERT 할 때 발생시키는 트리거를 만들고 [ColumnB]를 값으로 업데이트합니다. bad-to-good 값의 "매핑"을 가짐). 또는 2. 매시간마다/분당/예정된 작업을 실행하여 업데이트 쿼리를 실행하여 가능한 모든 "나쁜"값을 해당 "양호한"값으로 변경합니다.

더 일반적으로 말하자면 성능 및/또는 모범 사례 : 트리거 또는 정기적 인 예약 된 작업으로 무엇이 더 좋습니까? 문맥 상, [TableA]가 일반적으로 수십만 줄의 순서로 있다고 가정 해 봅시다. 삽입물은 한 번에 10-100 개의 레코드가 발생하며, 몇 분 간격으로 자주 하루에 몇 번씩 발생합니다.

+0

감사합니다. 모두들! 방아쇠를 당긴다 ... 나는 20 + 다른 DBs에 하나 창조에 관하여 흥분하지 않는다, 그러나, 그런 것은 생활이다. – NateJ

답변

9

온 - 인서트.

트리거를하는 것은 콜백과 비슷합니다. 논리적으로 건전하며 모든 쿼리에 지연 시간을 분산시킵니다. 지속적인 점검 (폴링 또는 크론 작업이라고 함)을하면, 때때로 더 심한 지연이 발생할 수 있습니다. 거의 모든 경우에 트리거/콜백을 사용하는 것이 모든 쿼리에 1ms의 지연을 추가하는 것이 임의의 간격으로 100ms의 지연보다 좋기 때문에 더 좋은 방법입니다.

1

트리거는 참조 무결성을 유지하고 서버의 성능 최적화를 허용하므로 최상의 성능과 실행력을 제공합니다.

1

트리거 사용은 일반적으로 권장되지 않지만 부하가 가볍고 케이스가 자연스러운 트리거 케이스 인 것 같습니다. 대신에 트리거를 사용하여 동일한 행 (삽입 및 업데이트 대신 하나의 삽입)에서 두 번의 작업을 피하십시오. 가장 단순하고 신뢰할 수있는 솔루션 일 수 있습니다 (전체 작동이 중단되지 않는 신뢰할 수있는 코드를 트리거에 작성한 경우).

배치 작업을 고려 중이므로 타이밍 문제에 관심이 없습니다. 즉 응용 프로그램에서 테이블이 1 분 또는 1 시간 동안 동기화되지 않을 수도 있습니다. 이것이 트리거 접근법의 주요 차이점이며 테이블이 항상 동기화되어 있음을 보장합니다. 잠재적 인 타이밍 문제는 나를 불편하게 만들 것입니다. 더하기 측면에서 트리거를 사용하여 원본 삽입 작업을 중단 할 위험이 없습니다.

이 경로를 선택하는 경우 변경 내용 추적 기능을 고려하십시오. 변경 내용 추적은 마지막으로 확인한 이후에 삽입 된 행을 표시하므로 새 테이블에 대해 전체 테이블을 검사 할 필요가 없습니다. 또는 TableA에 INDENITY 기본 키 또는 고유 키가있는 경우 변경 추적 기능없이 유사한 디자인을 구현할 수 있습니다.

0

사용중인 SQL Server 버전을 밝히지 않았지만 2008 년인 경우 Change Data Capture을 사용하여 "기본"테이블의 데이터 변경 내용을 추적 할 수 있습니다. 그런 다음 주기적으로 변경 테이블을 통해 일괄 처리를 실행하고 그 작은 세트에 필요한 처리를 수행 할 수 있습니다.

+0

흥미로운 것 같습니다. 불행히도 서버는 여전히 SQL 2005입니다. 원래 그 것을 포함하지 않는 것에 대한 사과 – NateJ