SQL Server의 varchar 크기 조정에 대한 현재 모범 사례는 무엇입니까?


12

스토리지 및 성능 측면에서 varchar 열의 크기를 결정하는 가장 좋은 방법을 이해하려고합니다.

성능
내 연구에서, 그것은 보인다varchar (max)는 실제로 필요한 경우에만 사용해야합니다. 즉, 열에 8000 자 이상을 수용 해야하는 경우 인덱싱이 부족하기 때문입니다 (일반적으로 varchar 필드에 대한 인덱싱이 약간 의심 스럽지만 DB 원칙에 익숙하지는 않습니다. ) 및 압축 (스토리지에 대한 추가 우려) 사실, 일반적으로 사람들은 varchar (n) ...을 수행 할 때 필요한 것만 사용하는 것이 좋습니다. 그러나 엔진은 표시된 실제 크기의 절반을 데이터의 평균 실제 크기의 추정치로 사용한다고 언급되었습니다. 이것은 데이터에서 평균 크기가 무엇인지 결정하고 두 배로 늘리고 n으로 사용해야 함을 의미합니다. 가변성이 매우 낮지 만 0이 아닌 데이터의 경우 이것은 최대 크기보다 2 배 큰 크기를 의미합니다. 많은 것처럼 보이지만 그렇지 않을 수도 있습니다. 통찰력에 감사하겠습니다.

스토리지 인
-로우 및 아웃-아웃 스토리지의 작동 방식을 읽은 후 실제 스토리지는 실제 데이터로 제한된다는 점을 염두에두고 실제로 n의 선택은 스토리지와 거의 또는 전혀 관련이없는 것으로 보입니다. 모든 것을 담을 수있을만큼 커야합니다). varchar (max)를 사용해도 스토리지에 영향을 미치지 않아야합니다. 대신 가능한 경우 각 데이터 행의 실제 크기를 ~ 8000 바이트로 제한하는 것이 목표 일 수 있습니다. 사물에 대한 정확한 읽기입니까?

컨텍스트
일부 고객 데이터는 약간 변동하기 때문에 일반적으로 해당 열에 대해 열을 필요한 것보다 15-20 % 더 크게 만듭니다. 다른 특별한 고려 사항이 있는지 궁금합니다. 예를 들어, 나와 함께 일하는 사람은 2 ^ n-1 크기를 사용하라고 말했습니다 (나는 비록 ....

초기 테이블 생성에 대해 이야기하고 있습니다. 고객은 우리에게 새 테이블을 보내기 시작할 것이라고 말하고 샘플 데이터 (또는 첫 번째 프로덕션 데이터 세트)를 보냅니다. 데이터를 보려고 최종 테이블을보고 만듭니다. 우리는 샘플의 내용뿐만 아니라 향후 수입을 처리하기 위해 테이블을 만들고 싶습니다. 그러나 특정 행은 더 길어질 수 있으므로 채워집니다.

문제는 얼마이며 기술 지침이 있습니까?


MongoDB는 문서에 2 ^ n 디스크 할당을 사용합니다. SQL Server는이 전략을 사용하지 않습니다.
Michael Green

답변:


19

특정 데이터 유형에 관계없이 응용 프로그램이 저장하도록 요청한 내용을 저장할 수 있어야합니다. 실제로 저장 될 최대 크기보다 작은 것을 지정할 수 없습니다.

또한 여러 가지 이유로 저장 될 실제 최대 크기보다 큰 열 길이를 지정할 필요도없고 원하지도 않습니다. 쿼리 메모리 할당, 잠재적으로 최대 행 크기를 채우고 열을 추가 할 공간을 남기지 않음 미래 등

사실 가변 길이 문자열 및 이진 열에는 고정 길이 데이터 유형 (문자열 / 이진 / 숫자 / 날짜 / 등)에 대한 스토리지 영향이 없습니다 (그러나 데이터 압축 또는 SPARSE열 정의 사용을 통해 이러한 영향 중 일부는 무시 될 수 있음) 선택권). 그러나 지적한 바와 같이 스토리지에 직접적인 영향이없는 경우에도 쿼리에 필요한 메모리를 과대 평가하는 성능에 여전히 영향을 미칩니다.

현명하게 행동하십시오. 필요한 것만 사용하십시오. 가까운 장래에 열 길이를 늘려야 할 가능성이 높으면 고려할 수 있지만 크기를 줄이는 것보다 열의 크기를 확장하는 것이 더 쉽다는 점을 명심하십시오. 예, 일부 작업이 수반되지만 그 작업은 "잠재적"일 뿐이므로 크기 초과에 따른 성능 영향은 "실제"이므로 실제로는 필요한 것이 아니라 실제로 필요한 것에 따라 열을 정의하는 것이 가장 좋습니다. 미래에 필요할지도 모른다고 생각합니다. 이야기되는 많은 변화는 결코 일어나지 않으며, 종종 필요한 변화는 예측할 수 없습니다. 당신이 알고있는 것과 함께 가십시오.

