2011-05-16 6 views
1

안녕하세요, 나는 2 테이블을 조인하고 업데이 트하는 몇 가지 값을 확인합니다 저장 프로 시저를 만들고 싶습니다. FETCH를 사용하여 각 레코드에 대한 업데이트 프로세스를 만듭니다.Tracnsact SQL 가져 오기 성능

하지만 성능을 고려하고 있습니다. FETCH를 사용하는 것은 나쁜 생각입니까?

예 :

표 는 표 2 RatingID 은 bookname 우리는이 같은이 두 테이블을 조인합니다

을 bookID로서

은 bookname

을 bookID로서. 이 쿼리, 우리는 표 2의 bookID로서 칼럼에 표 1의 bookID로서 설정하는 UPDATE를 만들 것입니다 끌어 각 레코드에 대해

SELECT * FROM Table2 
LEFT JOIN Table1 ON Table2.BookName = Table1.BookName 
WHERE Table2.BookID = 0 

.

+0

via via CURSOR? 그렇다면 보통 일을 효율적으로하는 방법이 아니기 때문에 더 많은 세부 사항을 제공해야합니다. –

+0

@Alex 예 커서를 통해에서 FETCH. 또한 내 질문을 업데이 트되었습니다. –

+0

"우리는 Table1의 bookID를 Table2의 BookID 열로 설정하는 UPDATE를 할 것입니다." 'Where Where' 조건이 올바른지,'Where Table1.BookID = 0'을 확인하지 말아야합니까? 또한 'OUTER' 조인을 사용하지 않아도 양쪽 테이블에서 일치하는 행에만 관심이 있으므로 생각했을 것입니다. –

답변

2

예.

SQL Server에서 커서를 피하고 대신 집합 기반 대체 방법을 사용해야합니다.

UPDATE 문은 다른 테이블에 JOIN을 지원합니다.

+0

큰 테이블을 업데이트하면 사용자에게 영향을 줄 수있는 테이블 잠금이 발생할 수 있습니다. 이 문제를 해결하기 위해 커서를 사용하여 작은 배치로 쿼리를 처리 할 수 ​​있습니다. –

+1

@McMinton - TOP (@batchsize)를 포함하는 CTE를 사용하고 CTE IMO를 업데이트하는 것이 좋습니다. –

2

(평소와 같이) 마틴이 말한 것과 같습니다.

또한, 귀하의 설명에 따라 업데이트가 (SQL Server 용)과 같이 보일 것입니다 :

UPDATE Table1 
set BookID = t2.BookID 
from Table1 t1 
    inner join Table2 t2 
    on t2.BookName = t1.BookName 
where T2.BookID = 0 
  • 내부 조인, 변경할 수 없기 where 절의; Table2.BookID = 0으로, 표 2 행이 조인에 의해 일치하지 그러나 그들의 bookID로서 항상
  • 마찬가지로 표 2의 bookID로서에 표 1의 bookID로서 설정
  • 는 항상 0으로 설정됩니다 NULL이 될 것 같은 곳에 있기 때문에, 삭제됩니다 조인 외부에 의해 어쨌든 포함 절에 "where Table2.BookId = 0"이 표시됩니다. 이걸 다시 생각해 볼 수도 있습니다 ...?
+0

아니요. 우리는 Table1의 BookID를 Table2의 BookID 열로 설정하여 항상 0이되도록하지 않을 것입니다. 하지만 지금 커서 감사를 사용하지 않고 업데이트 명령을 선호합니다. –

관련 문제