none
Update 프로세스가 완점 멈춤인지 진행중인지 알수 없나요 ? RRS feed

  • 질문

  • 제가 대량의 데이터를 업데이트 작업을 진행중에 있습니다.

    그래서 수시로 sp_who2, sp_lock을 확인하고 있는데,

    어느순간 sp_who2를 보니 Runable은 없고 suspend만 23개 ( 한 프로세스id spid )가  있는겁니다.

    그래서 sp_lock을 보니 변화는 있습니다.

    그리고 sysprocesses를 보니 변화가 있고요.. , 그리고 리소스모니터로 disk io를 봐도 해당 DB에 io가 활발히 움직이고 있습니다. (실질적으로 저혼자 쓰고있는상태)

    지금 이상황이 멈춤 상태라고 봐야 할까요 ? 그래서 실행을 멈춰야 할까요 ? 아니면 나오기는 suspend로 나오지만 실제는 작업 중이라서 계속 기달려야 할까요 ?

    현재 Updade 돌린지 딱 24시간이 다되가네요.. 레코드는 거의 1억건정도 됩니다...

    좋은 답변 부탁드립니다.

     

    그리고 Update의 진행 상황을 확인할수 있는 방법이 있다면 그것도 부탁드립니다. 

    현재 sys.dm_exec_request를 통해서 확인은 하고 있으나 checkdb, backup등.. 몇몇가지는 제대로 나오지만 Insert, Update이런건 안나오는걸로 알고있습니다..

    이상입니다.

    2011년 12월 29일 목요일 오전 5:45

모든 응답

  • 안녕하십니까? mas7008

    Microsoft TechNet Forum 사이트를 방문해 주셔서 감사합니다.
     

    고객님께서 문의하신 관련 내용의 자료를 찾고 있습니다. 조금만 기다려주시면 답변을 작성을 하겠습니다.
     

    제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.

     

    2012년 1월 2일 월요일 오전 2:04
    중재자
  • 안녕하세요

     

    우선 지금 확인하고 계신대로 아래 쿼리를 가지고는 해당 UPDATE의 완료시점을 알 수는 없습니다.

    select percent_complete
         , estimated_completion_time
         , total_elapsed_time
         , cpu_time
         , logical_reads
         , status
      from sys.dm_exec_requests
     where session_id = @@spid

    우선, 해당 테이블의 전체 페이지수와 현재 진행중인 IO 논리적읽기 수를 비교하여 대략적인 확인만 가능할 것으로 판단됩니다.

    sp_spaceused 테이블명

    select total_elapsed_time
         , cpu_time
         , logical_reads
         , status
      from sys.dm_exec_sessions
     where session_id = @@spid

    또한 해당 쿼리의 실행계획도 확인해 보셔야 하곘습니다.

    해당 UPDATE 작업이 전체 데이터를 모두 변경하는 것인지 아니면 그 중 매우 일부만을 변경하는지에 따라서도 접근 방법이 달라질 것으로 판단됩니다.

    또한 병행성과 작업 진척도를 확인하기 위해

    UPDATE 구문에 TOP를 지정하여 반복처리할 수도 있습니다.

     

    감사합니다.

     

     


    Best Regards, Daejoong Samuel Sung Microsoft SQL Server MVP, MCP Consultant @ SQLRoad.COM
    2012년 1월 4일 수요일 오전 5:47
    중재자
  • 안녕하십니까? mas7008

    Microsoft TechNet Forum 사이트를 방문해 주셔서 감사합니다.

    문의 하신 “Update 프로세스가 완점 멈춤인지 진행중인지 알수 없나요 ?”에 대한 답변을 드리겠습니다.

     

    고객분이 말씀하신대로 sys.dm_exec_request를 통해서는 완료 시간을 확인할 수 없습니다.

    , DMV의 경우 내부적인 처리 step별로 완료 Percent를 보여주기 때문에 backup이나 checkdb에서도 완전히 신뢰하기는 힘듭니다.

     

    disk로 기록된 I/O를 가지고 추측할 수 있지만 이것도 쉽지는 않습니다.

    update 쿼리의 경우 데이터를 변경하는 작업이기 때문에 트랜잭션 로그를 기록하게 됩니다.

    예를 들어 100MB의 데이터가 변경되어야 하는 상황이라면 최소 100MB이상의 트랜잭션 로그가 기록됩니다.

    이 트랜잭션 로그 기록량은 쿼리의 처리 방식과 인덱스 상황에 따라 많은 차이를 보이게 됩니다.

     

    때문에 일반적으로 많은 건을 update할 경우 작은 단위로 나누어서 반복적으로 update를 수행하게 됩니다.

    예를들어 loop를 돌면서 PK기준으로 1,000건씩 join하여 업데이트하는 방식을 사용할 수 있습니다.

    1,000건이 수행될 때 마다 작업 테이블에 기록을 한다면 어디까지 수행 되었는지를 확인할 수 있게 됩니다.

     

    추가로 업데이트 쿼리 수행 중에 중지를 하게 되면 rollback이 진행되며, 이 시간은 지금까지 업데이트가 진행한 시간만큼 걸릴 수 있습니다.

    지금까지 로그가 어느정도 기록 되었는지는 "DBCC sqlperf(logspace)" 명령을 통해 확인할 수 있습니다.

     

    제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.

    제시해 드린 답변이 도움이 되었기를 바랍니다.

    2012년 1월 6일 금요일 오전 8:06
    중재자
  • 안녕하십니까? mas7008
    Microsoft TechNet의 Forum 사이트를 방문해 주셔서 감사합니다.

    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다. 하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다.
    2012년 1월 18일 수요일 오전 6:04
    중재자