복붙노트

[SQL] VARCHAR에 대한 장점은 (500)를 통해 VARCHAR (8000)가있다?

SQL

VARCHAR에 대한 장점은 (500)를 통해 VARCHAR (8000)가있다?

나는 MSDN 포럼에이에 읽어했는데 여기 난 아직 명확하지 않다. 나는 이것이 올바른 생각 : 그 단점이 있으므로 (최대) 대 Varchar는, 텍스트 데이터 형식으로 저장됩니다. 그래서 수 있습니다 당신의 분야에 안정적으로 8000 자 이하가 될 것이라고 말했다. 내 데이터베이스 테이블에 BUSINESSNAME 필드처럼. 실제로, 비즈니스 이름은 아마 항상 500 자 (내 모자 나갔어 번호를 당기는) 아래에있을 것입니다. 내가 8K 글자 수에 따라 잘 가을에 걸쳐 실행하는 것이 VARCHAR 필드의 많은 것 같다.

그래서 나는 그 분야 포함 된 VARCHAR (500) 대신 VARCHAR (8000)해야한다? 나는 SQL의 이해가 무엇에서 그 둘 사이에는 차이가 없습니다. 그래서, 쉽게 인생을 만들기 위해, 나는 VARCHAR (8000)로 내 모든 VARCHAR 필드를 정의 할 것입니다. 그 어떤 단점이 있습니까?

관련 : VARCHAR 컬럼의 크기 (이 내 질문에 대답 같은 느낌하지 않았다).

