2017-12-06 7 views
0

여러 스레드에서 실행되지만 일시적인 교착 상태가 발생하는 일괄 처리 작업에 SqlBulkCopy가 도입되었습니다. 테이블 잠금 옵션을 사용하지 않습니다. 삽입되는 테이블에 클러스터 된 인덱스가 있습니다.여러 스레드에서 SqlBulkCopy를 안전하게 사용할 수 있습니까?

각 스레드는

우리가 안전하게이 시나리오에서 SqlBulkCopy의를 사용할 수있는 방법이 있나요 (AssetIds의 배치와) 고유 PortfolioSnapshotId을 위해 삽입된다? 아래

XML :

<event name="xml_deadlock_report" package="sqlserver" timestamp="2017-12-06T02:38:31.382Z"> 
    <data name="xml_report"> 
    <type name="xml" package="package0" /> 
    <value> 
     <deadlock> 
     <victim-list> 
      <victimProcess id="process248e1c96108" /> 
     </victim-list> 
     <process-list> 
      <process id="process248e1c96108" taskpriority="0" logused="63904" waitresource="PAGE: 14:1:289932632 " waittime="4523" ownerId="2409980792" transactionname="user_transaction" lasttranstarted="2017-12-06T02:38:26.657" XDES="0x2453d39ce58" lockMode="IX" schedulerid="14" kpid="24604" status="suspended" spid="151" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-12-06T02:38:26.657" lastbatchcompleted="2017-12-06T02:38:26.657" lastattention="2017-12-06T02:38:23.760" clientapp="XXXX" hostname="XXXX" hostpid="137000" loginname="XXXX" isolationlevel="read committed (2)" xactid="2409980792" currentdb="14" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> 
      <executionStack> 
       <frame procname="adhoc" line="1" stmtend="1206" sqlhandle="0x020000000f2bea1e535f1cbf04ef8318984df8965399be020000000000000000000000000000000000000000"> 
unknown </frame> 
      </executionStack> 
      <inputbuf> 
insert bulk TableName ([AssetId] NVarChar(255) COLLATE Latin1_General_CI_AS, [ParentAssetId] NVarChar(255) COLLATE Latin1_General_CI_AS, [PortfolioSnapshotId] UniqueIdentifier, [Quantity] Decimal(28,8), [CompressedProperties] VarBinary(max)) with (CHECK_CONSTRAINTS) </inputbuf> 
      </process> 
      <process id="process248e1c8cca8" taskpriority="0" logused="67244" waitresource="PAGE: 14:1:289933280 " waittime="4523" ownerId="2409980337" transactionname="user_transaction" lasttranstarted="2017-12-06T02:38:26.220" XDES="0x25e82396e58" lockMode="IX" schedulerid="2" kpid="33292" status="suspended" spid="158" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-12-06T02:38:26.220" lastbatchcompleted="2017-12-06T02:38:26.220" lastattention="2017-12-06T02:38:24.507" clientapp="XXXX" hostname="XXXX" hostpid="137000" loginname="XXXX" isolationlevel="read committed (2)" xactid="2409980337" currentdb="14" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> 
      <executionStack> 
       <frame procname="adhoc" line="1" stmtend="1206" sqlhandle="0x020000000f2bea1e535f1cbf04ef8318984df8965399be020000000000000000000000000000000000000000"> 
unknown </frame> 
      </executionStack> 
      <inputbuf> 
insert bulk TableName ([AssetId] NVarChar(255) COLLATE Latin1_General_CI_AS, [ParentAssetId] NVarChar(255) COLLATE Latin1_General_CI_AS, [PortfolioSnapshotId] UniqueIdentifier, [Quantity] Decimal(28,8), [CompressedProperties] VarBinary(max)) with (CHECK_CONSTRAINTS) </inputbuf> 
      </process> 
     </process-list> 
     <resource-list> 
      <pagelock fileid="1" pageid="289932632" dbid="14" subresource="FULL" objectname="XXXX.dbo.TableName" id="lock247f3004d00" mode="X" associatedObjectId="72057594048872448"> 
      <owner-list> 
       <owner id="process248e1c8cca8" mode="X" /> 
      </owner-list> 
      <waiter-list> 
       <waiter id="process248e1c96108" mode="IX" requestType="wait" /> 
      </waiter-list> 
      </pagelock> 
      <pagelock fileid="1" pageid="289933280" dbid="14" subresource="FULL" objectname="XXXX.dbo.TableName" id="lock247f4f97c80" mode="X" associatedObjectId="72057594045661184"> 
      <owner-list> 
       <owner id="process248e1c96108" mode="X" /> 
      </owner-list> 
      <waiter-list> 
       <waiter id="process248e1c8cca8" mode="IX" requestType="wait" /> 
      </waiter-list> 
      </pagelock> 
     </resource-list> 
     </deadlock> 
    </value> 
    </data> 
</event> 

테이블 :

CREATE TABLE [dbo].[TableName](
    [AssetId] [nvarchar](255) NOT NULL, 
    [ParentAssetId] [nvarchar](255) NULL, 
    [PortfolioSnapshotId] [uniqueidentifier] NOT NULL, 
    [Quantity] [decimal](28, 8) NULL, 
    [CompressedProperties] [varbinary](max) NULL 
CONSTRAINT [PK_TableName] PRIMARY KEY CLUSTERED 
(
    [PortfolioSnapshotId] ASC, 
    [AssetId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[TableName] WITH CHECK ADD CONSTRAINT [FK_TableName_PortfolioSnapshot] FOREIGN KEY([PortfolioSnapshotId]) 
REFERENCES [dbo].[PortfolioStore_PortfolioSnapshot] ([Id]) 

CREATE NONCLUSTERED INDEX [IX_TableName_PortfolioSnapshotId] ON [dbo].[TableName] 
(
    [PortfolioSnapshotId] ASC 
) 
INCLUDE ( [AssetId], 
    [ParentAssetId], 
    [Quantity], 
    [Price]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
+0

모든 인덱스를 포함하여 모든 관련 테이블 구조와 함께 교착 상태 정보 (XML이 아닌 그림)를 추가하십시오. –

+0

@RemusRusanu done :) –

답변

2

교착 때문에 NC 인덱스의 존재로 인해 발생 (페이지 잠금 IX-> X 개의 상이한 객체 ID에 동일한 객체 이름). 나는 클러스터 된 인덱스가 같은 키에 있고 더 선택적인 것으로 간주하여 NC 인덱스에 대한 이유를 알지 못합니다. NC 인덱스를 제거합니다.

+0

그렇지 않으면 매우 큰 CompressedProperties 열을 제외하므로 NC 인덱스가 있으므로 해당 열을 필터링 할 때 검색 할 데이터가 적습니다. 이 데이터를 별도의 테이블로 가져 오는 것을 고려했습니다. 여기에 다른 옵션이 있는지 확실하지 않은가요? 왜 인덱스가 교착 상태 자체를 일으키는 지 완전히 명확하지 않습니다. 당신은 명확히 할 수 있습니까? 매우 감사합니다! –

+0

[''sp_tableoption '큰 값 유형이 out of row' '입니다.] (https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-tableoption-transact-sql) –

관련 문제