대신 가능한 경우 각 데이터 행의 실제 크기를 ~ 8000 바이트로 제한하는 것이 목표 일 수 있습니다.

나는 당신이 여기에서 무엇을 얻고 있는지 확실하지 않습니다. SQL Server는 물리적으로 8000 바이트 이상으로 제한합니다. LOB 유형 사용 - VARCHAR(MAX), NVARCHAR(MAX), VARBINARY(MAX), XML, 및 사용되지 않는 TEXT, NTEXTIMAGE유형 - 그 초기 페이지 크기 제한을 넘어 허용하지만, 그 때문에의 종류에 따라 포인터 (16 바이트 이상을 배치하고, 따라 만입니다 MAX유형을 사용할 때 행 외부에 저장되는 값의 크기 ). 데이터 페이지의 실제 물리적 한계는 변경되지 않았습니다.

목표는 불완전한 값이 의미를 잃거나 다운 스트림 문제를 유발할 수 있도록 최소한의 물리적 공간을 사용하여 앱 / 비즈니스가 깨거나 자르지 않고 저장해야하는 것을 저장하는 것입니다. 12,000 문자를 저장 해야하는 경우 필요한 VARCHAR(MAX)것이므로 사용하십시오 . 전화 번호 나 우편 번호를 저장하는 경우 사용하기에 부적합하고 사용하기 VARCHAR(100)에 부적합합니다 VARCHAR(MAX).

일부 고객 데이터는 약간 변동하기 때문에 일반적으로 해당 열에 대해 열을 필요한 것보다 약간 넓게 (예 : 15-20 % 더 크게) 만듭니다. 다른 특별한 고려 사항이 있는지 궁금합니다.

모든 시스템에 변동하는 데이터가 적어도 있습니까? 사람의 이름을 저장 한 모든 시스템이 적합합니까? 이름의 길이에는 상당히 큰 차이가 있습니다. 그리고 당신은 왕자와 같은 누군가가 가서 그들의 이름을 상징으로 바꾸게되었고 이제는 길이가 다른 완전히 다른 문제가 생겼습니다. 이것은 단지 상황입니다.

그러나, 악마의 옹호자를 잠시 연기하려면 : "필요한 것보다 15-20 % 더 큰"값이 실제 필요한 값 이 아닌 방법은 무엇 입니까? 새 열을 추가하는 것에 대한 토론이 있고 누군가가 50자를 제안한다고 말한 다음 다른 사람이 말합니다. "글쎄, 20 %가 60 명이므로 60 명을 가질 수 있기 때문에 60을 해봅시다." 고객이 60을 가질 수있는 것이 사실이라면 60은 실제 필요한 값이며 항상 50은 잘못된 것입니다.

물론 다음과 같은 이유로 데이터 소스에 대한 표시가 있으면 도움이 될 것입니다.

  1. "URL"을 1024로 만들고 누군가가 1060을 필요로하는 경우 1060이되어야합니다 (유사하게 URL을 만들고 VARCHAR도메인 이름에 허용되는 유니 코드 문자를 엉망으로 만든다는 불만이있는 경우 NVARCHAR). 그러나
  2. 누군가가 그 다음, 500 문자 제한 주석 필드 1000 개 문자를 추가하고자하는 경우는 여전히 필요한 500 명 (코멘트 덜 장황 ;-) 나에게 큰 도전이 될 수있을 것이 아니라, ProductSKU더 나은 모두에 맞게 충분히 큰 수 고객의 SKU

초기 테이블 생성에 대해 이야기하고 있습니다. 고객은 우리에게 새 테이블을 보내기 시작할 것이라고 말하고 샘플 데이터 (또는 첫 번째 프로덕션 데이터 세트)를 보냅니다.이 데이터는 최종적으로 데이터를 보유하기 위해보고 테이블을 만듭니다. 우리는 샘플의 내용뿐만 아니라 향후 수입을 처리하기 위해 테이블을 만들고 싶습니다. 그러나 특정 행은 더 길어질 수 있으므로 채워집니다. 문제는 얼마이며 기술 지침이 있습니까?