해결법

  1. ==============================

    1.처리의 관점에서, 그것은 VARCHAR (500) 대 사용 VARCHAR (8000)에 차이를 만들 수 없습니다. 이 필드가 보유하고 VARCHAR 길이 그렇게해야하는 최대 길이를 정의하는 종류의 일이의 더 "좋은 연습"의입니다. 그것은 데이터 검증을 지원하는 데 사용할 수있는 뭔가. 예를 들어, 만들기 상태의 약어는 2 자 또는 5 개 또는 9 문자로 우편 / 우편 번호합니다. 이 데이터는 다른 시스템이나 필드 길이가 중요했다 사용자 인터페이스 (예를 들어, 메인 프레임 플랫 파일 데이터 세트)와 상호 작용할 때에 더 중요한 구별로 사용하지만, 요즘 나는 그것이 무엇보다 습관 같아요.

    처리의 관점에서, 그것은 VARCHAR (500) 대 사용 VARCHAR (8000)에 차이를 만들 수 없습니다. 이 필드가 보유하고 VARCHAR 길이 그렇게해야하는 최대 길이를 정의하는 종류의 일이의 더 "좋은 연습"의입니다. 그것은 데이터 검증을 지원하는 데 사용할 수있는 뭔가. 예를 들어, 만들기 상태의 약어는 2 자 또는 5 개 또는 9 문자로 우편 / 우편 번호합니다. 이 데이터는 다른 시스템이나 필드 길이가 중요했다 사용자 인터페이스 (예를 들어, 메인 프레임 플랫 파일 데이터 세트)와 상호 작용할 때에 더 중요한 구별로 사용하지만, 요즘 나는 그것이 무엇보다 습관 같아요.

  2. ==============================

    2.이 차이를 만들 수있는 한 예는 트리거 후 함께 테이블에 행 버전 정보를 추가 피하는 성능 최적화를 방지 할 수 있다는 것입니다.

    이 차이를 만들 수있는 한 예는 트리거 후 함께 테이블에 행 버전 정보를 추가 피하는 성능 최적화를 방지 할 수 있다는 것입니다.

    이 여기에 SQL 키위에 의해 덮여있다

    마찬가지로이 LOB 열 또는 잠재적하여 InRow 제한하지만 페널티를 초과 할 수 열 폭의 조합을 사용할 수있다 2,016 때문에 메모리에 최적화 된 테이블을 사용하는 경우.

    이 메모리 소비와 성능에 큰 부정적인 영향을 미칠 수

    테이블 이제까지 SSIS를 이용하여 처리되는 경우에 선언 위에 열 폭이 큰 차이를 만들 수있는 다른 경우이다. 가변 길이 (비 BLOB) 컬럼에 할당 된 메모리는 메모리 버퍼의 비효율적 사용 (예)으로 이어질 수있는 최대 길이를 선언 실행 트리의 각 행 및 열 고정 '당이다. SSIS 패키지 개발자가 소스보다 작은 열 크기를 선언 할 수 있습니다 동안이 분석은 가장 앞을 수행하고있다이 적용.

    위로 SQL Server 엔진 자체가 유사한 경우는 SORT 작업 SQL 서버에 할당하는 메모리 부여를 계산할 때하는 열은 평균 X / 2 바이트를 소비하는 것 VARCHAR (X)를 가정한다는 것이다.

    당신의 VARCHAR 컬럼의 대부분은보다 풀러 경우이 tempdb에에 유출 정렬 작업으로 이어질 수 있습니다.

    귀하의 경우 귀하의 VARCHAR 컬럼은 8000 바이트로 선언 실제로는 훨씬 적은 쿼리가 분명 비효율적 인 필요로하지 않으며, 메모리 부여를 대기로 이어질 수있는 메모리 할당됩니다보다는 내용이있는 경우.

    이 여기에 또는 아래 참조에서 SQL 워크샵 웹 캐스트 1 개 다운로드 2 부에 덮여있다.

    use tempdb;
    
    CREATE TABLE T(
    id INT IDENTITY(1,1) PRIMARY KEY,
    number int,
    name8000 VARCHAR(8000),
    name500 VARCHAR(500))
    
    INSERT INTO  T 
    (number,name8000,name500)
    SELECT number, name, name /*<--Same contents in both cols*/
    FROM master..spt_values
    
    SELECT id,name500
    FROM T
    ORDER BY number
    

    SELECT id,name8000
    FROM T
    ORDER BY number
    

  3. ==============================

    3.그렇다 모범 사례에서 (BBlake의 대답)

    그렇다 모범 사례에서 (BBlake의 대답)

  4. ==============================

    4.조금 덜 분명하고 나중에 좀 잡을 수있는 큰 열 몇 가지 단점이 있습니다 :

    조금 덜 분명하고 나중에 좀 잡을 수있는 큰 열 몇 가지 단점이 있습니다 :

    일반적으로 열 너비와 보수적하려고합니다. 이 문제가 될 경우, 당신은 쉽게 요구에 맞게 그것을 확장 할 수 있습니다. 나중에 메모리 문제가 발견되면 넓은 열 이후 감소하는 것은 데이터의 손실없이 불가능 될 수 있습니다 그리고 당신은 어디서부터 시작 해야할지하지 않습니다.

    비즈니스 이름 귀하의 예제에서, 당신이 그들을 표시 할 수있는 위치에 대한 생각합니다. 정말 500 개 문자를위한 공간이 있습니까? 그렇지 않은 경우 등을 저장하기에 약간의 포인트가있다. http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States는 어떤 회사 이름을 나열하고 최대 50 자에 관한 것입니다. 그래서 열 최대 100을 사용하십시오. 어쩌면 더 80있다.

  5. ==============================

    5.이상적으로는 (500 합리적으로 크기되지 않습니다) 합리적 크기의 길이로 아래로,보다 작은 가고 싶어하고 데이터가 너무 클 수 및 유용한 오류를 보내려고 할 때 반드시 클라이언트 검증 어획량을합니다.

    이상적으로는 (500 합리적으로 크기되지 않습니다) 합리적 크기의 길이로 아래로,보다 작은 가고 싶어하고 데이터가 너무 클 수 및 유용한 오류를 보내려고 할 때 반드시 클라이언트 검증 어획량을합니다.

    VARCHAR를 실제로 사용되지 않는 공간을 데이터베이스에 공간을 예약하지 않을 동안, 나는 수 바이트보다 넓은되는 데이터베이스 행에 대한 snit을 가진 SQL Server 버전을 리콜 (정확한 수를 기억하지 않습니다) 실제로 밖으로 던지기 데이터는 적합하지 않았다 뭐든간에. 그 바이트의 특정 수는 SQL 서버의 내부 일을 위해 예약되었다.

  6. from https://stackoverflow.com/questions/2009694/is-there-an-advantage-to-varchar500-over-varchar8000 by cc-by-sa and MIT license