큰 테이블에서 VARCHAR 컬럼의 크기를 늘릴 때 문제가 있습니까?


87

SQL Server 2008을 사용하고 있으며 약 500k 행이있는 테이블에서 VARCHAR 필드를 (200에서 1200) 더 크게 만들어야합니다. 내가 알아야 할 것은 내가 고려하지 않은 문제가 있는지 여부입니다.

이 TSQL 문을 사용할 것입니다.

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

나는 이미 데이터 사본에 대해 시도해 보았고이 진술은 내가 볼 수있는 나쁜 영향을 미치지 않았습니다.

그래서 내가 고려하지 않았을 가능성이있는 문제가 있습니까?

그건 그렇고, 열은 인덱싱되지 않습니다.


1
@nonnb : 끔찍한 생각입니다. stackoverflow.com/q/2091284/27535
gbn 2011 년

@gbn 그 질문에 대한 Justin의 최근 답변에 대한 생각이 있습니까? 당신과 다소 상충되는 것 같습니다.
AakashM 2011 년

@AakashM : 그는 스토리지에 대해 맞지만 최적화가 아니라 오버 헤드입니다. 이제이 읽기 stackoverflow.com/q/2009694/27535
GBN

@gbn-인덱싱에 대한 Martin Smith의 관찰과 마찬가지로 좋은 지적입니다. 빼는.
StuartLC 2011 년

2
결국 한 가지가 있었다는 것이 밝혀졌습니다! 필드가 인덱싱되었으며 누군가가 900b보다 큰 항목을 입력하려고 시도했을 때 실패했습니다! 경고 받다.
Paul T Davies

답변:


59

이는 메타 데이터 변경 일 뿐이며 빠릅니다.

관찰 : SET ANSI_xx 설정 중 하나가 다른 경우 "사고"를 피하기 위해 명시 적으로 NULL 또는 NOT NULL을 지정합니다. 예를 들어 어떤 이유로 SSMS가 아닌 osql에서 실행


1
이것으로 모든 것이 잘되었습니다. 아무 문제 없습니다.
Paul T Davies

에서 갈 때 동일한 규칙이 적용되는 경우에 당신은 알고 있는가 varchar(200)varchar(max)?
CodeNaked

@CodeNaked : 대답하기가 훨씬 까다 롭습니다. (max)는 "in row"또는 행 외부에있을 수있는 LOB 유형입니다. 그러나, 나는 데이터가 "행에"이미 더 테이블이 필요하지 않을 것입니다 재 구축 있기 때문에 동일해야 말을 기울어 야
GBN

12

이 질문을 검색했기 때문에 2 센트를 추가하고 싶었습니다. b / c 비슷한 상황에 처해있었습니다.

인식 에서 변경하는 동안 것을 varchar(xxx)하는 것은 varchar(yyy)참으로 메타 데이터 변경,하지만에 변경하는 것은 varchar(max)아니다. 때문에 varchar(max)값 (BLOB 값 일명 - 이미지 / 텍스트 등) "행에서"하지 테이블 행 내에서 디스크에 다르게 저장되지만. 따라서 서버는 큰 테이블에서 열광하고 몇 분 (시간) 동안 응답하지 않습니다.

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

추신. nvarchar또는 코스 에도 동일하게 적용됩니다 .


4

Varchar (200)에서 Varchar (1200)로 변경하면 메타 데이터 변경 일 뿐이므로 문제가 발생하지 않으며 SQL Server 2008이 과도한 공백을 자르기 때문에 성능 차이가 없어야합니다. 변화.


나는 이것이 작은 테이블에 해당 될 수 있다고 생각하지만, 활발하게 쿼리되는 큰 테이블의 경우 상당한 시간 동안 차단 될 수 있습니다 (SQL 서버가 모든 행을 잘라야하는지 확인해야하기 때문에).
CodeNaked

0

열을 varchar (max)로 변환하지 않아야하는 또 다른 이유는 varchar (max) 열에 인덱스를 만들 수 없기 때문입니다.


-3

제 경우에는 alter column이 작동하지 않았으므로 다음과 같이 'Modify'명령을 사용할 수 있습니다.

alter table [table_name] MODIFY 열 [column_name] varchar (1200);


5
질문에 따라 SQL Server를 사용하지 않기 때문입니다 (아마도 MySQL). "ALTER TABLE ... MODIFY"는 유효한 T-SQL이 아닙니다.
Jeroen Mostert 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.