모든 SQL Server 2008 문자열 열을 varchar (max)로 만드는 데 문제가 있습니까? 허용되는 문자열 크기는 응용 프로그램에서 관리합니다. 데이터베이스는 내가 제공 한 것만 유지해야합니다. 실제로 들어가는 데이터의 크기에 관계없이 Sql Server 2008에서 모든 문자열 열을 varchar (max) 형식으로 선언하면 성능이 저하됩니까?
모든 SQL Server 2008 문자열 열을 varchar (max)로 만드는 데 문제가 있습니까? 허용되는 문자열 크기는 응용 프로그램에서 관리합니다. 데이터베이스는 내가 제공 한 것만 유지해야합니다. 실제로 들어가는 데이터의 크기에 관계없이 Sql Server 2008에서 모든 문자열 열을 varchar (max) 형식으로 선언하면 성능이 저하됩니까?
답변:
를 사용 VARCHAR(MAX)
하면 기본적으로 SQL Server에 "가장 잘 보이는 방법으로 값을이 필드에 저장"하는 것이므로 SQL Server는 값을 일반 VARCHAR
또는 LOB (대형 개체) 로 저장할지 여부를 선택합니다 . 일반적으로 저장된 값이 8,000 바이트 미만이면 SQL Server는 값을 일반 VARCHAR
유형 으로 처리합니다 .
저장된 값은 컬럼들이 다른 LOB 유형과 똑같이, LOB 페이지에있는 페이지를 유출 할 수 (너무 큰 경우 text
, ntext
과 image
) -이 추가적인 페이지에 저장된 데이터를 읽기 위해 필요한 읽기 발생하는 경우 그러나 이것은 저장된 값이 너무 큰 경우에만 발생합니다 .
실제로 SQL Server 2008 이상에서는 데이터가 고정 길이 데이터 형식 (예 :)을 사용하더라도 추가 페이지로 오버플로 될 수 VARCHAR(3,000)
있지만 이러한 페이지를 행 오버플로 데이터 페이지라고하며 약간 다르게 처리됩니다.
짧은 버전 : 사용의 어떤 단점이없는 스토리지 관점에서 VARCHAR(MAX)
이상 VARCHAR(N)
일부가 N
.
(이는 다른 가변 길이 필드 유형 NVARCHAR
및 VARBINARY
) 에도 적용됩니다.
인덱스의 너비는 900 바이트를 초과 할 수 없습니다. 따라서 인덱스를 만들 수 없습니다. 데이터가 900 바이트 미만이면 varchar (900)을 사용합니다.
이것은 한 가지 단점입니다.
Simon Sabin은 얼마 전에 이것에 대한 게시물을 썼습니다. 지금 당장 잡을 시간이 없지만 기본적으로 varchar (max)를 사용하면 안된다는 결론을 내렸기 때문에 검색해야합니다.
편집 됨 : Simon이 varchar (max)에 대한 몇 가지 게시물을 받았습니다. 아래 주석의 링크는 이것을 아주 잘 보여줍니다. 나는 가장 중요한 일이라고 생각 http://sqlblogcasts.com/blogs/simons/archive/2009/07/11/String-concatenation-with-max-types-stops-plan-caching.aspx , 효과에 대한 어떤 이야기 계획 캐싱에서 varchar (max)의. 일반적인 원칙은 조심하는 것입니다. 최대 값이 필요하지 않은 경우 최대 값을 사용하지 마십시오. 8000 자 이상이 필요한 경우 확실합니다.
이 질문에 대해 특별히 언급하지 않은 몇 가지 사항이 있습니다.
왜 varchar(8000)
모든 곳 에서가 아닌지에 대한 내 대답에는 몇 가지 다른 이유가 포함되어 있습니다 .
앞서 비슷한 질문을했습니다. 흥미로운 답변을 받았습니다. 여기에서 확인 하세요 한 사람이 넓은 열을 사용하는 것의 단점에 대해 이야기하는 사이트가 있었지만 응용 프로그램에서 데이터가 제한되어 있으면 내 테스트에서 반증했습니다. 열에 인덱스를 만들 수 없다는 사실은 항상 인덱스를 사용하지 않을 것임을 의미합니다 (개인적으로는 그다지 많이 사용하지는 않지만 그 점에서 약간 순수 주의자입니다). 그러나 저장되어 있지 않다는 것을 알고 있다면 그렇게 나쁘다고 생각하지 않습니다. varchar (max)가 포함 된 레코드 집합 (또는 char 또는 varchar 인 넓은 열)에서 열에 대해 정렬을 수행하면 성능이 저하 될 수 있습니다. 인덱스로 해결할 수 있지만 (필요한 경우) varchar (max)에 인덱스를 넣을 수는 없습니다. 미래에 당신의 칼럼을 증명하고 싶다면, 왜 그것들을 합리적인 것에 두지 않는 것이 좋습니다. 예를 들어 이름 열은 최대 대신 255 자입니다.
모든 열에서 varchar (max)를 사용하지 않는 또 다른 이유가 있습니다. 같은 이유로 (잘못된 소프트웨어 또는 사용자 항목으로 인한 정크로 테이블을 채우는 것을 방지하기 위해) 검사 제약 조건을 사용하여 의도 한 것보다 훨씬 많은 데이터를 추가하는 잘못된 프로세스로부터 보호하고 싶습니다. 예를 들어, 누군가 또는 무언가가 City 필드에 3,000 바이트를 추가하려고 시도하면 무언가 잘못되었다는 것을 확실히 알 수 있으며 가능한 한 빨리 디버그하기 위해 프로세스가 중단되는 것을 중지하고 싶을 것입니다. 또한 3000 바이트 도시 이름은 유효하지 않을 수 있으며 사용하려고하면 보고서 등을 엉망으로 만들 수 있음을 알 수 있습니다.
이상적으로는 필요한 것만 허용해야합니다. 특정 열 (예 : 사용자 이름 열)의 길이가 20자를 넘지 않는 것이 확실한 경우 VARCHAR (20) 대 VARCHAR (MAX)를 사용하면 데이터베이스가 쿼리 및 데이터 구조를 최적화 할 수 있습니다.
MSDN에서 : http://msdn.microsoft.com/en-us/library/ms176089.aspx
Variable-length, non-Unicode character data. n can be a value from 1 through 8,000. max indicates that the maximum storage size is 2^31-1 bytes.
이 열에 대해 2 ^ 31-1 바이트에 가까워 질 것입니까?