수백만 행의 테이블에서 열 정의를 변경하는 가장 효율적인 방법은 무엇입니까?


9

수백만 행이 포함 된 테이블에서 열을 NOT NULL에서 NULL로 변경해야합니다. 나는 간단한 시도했다

alter table Table1 ALTER COLUMN Column1 XML NULL

그러나 영원히 걸립니다. 내 질문은 다음과 같습니다.

  1. 대체를 적용하는 데 왜 그렇게 오래 걸립니까?
  2. 더 좋은 방법이 있습니까?

답변:


3

1) 무슨 일이 일어나고 있는지 정확하게 파악하려면 테이블의 전체 구조 + 비 클러스터형 인덱스에 대한 자세한 정보가 필요하지만 내 의심은 NULL 비트 맵과 관련이 있습니다.

주제에 대한 자세한 내용은를 참조하십시오. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) 예, 스토리지 공간이 있으면 정확한 널 입력이 가능한 새 테이블을 작성하고 과도한 로그 증가를 피하기 위해 여러 배치로 데이터를 전송하고 아래 나열된 기술을 사용하여 테이블을 전환하십시오. 다운 타임이 거의 없거나 전혀없는 상태에서이 작업을 여러 번 수행했습니다.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

더 빠를까요?

  1. 에 대한 올바른 정의로 ​​새 테이블을 작성하십시오. Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. OriginalTable의 이름을 OriginalTable_old로 바꾸십시오. NewTable을 OriginalTable로 이름 바꾸기
  4. OriginalTable_old 확인 및 삭제

여기서 장점은 작업 기간 동안 원본 테이블에 대한 잠금을 유지하지 않는다는 것입니다. 이름 바꾸기 단계에서만 테이블을 잠 가야합니다. SQL Server는 개체 수준 이름 바꾸기를 지원한다고 가정합니다.


예, SQL Server는 시스템 저장 프로 시저를 사용하여 개체 수준 이름 바꾸기를 지원합니다 sp_rename.
gonsalu

1 분 안에 3.5M 행 으로이 방법을 통해 열을 변경할 수있었습니다.
Mohsen Afshin

2

열을 NOT NULL에서 NULL로 변경할 때 모든 행을 터치해야하므로 완료하는 데 시간이 오래 걸립니다. 시간이 덜 드는 방법은 없습니다.


1

또 다른 옵션은 문제의 테이블에 대한 올바른 정의로 ​​새 열을 작성하고 이전 열의 데이터로 열을 업데이트 한 다음 이전 열을 삭제하는 것입니다.

또는 INT 열에서 비슷한 문제를 다루는 SE의 이전 게시물을 참조 할 수 있습니다.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


제 경우에는 열이 단순히 NULL로 가득 차 있으므로 이것이 올바른 방법으로 새로운 NULL 열을 만드는 데 전혀 시간이 걸리지 않을 것이라고 생각합니다. 이전 열을 삭제하면, 수백만 개의 인서트를 다루는 대신 ...
Zack

0

명령이 실행되는 동안 SQL 활동 모니터를 열면 실제로 처리 중인지 또는 테이블의 독점 잠금 형식을 기다리는 지 여부를 알 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.