데이터베이스 개발자 질문과 답변 게시판
대용량의 테이블을 Update하려고 합니다.
가령 1억건이 들어 있는 테이블이 있으며, 이 테이블의 id필드를 업데이트하려고 합니다.
update TableA
set id = calc(id) -- id를 이리저리 계산해서 id 칼럼에 update함. 시간이 소요됨.
와 같이 한다면 시간이 많이 걸릴것으로 예상됩니다. 그래서 아래와 같이 update문장을 여러개로 나누어 동시에 실행을 시킬려고 하는데
문제점이 없는지 봐 주시면 감사하겠습니다.
update TableA
set id = calc(id)
where seq between 1 and 10000000
update TableA
set id = calc(id)
where seq between 10000001 and 20000000
......
update TableA
set id = calc(id)
where seq between 90000001 and 100000000 -- 구천일 ~ 일억
이렇게 Update문장을 10개정도로 나누고, SSMS를 10개 열어서 동시에 실행을 하려고 하는데 문제가 없겠는지요?
제 단순한 생각에는 첫 번째 Update문장이 실행되면 테이블에 Lock이 걸려서 두 번째부터 실행되는 Update문장은 실행이 안 될 것 같습니다. 그리고 (트랜잭션을 저장하려면) 로그도 엄청 쌓일것 같습니다...
위와 같은 방법에 문제가 없는지요? 문제가 있다면 또는 문제가 없더라도 더 효율적인 방법이 있으면 조언을 부탁드리겠습니다.
감사합니다..
Sql Server2005, Sql Server2008 둘 다 적용해야 합니다....
Comment 6
-
진윤호
2013.02.19 14:02
-
항해자™
2013.02.19 14:30
seq 컬럼에 인덱스 있으면 lock 걸리지 않을꺼 같은데요??
범위 나눠서 하든 병렬처리 하도록 하든 비슷할 것 같습니다.
-
김시준
2013.02.19 14:44
네....그리 큰 걱정을 안 해도 될 듯 하네요...
감사합니다...
-
방랑도사
2013.02.19 17:06
set id = calc(id) -- id를 이리저리 계산해서 id 칼럼에 update함. 시간이 소요됨.
calc 이 함수가 어떤처리를 하느냐가 관건일듯 싶은데요. 우선 십만건이나 백만건정도만 select 로 속도 체크해보시고 , 최적화 시키신후 업데이트 하시면 될듯합니다.
-
김시준
2013.02.19 17:37
천 만건 넣고 업데이트 테스트를 해 봤는데 94 ~ 100초 정도 걸리네요...
이 정도면 일 억건이라해도 큰 시간은 걸리지 않을 듯 보입니다.
그 대신 로그 파일(.ldf)은 대빵 늘어나네요....
그러나 이것도 dbcc shrinckdatabase로 줄이니까 또 팍 줄어듭니다.....
처음엔 좀 걱정을 했었는데 안심이네요...
감사합니다...
-
쓸만한게없네(윤선식)
2013.02.20 00:02
Shrnik 하실 때 고려하실 점은...
지금 하시는 작업이.. 앞으로도 간혹 일어난다면,
실제 로그파일 사이즈가 지금 늘어난 사이즈가 맞는 것일 수 있습니다.
로그파일이 늘어날 때 발생하는 I/O 부하가 있기 때문입니다.
고려하시면 도움될 듯 합니다.
index가 리빌딩되어 조각화가 심각하지 않다면 그리고 파티션이 나뉘어져 있어서 io가 물리적으로 나뉘어져 있다면....
암것도 없이 그냥하면 굳이 나눠서 할 필요가 있을까 싶은데요?