2013-08-21 5 views
0

TSql 병합 명령은 어떤 이유로 느려집니다.tsql 병합 속도가 느려집니다.

일괄 처리 후 데이터 배치를 10000 레코드와 동일한 병합으로 병합하고 하나의 병합에서 다른 병합으로 이동하는 데 더 오래 걸립니다. 여기

병합 명령이다

MERGE [dbo].[SResult] AS target 
      USING [dbo].[SResultTemp] AS source 
      ON (target.QSId = source.QSId 
       and target.ResultId = source.ResultId 
       and target.EngineId = source.EngineId) 
      WHEN NOT MATCHED THEN INSERT 
       (QSId, ResultId, EngineId, Position) 
      values 
       (source.QSId, source.ResultId, source.EngineId, source.Position); 

소스 테이블은 대상이 동일이

CREATE TABLE [dbo].[SResultTemp](
     [QSId] int not null, 
     [ResultId] int not null, 
     [EngineId] int not null, 
     [Position] int not null, 
     CONSTRAINT [PK_SResultTemp] PRIMARY KEY CLUSTERED(
      [QSId], [ResultId], [EngineId], [Position] ASC 
     )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
     ) ON [PRIMARY] 

같이 선언하지만 기본 키 및 인덱스의 다른 세트로 추가 필드 SResultId을 갖는다 :

PK_SResult - 차

IX_SResult_QS 내가 작업 또한

Results Upload: SResult took 00:00:01.0008344 
    Results Upload: SResult took 00:00:18.1046734 
    Results Upload: SResult took 00:00:17.9797846 
    Results Upload: SResult took 00:00:27.7828817 
    Results Upload: SResult took 00:01:30.4140091 
    Results Upload: SResult took 00:03:17.6433416 
    Results Upload: SResult took 00:03:21.3761251 
    Results Upload: SResult took 00:06:07.2555342 
    Results Upload: SResult took 00:06:56.2423653 
    Results Upload: SResult took 00:06:57.1729179 
    Results Upload: SResult took 00:07:09.7221083 

: Id_ResultId - 여기

내가 로그에 표시되는 내용입니다 클러스터 된 비 고유 -, 고유하지 않은

UX_SResult_EngineId_QSId_Position를 클러스터되지 않은 - 비 고유은

IX_SResult_EngineId 클러스터되지 않은 여러 테이블이 있으므로 다른 테이블에는 이와 같은 규칙이 없습니다. 누구든지 도와 줄 수 있습니까?

감사합니다.

+1

공정한 PK는 다소 부족합니다. – ChaosPandion

+1

PK가 파편 삽입 속도가 떨어지면 (그리고 생각보다 훨씬 빠름) – Paparazzi

답변

1

색인으로 조각 삽입 속도가 저하됩니다.
그리고 알 수 있듯이 빠르게 저하 될 수 있습니다.
PK 순서대로 삽입 할 수 있으면 조각화가 줄어 듭니다.
패드 인덱스가 조각화 속도를 늦 춥니 다.
삽입 완료 후 클러스터되지 않은 모든 색인을 생성하고 다시 작성할 수 있습니까?

SResultId는 신원입니까?

왜 인덱스 디자인입니까?
SResultTemp의 PK와 다른 고유 제한 조건이 있습니다.

인덱스 속도가 빨라지지만 삽입 및 업데이트 속도가 느려집니다.
조인에 대한 색인이 도움이되지만 지금은 색인이 분리되어 있습니다.

내 충고는 고유성 및 테스트에 필요한 인덱스로 분류하는 것입니다.

+0

의 성능을 죽이고 있었지만, 고유 인덱스가 성능을 죽이는 것으로 보입니다. 비활성화하면 더 이상 성능 저하가 발생하지 않습니다. 그래서 고유 색인을 사용하지 않고 고유성을 부여하는 방법에 대한 질문이 있습니다. – user2703790

+0

중복을 삽입하지 마십시오. – Paparazzi

+0

중복을 삽입하지 않는 것이 좋습니다. 그러나 때로는 누군가가 무언가를 깨뜨릴 수 있습니다. 일단 그런 일이 발생하면이 같은 문제를 방지하기 위해이 색인을 작성해야했습니다. 글쎄, 솔루션은 꽤 간단했다 : 매우 구체적인 데이터에서만 저하가 발생한다는 사실을 알게되었다. 모든 배쓰는 동일한 EngineId와 QSId (일련의 일괄 처리에 대해 고유했다. 동일한 EngineId를 가진 모든 레코드). 사실은 위치 인덱스 만 작동했습니다. 그래서 인덱스 필드 셔플 도움 : 새로운 고유 인덱스 UX_SResult_EngineId_Position_QSId 전혀 저하를 제공하지 않습니다 – user2703790

1

물론 4 개의 필드가있는 clusterd PK를 사용하면 무엇이 더 오래 걸릴까요? 병합 중에 테이블의 모든 레코드를 계속 재정렬합니다.

+0

PK가 잘된 것처럼 보입니다. 고유 인덱스가 실제로 – user2703790

0

두 가지 문제가 있습니다

  1. 인덱스를 증가시키고 더 많은 행이 추가되는 결과 유지 관리 - 작업
  2. ON (target.QSId = source.QSId 
        and target.ResultId = source.ResultId 
        and target.EngineId = source.EngineId) 
    

원인은 증가 ON 절 비교가 필요한 행이 점점 더 많아지면서 대상에서 검사가 필요합니다.

색인을 제거하면 ON 절의 검사 속도가 매우 느려집니다. 우리는 여기에 관심의 충돌이 있습니다.

+0

예,하지만 문제는 내가 복잡한 pk와 같은 일곱 테이블을 가지고있다. 그리고 그들 중 누구도 병합 저하를 전혀 보이지 않습니다. – user2703790

+0

@ user2703790 병합에서 성능 저하가 보이지 않는 인덱스 테이블이 너무 많다는 사실에 매우 놀랐습니다. 견본을 게시하십시오. – Paparazzi

+0

고유 인덱스가 종료되면 절이 두 개의 다른 인덱스에서 작동하며 저하가 발생하지 않습니다. – user2703790

관련 문제