당신은 여기서 많은 가정을하고 있습니다. 물론 일부 필드 커질 수 있습니다 . 그러나 다시는 그렇지 않을 수 있습니다. 또는 일부는 더 작아 질 수 있습니다. 일부는 비 유니 코드에서 유니 코드로 변경 될 수 있습니다 (한 번 세계가 점점 작아지고 있으며성에는 기본 ASCII / 미국 영어 문자 만 있다고 가정 할 수 없음). 또는 필드 전송을 중단 할 수 있습니다. 또는 미래에 하나 이상의 필드를 추가 할 수 있습니다. 이것과 다른 것들의 조합. 그렇다면 왜 VARCHAR열에 만 초점을 맞추고 있습니까? 현재 INT값을 보내고 1 년에서 2 년 내에 최대 값에 도달하여 BIGINT? 값이 0-5 인 "상태"필드가있는 경우 어떻게해야합니까?INT어느 쪽이 성장을 가능하게 TINYINT합니까?

안전하게 예측할 수있는 유일한 방법은 고객 데이터가 어떻게 변경 될지 예측하는 것이 올바른 것보다 더 자주 잘못 될 것이라는 것입니다. 그리고 올바른 것은 운 / 우연의 문제입니다 (행운이 아니라면 복권을 연주하십시오).

따라서 지침은 다음과 같습니다.

  1. 대답 할 수없는 질문에 답하는 데 시간과 에너지를 낭비하지 마십시오.
  2. 대신, 고객의 실제 데이터와 관련하여 가능한 많은 정보를 얻는 데 집중하고이를 활용하십시오 (예 : 데이터 중심 의사 결정 ;-).

이미 예제 데이터가 있습니다. 그러나 고객의 연락처 정보 (전화 및 / 또는 이메일)도 있다는 것을 잊지 마십시오. 연락하십시오! 데이터 사양을 요청하십시오 (시스템과 마찬가지로 현재 시스템에있는 데이터의 최대 길이는 35 일 수 있지만 시스템의 데이터 길이는으로 정의되어 VARCHAR(50)있으며 시스템은 최대 길이까지 수용 할 수 있습니다. 50). 또한, 단기 변경 계획이 있고 해당 데이터 유형 (유형 및 / 또는 크기)이 있는지 물어보십시오.


1
내가 솔로몬 동의 Aristotle2600 @ - 그러나, 당신은 좀 걸릴 수도 있습니다 내 대답 의 차이점에 대한 질문에 varchar(255)varchar(256)몇 가지 더 고려 사항을
최대 버논에게

고마워, 나는 이것이 이와 같은 것이 될 것이라는 인상을 받았으며, "필요한 것만 사용하십시오"는 훌륭한 자원 관리 관행입니다. 그러나 일부 고객 데이터는 약간 변동하기 때문에 일반적으로 열에 필요한 열을 15-20 % 더 크게 만드는 것보다 열을 조금 더 넓게 만듭니다. 다른 특별한 고려 사항이 있는지 궁금합니다. 예를 들어, 나와 함께 일하는 사람은 2 ^ n-1 크기를 사용하라고 말했습니다 (하지만 .... 증거는 없습니다.) 그러나 가능한 한 작게 유지하는 것 외에는 아무것도없는 것처럼 들립니다.
aristotle2600

1
@ aristotle2600 "2 ^ n-1"을 어떻게 적용해야할지 모르겠지만 여전히 물어봐야 할 것입니다. 이론적으로 필요한 것보다 더 큰 것을 만드는 것이 가능 합니까? 15-20 % 더 큰 크기 깨지지 않는 데 필요한 크기가 아닐까요? ;-). a) "URL"을 1024로 설정하고 누군가가 1060을 필요로하는 경우 1060이 필요하지만 b) 누군가가 1000을 추가하려면 500 자 제한 주석 필드에 문자를 입력하면 500 자만 있으면 됩니다. 사람들은 주석을 적게 입력 할 수 있지만 제품 SKU는 충분히 커야합니다.
Solomon Rutzky 2016 년

@ aristotle2600 여기에 좋은 의견을 제시하기 위해 귀하의 의견 중 일부를 질문에 추가했습니다. 나는 또한 내 답변의 끝에 물건을 추가 :)
Solomon Rutzky

답변 주셔서 감사합니다! 그렇습니다. 이름과 주소가 떨립니다. 점점 증가하는 20 % 역설에 이르기까지, 나는 당신이 무슨 뜻인지 알지만, 초기 테이블 생성에 대해 이야기하고 있습니다. 고객은 우리에게 새 테이블을 보내기 시작할 것이라고 말하고 샘플 데이터 (또는 첫 번째 프로덕션 데이터 세트)를 보냅니다.이 데이터는 최종적으로 데이터를 보유하기 위해보고 테이블을 만듭니다. 샘플의 내용뿐만 아니라 향후 수입을 처리하기 위해 테이블을 만들고 싶습니다. 그러나 특정 행은 더 길어질 수 있으므로 채워집니다. 문제는 얼마이며 기술 지침이 있습니까?
aristotle2600
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.