2010-08-31 2 views

답변

2

사용자 정의 함수 내에서 다른 함수를 사용할 이유가 없습니다. A UNION은 별도의 설명보다 더 제한 될 가능성이 있습니다 ...

기능의 세부 사항을보고 싶습니다. 사용하지 않아도 될 수 있기 때문에 사용하는 것이 좋습니다.

+0

노조가없는 하나의 삽입물에서이 작업을 수행 할 수 있지만 믿을 수 없을만큼 지저분합니다 (믿어 줘, 나도 가봤 어.) –

5

나는 그저 UNION ALL 일 뿐이며, 열쇠는 UNION (덜 비효율적 일 수 있음)이지만, UNION ALL입니다.

+1

ahh, 그게 좋은 지적입니다. –

+1

불행히도 "UNION"이 매우 느리기 때문에 시도해 보겠습니다. 1 열이있는 5k 행, 동일한 값은 10 초가 필요합니다. 'UNION ALL '은 1 초도 채 걸리지 않습니다. 그 위대한 힌트를 가져 주셔서 감사합니다! –

5

대신 자신이 생각하는 가장 좋은 해결책은 적절한 도구를 사용하기위한 팁으로 제안하는 것입니다.

Managment Studio를 사용하는 SQL Server에서 성능은 Display Estimated Execution Plan으로 계산할 수 있습니다. 그래서 이런 식으로 2 가지 경우의 차이를 실제로 볼 수 있으며 결과를 관찰하여 가장 좋은 것을 선택할 수 있습니다.

3

실제로 차이가 있습니다.

INSERT을 별도로 보유하고있는 경우 트랜잭션 내에서 처리해야하므로 항상 일관된 상태를 유지해야합니다. 그러나 서버가 완료 될 때마다 서버가 완료되기 위해 필요한 메모리 양은 더 적습니다. 왜냐하면 모든 INSERT에 자체 결과 집합이 있습니다. 쿼리가 완료되면 서버가 다른 쿼리 등을 수행 할 수 있습니다.

너는 UNION ALL에 의해 결합 된 1 개의 큰 질문 안에 모든 것을 가지고있다. 서버는 더 많은 임시 테이블과 더 많은 메모리를 필요로 할 것이다. 그러나 이런 식으로 '벌크'인서트가있어 빠른 삽입이 가능합니다.

개인적으로 개인적으로 트랜잭션 내부에 별도의 삽입이 필요합니다. 경우에 따라 더 간단하게 수행하는 것이 유지 관리 및 디버깅 측면에서 약간의 성능 향상 (실제로 삽입되는 행의 수에 따라 다름)보다 유리합니다.

+0

동의하지 않을 수도 있지만이 경우에는 거래가 필요하다고 생각하지 않습니다. 이러한 진술의 결과로 어떤 데이터도 업데이트되지 않으며 사용자에게만 제공되므로 레코드가 완료되기 전에 레코드가 변경되면 나에게 문제가되지 않습니다. 그래도 입력 주셔서 감사합니다. –

+0

트랜잭션이 적용되지 않기 때문에 별도 삽입에 대한 또 다른 이유가 있습니다. – veljkoz

+0

동의합니다.내 경험상, UNION은 불필요하게 삽입 작업을 느리게 할 수 있습니다. 왜냐하면 처음부터 통합을 만드는 데 걸리는 시간 (및 메모리)이 필요하기 때문입니다. 그리고 종종 트랜잭션은 필요할 때조차도 별도의 인서트 주위를 감쌀 수 있습니다. 우리가 순전히 서버 측 데이터베이스 작업을 말하면 별도의 삽입물을 사용합니다. – user158017

4

별도 삽입을 제안합니다. 나는 Union All을 가진 인서트의 퍼포먼스가 분리 된 인서트에 비해 매우 열등하다는 것을 발견했다. 두 접근법을 사용하여 약 3500 개의 레코드를 삽입하려고 시도했지만 별도의 삽입 문이 4 배 더 빠릅니다. (삽입물의 열 수에 따라 달라질 수 있습니다.)

+3

동의합니다. 약 10 개의 다른 테이블에서 약 1,000,000 개의 행 - 6 초 만에 삽입이 완료되었습니다. UNION ALL은 10 분 후에 완료되지 않았습니다! –

관련 문제