2012-05-25 3 views
14

SQL Server 2008 R2에 10 억 개의 행이있는 테이블이 있습니다. 두 열의 데이터 유형을 int에서 bigint로 변경하려고합니다. 두 번 ALTER TABLE zzz ALTER COLUMN yyy가 작동하지만 매우 느립니다. 어떻게 처리 속도를 높일 수 있습니까? 나는 다른 테이블에 데이터를 복사, 드롭, 만들기, 복사 및 간단한 복구 모드로 전환하거나 어떻게 든 1000 행을 커서로하고 생각하고 있었는데, 그게 실제로 어떤 개선으로 이어질 지 모르겠습니다.거대한 테이블의 열 형식을 변경하십시오.

+1

데이터 유형을 변경하는 이유를 설명 할 수 있습니까? –

+1

커서를 사용하여 열 유형을 변경하는 방법을 알 수 없습니까? C 럼 유형은 테이블의 _all_ 값을 변경 한 것입니다. – Oded

+0

int to bigints – user1417408

답변

26

당신이하고있는 것을 변화에 따라 경우에 따라서는 유지 관리 창을 쉽게 할 수 있습니다. (아무도 테이블의 데이터를 변경할 수 없을 것) 그 기간 동안 수행 할 수 있습니다

  1. 드롭은 인덱스/이전 열을 가리키는 제약 조건 및 비활성화 트리거
  2. 새로운 널 (NULL) 열을 추가 (이 NOT NULL로 의미 경우에도) 새로운 데이터 유형
  3. 갱신 (A)에서 10000 행에 영향을주지는 (이전 컬럼의 값과 동일하고 말 (개별 거래의 덩어리에서이 작업을 수행 할 수 있습니다 설정 새 열을 가진 UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL 사용) CHECKPOINT와 시간은 로그)
  4. 를 오버런 방지하기 위해 업데이트가 모두 완료되면, 기존의 열
  5. 새 열 이름을 변경 드롭 (그리고 만약 적절한 NOT NULL 제약 조건 추가)

여기서 핵심은 당신을 수 있다는 것입니다

  • 인덱스 및 업데이트 통계를 재 구축을 단일 ALTER TABLE 명령으로 수행 할 수없는 3 단계에서 점진적으로 갱신을 수행하십시오.

    이가 열이 데이터 무결성에 중요한 역할을하지 않는 가정 -이 외래 키 관계의 무리에 참여하는 경우, 더 많은 단계가있다.

    편집 또한

    , 그냥 큰 소리로 궁금해, 나는이에 대한 모든 테스트를 완료하지 않은 (그러나 목록에 추가). 페이지 + 행 압축이 여기 도움이 될지 궁금해? INT를 BIGINT로 변경하고 압축을 적용한 상태에서 SQL Server는 모든 값을 여전히 INT에 맞게 처리해야합니다. 다시 말하지만, 이것이 변경을 더 빨리 또는 더 느리게 만들지, 또는 처음부터 압축을 추가하는 데 얼마나 오래 걸릴지는 테스트하지 않았습니다. 그냥 거기 던져.

  • +0

    DB가 오프라인 상태입니다. 복구 모델을 간단하게 설정합니까? – user1417408

    +0

    SIMPLE 또는 FULL의 경우 큰 ALTER TABLE 명령은 전혀 다르지 않습니다. 두 경우 모두 전체가 기록되기 때문입니다. 위의 경우 SIMPLE이 약간 더 좋을 수 있지만 적절한 배치 크기를 선택하면 복구 모델이 중요하지 않습니다. 또한 데이터베이스가 "오프라인"(나는 당신이 데이터베이스 변경을 의미하지 않는다고 가정합니다 ... 오프라인으로 설정), 왜 속도가 중요합니까? 위의 내용은 시간을 약간 줄이는 효과가 있을지 모르지만 마음에 드는 속도가 빠르지는 않습니다. 당신이하는 일에는 시간이 필요합니다. –

    +0

    아론, 도와 줘서 고마워. 이 DB를 사용하는 사이트는 몇 시간 동안 만 오프라인 상태가되므로 속도가 중요합니다. – user1417408

    -2

    당신은 마우스 오른쪽 단추로 클릭 한 선택 '디자인'을 한 다음 편집 할 열을 선택 방금 데이터베이스의 테이블로 이동 SQL Server Management Studio를 같은 것을 사용하는 경우가 BIGINT로 설정하고 저장 타격을. 전체 열을 변경하지만 이전 값은 그대로 유지됩니다. 이것은 테이블을 bigint로 int에서 자라게하는 데 좋습니다. 그러나 알고있는 한 기존 데이터를 변경하지는 않습니다.

    관련 문제