>

쿼리에 두 개의 삽입을 포함하는 저장 프로 시저가 있습니다. sp를 실행하는 동안 종종이 두 가지가 일시 중단 된 것으로 보입니다. sp는 트래픽이 거의없는 테스트 서버에서 테스트되었지만 이제 프로덕션 서버로 이동하면 일시 중단 된 상태가 1-2 교착 상태로 나타납니다.

이 쿼리를 실행하는 동안 SQL Server가 테이블 잠금을 생성한다고 가정하지만이 문제를 해결하는 기본 방법은 무엇입니까? 쿼리에 삽입하면 한 번의 반복으로 30000 개의 레코드가 다른 데이터베이스로 이동합니다. 이들은 아카이브 데이터이므로 일반 프로덕션 프로세스에서 발생하는 쿼리는 아카이브되는 데이터와 아무런 관련이 없으며 2-3 세입니다.

  • 정지 상태 및 교착 상태를 피하기 위해 선택에 WITH NOLOCK을 추가 할 수 있습니까?
  • 또는 ISOLATION LEVEL을 UNCOMMITTED로 읽도록 설정해야합니까? (이 기록은 오래되었으며 변경되지 않습니다)
  • 다른 옵션이 있습니까? 커서를 하나씩 아카이브 해야하는 ID를 통해 실행합니까? (지금까지 커서를 사용하지 않으려 고했습니다.)

이 두 가지 쿼리가 있습니다. @workitemids 및 @workstepids는 하나의 int 필드를 포함하는 테이블 변수입니다.

insert into archive_****.archive.workitems
            select * from ****.dbo.WorkItems where ****.dbo.workitems.Id in (select Id from @workitemIds);
insert into archive_****.archive.worksteps([Id], 1582793344, [Description], [WorkPlace_Id], [WorkItemState_Id], [UserId], [WorkItem_Id], [Technology_Id], [Failcodes_Id], [DrawingNo], [ManualData], [Deleted], [WorkItemState_Arrival_Id], Workstepdatas)
            select [Id], 1582793344, [Description], [WorkPlace_Id], [WorkItemState_Id], [UserId], [WorkItem_Id], [Technology_Id], [Failcodes_Id], [DrawingNo], [ManualData], [Deleted], [WorkItemState_Arrival_Id],
                (select Fieldname Field, Value [Value], Unit [Unit] from ****.dbo.workstepdatas wsd
                    left join ****.dbo.technologydatafields tdf on tdf.Id = wsd.TechnologyDatafields_Id
                    where tdf.fieldname is not null and wsd.WorkStep_Id = ws.Id
                        and value NOT LIKE '%[' + CHAR(0)+ '-' +CHAR(31)+']%'  COLLATE Latin1_General_100_BIN2
                    for xml auto,type)
            from ****.dbo.worksteps ws
            where ws.Id in (select Id from @workstepIds);

  • 답변 # 1

    아래와 같이 중첩 된 쿼리를 cte에 작성하고 진행 상황이 있는지 조언하십시오. 데이터베이스 이름을 변경해야합니다.

    insert into archive_db.archive.workitems (with tablock)
    select *
    from db.dbo.WorkItems as w
    inner join @workitemIds as wi
        on w.Id = wi.id;
    with xmlcte
        (ID, xmlRow)
    as (
           select ws.id
                , (
                      select Fieldname as Field                           
                           , [Value]
                           , Unit
                      from db.dbo.workstepdatas wsd
                      left join db.dbo.technologydatafields tdf
                          on tdf.Id = wsd.TechnologyDatafields_Id
                      where
                          tdf.fieldname is not null
                          and wsd.WorkStep_Id = ws.Id
                          and [value] not like '%[' + char(0) + '-' + char(31) + ']%' collate Latin1_General_100_BIN2
                      for xml auto, type
                  ) as xmlRow
           from db.dbo.worksteps as ws
       )
    insert into archive_db.archive.worksteps (with tablock)
         (
             [Id]
           , 1582793344
           , [Description]
           , [WorkPlace_Id]
           , [WorkItemState_Id]
           , [UserId]
           , [WorkItem_Id]
           , [Technology_Id]
           , [Failcodes_Id]
           , [DrawingNo]
           , [ManualData]
           , [Deleted]
           , [WorkItemState_Arrival_Id]
           , Workstepdatas
         )
    select ws.[Id]
         , 1582793344
         , [Description]
         , [WorkPlace_Id]
         , [WorkItemState_Id]
         , [UserId]
         , [WorkItem_Id]
         , [Technology_Id]
         , [Failcodes_Id]
         , [DrawingNo]
         , [ManualData]
         , [Deleted]
         , [WorkItemState_Arrival_Id]
         , [xmlRow]
    from db.dbo.worksteps ws
    inner join @workstepIds as wsi
        on ws.Id = wsi.id
    inner join xmlcte -- I assume inner join is OK
        on ws.id = xmlcte.id;
    
    

관련 자료

  • 이전 파이썬에서 가위 바위 보와 가위에 코드를 작성하려고합니다
  • 다음 Logging Soap Request and Response - 비누 요청 및 응답 로깅 - 봄