2011-04-01 3 views
0

관련 테이블 레코드가있는 경우 필드를 업데이트하는 문이 있습니다. 쿼리는 모든 레코드를 업데이트합니다. 나는 이것을하기위한 가장 효율적인/최선의 방법이 무엇인지 확신하지 못했다. 케이스 문사례 VS 여러 업데이트

UPDATE item 
SET IsRestricted = 
    CASE 
     WHEN restriction.Id is null THEN 0 
     ELSE 1 
    END 
FROM [dbo].[Item] item 
    left join [dbo].[Restriction] restriction 
     on restriction.Id = item.Id 

해결 방법 2 : 지금까지 나는이 개 솔루션

솔루션 하나 마련했습니다 사람이 저를 측정하는 데 도움 수 있다면 여러 업데이트 문

UPDATE item 
SET IsRestricted = 1 
FROM [dbo].[Restriction] restriction 
    inner join [dbo].[Item] item 
     on restriction.Id = item.Id 

UPDATE item 
SET IsRestricted = 0 
FROM [dbo].[Item] item 
    left join [dbo].[Restriction] restriction 
     on item.Id = restriction.Id 
WHERE restriction.Id is null 

하는 나는 그것을 이용해야한다.

참고 : 참고 :이 게시물이 중복되어 있는지 확인하지 못했습니다. 지금까지 본 적이있는 유사 항목은 트리거 또는 기타 여러 가지 항목이 포함되어 있으며 답변이 변경되는지는 확실하지 않습니다. 또한 대체 접근법을 제안 할 수 있습니다.

+0

당신이 IsRestricted 열 필요하십니까 현명한 모두 동일한 성능 것 같다? 선택 시간에 제한의 유무를 묻지 않으려 고 항상 옳은 답을 얻을 수 있도록 보장 하시겠습니까? –

+2

두 쿼리를 동일한 쿼리 창에 넣고 "실제 실행 계획 포함"(Ctrl + M)을 켜고 배치를 실행하여 결과를 확인하십시오. – Blorgbeard

+0

@Damien 데이터베이스 사용량이 상당히 집중적이기 때문에 플래그가 있습니다 특정 시간에 조회를 수행하고 싶지는 않습니다. 두 가지 방법의 일반적인 비교만큼 내 문제에 대한 구체적인 답변을 찾지는 못했지만 – Manatherin

답변

0

그럼 몇 가지 성능 테스트 후 그들이

1

일부 사람들은 성능 테스트를 수행하고 최상의 수행 능력을 발휘할 수있는 두 가지 실행 계획을 모두 확인할 수 있다고 언급했습니다.

이 명령문을 한 번만 실행하면 모든 레코드를 업데이트해야한다는 것을 알면서 첫 번째 방법을 사용하게됩니다. 한 문장은 좋고 간단합니다. 이것이 여러 번 (즉, 새로운 데이터가 추가 될 때) 실행된다면, 두 번째 솔루션을 where 절에 추가하여 사용하면 다시 설정했을 때 이미 0/1이 아닌지 확인합니다. 이렇게하면 처리가 최소한으로 유지됩니다.