SQL Server에서 varchar (MAX) 및 TEXT 사용


196

방금 VARCHAR(MAX)2GB에 가까운 char 데이터를 저장할 수있는 TEXT데이터 형식이 SQL Server 2005 및 Next SQL SERVER 버전 의 데이터 형식을 대체하는 것이 좋습니다 .

열 내부에서 문자열을 검색하려면 어떤 작업이 더 빠릅니까?

  1. 열에 LIKE대해 절을 사용 VARCHAR(MAX)합니까?

    WHERE COL1 LIKE '%search string%'

  2. TEXT열을 사용 하여이 열에 전체 텍스트 색인 / 카탈로그 를 넣은 다음 CONTAINS절을 사용하여 검색 합니까?

    WHERE CONTAINS (Col1, 'MyToken')


1
이 게시물도 도움이됩니다. stackoverflow.com/questions/564755/…
Jake

25
해당 게시물에서 가장 중요한 언급에 대한 링크입니다 MSDN 문서를 보여주는 TEXTNTEXT(과 IMAGE)되지 않습니다.
Brian

링크를보십시오 : stackoverflow.com/q/28980502/1805776
vicky

답변:


316

VARCHAR(MAX)유형은의 대체품입니다 TEXT. 기본적인 차이점은 TEXT형식은 항상 데이터를 Blob에 저장하는 반면, VARCHAR(MAX)형식은 8k 제한을 초과하지 않는 한 데이터를 행에 직접 저장하려고 시도하고이 시점에서 데이터를 Blob에 저장한다는 것입니다.

LIKE 문 사용은 두 데이터 유형간에 동일합니다. 추가 기능은 VARCHAR(MAX)당신이 또한 함께 사용할 수 있다는 것입니다 제공 =GROUP BY기타로 VARCHAR열 수 있습니다. 그러나 많은 데이터가있는 경우 이러한 방법을 사용하면 큰 성능 문제가 발생합니다.

LIKE검색에 사용해야하는지 또는 전체 텍스트 인덱싱을 사용해야하는지 및 CONTAINS. 이 질문은 VARCHAR(MAX)또는에 관계없이 동일 TEXT합니다.

많은 양의 텍스트를 검색하고 성능이 핵심이라면 전체 텍스트 색인을 사용해야합니다 .

LIKE 구현하기가 간단하고 소량의 데이터에 적합하지만 인덱스를 사용할 수 없기 때문에 대용량 데이터의 성능이 매우 떨어집니다.


12
나는 그것이 8k의 페이지에, 더 큰 경우에는 페이지에 저장할 것이라는 것을 몰랐다. 매우 시원합니다.
Brain2000

3
마지막 줄이 부분적으로 잘못되었습니다. 와일드 카드가 검색되는 문자열의 시작 부분에있는 경우 LIKE는 인덱스 만 사용할 수 없습니다.
SouravA

1
데이터가있는 기존 테이블에서 텍스트에서 varchar (max)로 필드를 변경해도 문제가 없습니까?
user1531040

17

큰 텍스트의 경우 전체 텍스트 인덱스훨씬 빠릅니다. 그러나 전체 텍스트 색인 varchar(max) 도 가능합니다.


16

텍스트 필드를 텍스트에서 varchar로 변환하지 않으면 텍스트 필드를 검색 할 수 없습니다.

declare @table table (a text)
insert into @table values ('a')
insert into @table values ('a')
insert into @table values ('b')
insert into @table values ('c')
insert into @table values ('d')


select *
from @table
where a ='a'

오류가 발생합니다.

The data types text and varchar are incompatible in the equal to operator.

이것은 그렇지 않습니다 :

declare @table table (a varchar(max))

흥미롭게도 LIKE여전히 작동합니다. 즉

where a like '%a%'

11
랜덤 다운 보트를 말하면 +1! 사람들이 나를 절제하고 의견이 없을 때 나를 미치게한다. 그들은 정말로 생명을 얻어야한다.
Tom Stickel

3
그가 공감 한 이유 는 기술적 인 질문에 대답 할 때 가져야 할 정당한 주장이 아니기 때문에 내가 기억하는 것 입니다. 우리가 사용해야하는 이유를 firgure 시도 (지금 나 같은) 사람에 대해 생각 varchar(n)하거나 text,이 답을 극복. 전문적인 환경에서 모호한 진술로 논쟁하는 것이 문제 해결에 도움이 될 것이라고 생각하십니까? StackOverflow의 모든 게시물은 수천 명의 사람들이 볼 수 있도록 만들어졌습니다.
Anwar

3
@ Zeratops lol,이 답변은 6 세입니다, 나는 그것을 쓸 때 다소 녹색이었습니다. 나는 그 말을 더 정리하기 위해 말을 정리했다.
DForck42 5

9
  • 기본 정의

TEXTVarChar(MAX)2147483647 비 유니 코드 문자 (: 2기가바이트 즉, 최대 저장 용량 인)의 최대 저장할 수 있습니다 유니 코드가 아닌 큰 변수 길이 문자 데이터 유형입니다.

  • 어느 것을 사용해야합니까?

에 따라 MSDN 링크 마이크로 소프트는 텍스트 데이터 유형을 사용하지 않는 것이 제안되고 이는 SQL Server의 이후 버전에서 제거 될 예정입니다. Varchar (Max)는 Text 데이터 형식 대신 큰 문자열 값을 저장하기 위해 제안 된 데이터 형식입니다.

  • In-Row 또는 Out-of-Row 스토리지

(A)의 데이터 Text형식 열이 밖으로의 열 저장 별도 LOB 데이터 페이지이다. 테이블 데이터 페이지의 행에는 실제 데이터가있는 LOB 데이터 페이지에 대한 16 바이트 포인터 만 있습니다. Varchar(max)유형 열의 데이터는 8000 바이트 이하인 경우 행에 저장됩니다. Varchar (max) 열 값이 8000 바이트를 넘으면 Varchar (max) 열 값은 별도의 LOB 데이터 페이지에 저장되며 행에는 실제 데이터가있는 LOB 데이터 페이지에 대한 16 바이트 포인터 만 있습니다. 따라서 In-RowVarchar (Max)는 검색 및 검색에 적합합니다.

  • 지원 / 지원되지 않는 기능

텍스트 유형 열에서는 작동하지 않지만 VarChar (Max) 유형 열에서는 작동하는 일부 문자열 함수, 연산자 또는 구문입니다.

  1. = VarChar (Max) 유형 열의 연산자와 동일
  2. VarChar (Max) 유형 열의 그룹 별 절

    • 시스템 IO 고려 사항

VarChar (Max) 유형 열 값은 저장할 값의 길이가 8000 바이트를 초과하거나 행에 공간이 충분하지 않은 경우에만 행 외부에 저장됩니다. 그렇지 않으면 저장됩니다. 그것은 행에있다. 따라서 VarChar (Max) 열에 저장된 대부분의 값이 크고 행 외부에 저장된 경우 데이터 검색 동작은 텍스트 유형 열과 거의 유사합니다.

그러나 VarChar (Max) 유형 열에 저장된 대부분의 값이 행에 저장하기에 충분히 작은 경우. 그런 다음 LOB 컬럼 값이 포함되지 않은 데이터를 검색하려면 LOB 컬럼 값이 비 LOB 컬럼 값이 저장된 동일한 데이터 페이지에 행에 저장되므로 더 많은 수의 데이터 페이지를 읽어야합니다. 그러나 선택 쿼리에 LOB 열이 포함 된 경우 텍스트 유형 열과 비교하여 데이터 검색을 위해 읽을 페이지 수가 더 적습니다.

결론

좋은 성능 VarChar(MAX)보다는 데이터 형식을 사용하십시오 TEXT.

출처


5

사용하는 경우 MS 액세스 (2003 같은 특히 이전 버전)를 사용하도록 강요 TEXTMS 액세스가 인식하지 않는 한 SQL Server에서 데이터 유형을 nvarchar(MAX)반면, Access에서 메모 필드로 TEXT메모 필드로 인식되고 있습니다.

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