빈 열이 테이블에서 공간을 차지합니까?


20

매우 기본적인 정보를 담은 테이블이 있습니다. 제목과 날짜 필드 만 있습니다. varchar (4000) 인 comment 라는 필드가 있습니다. 대부분의 경우 비워 두지 만 여기에 많은 양의 데이터를 입력합니다. 이것이 정말로 나쁜 디자인입니까? 아니면 이것은 약간 비효율적입니까?

이 열에 대해 별도의 테이블을 만드는 것이 더 좋을 것이라고 가정합니다.

참고 : 이것은 SQL Server 2008입니다

여기에 이미지 설명을 입력하십시오


여러분의 의견에 감사드립니다! 나는 그것을 단순하게 유지하고 테이블에 열을 유지하고 다른 테이블에 넣지 않기로 결정했습니다. 그러나 SQL 2008에서 SPARSE 기능을 사용하여 필드에 공간이 사용되지 않았습니다.

2
궁금해서 "대부분의 시간"은 얼마입니까? 총 몇 개의 행이 있고 여기에 몇 퍼센트의 값이 있습니까? 다음을 사용 SPARSE하고 사용하지 않는 공간 / 성능 비교를 계획하고 있는지 궁금합니다 SPARSE.
Aaron Bertrand

답변:


9

더 예측 가능한 성능을 유지하고 (페이지 당 행의 변형이 크지 않도록)이 데이터를 관련 테이블에 저장하는 것이 좋습니다. 특히 데이터가 적은 시간 동안 만 채워지고 특히 검색된 경우에만 일부 쿼리. 이 값이있는 행은 NULL공간 오버 헤드에 영향을 주지만 이는 최소입니다. 더 중요한 것은 한 페이지가 두 행에만 맞고 다음 페이지가 500 행에 맞을 수있는 방법입니다. 이는 실제로 통계에 영향을 줄 수 있으며이를 분리하여 분리하여 저장하고 모든 작업에 영향을 미치지 않는 것이 좋습니다. 핵심 테이블.


12

사용하지 않을 때 최소한의 공간이 필요합니다

  • NULL 비트 맵에서 1 비트
  • 길이가 2 바이트 (NULL 일 경우 0 임)

오버 헤드가 최소화되고 최적화가 조기에 이루어집니다.

문제가 있음을 알 때까지 한 테이블에 보관하십시오. 외부 조인을 도입하여 KISS를 중단하고 데이터 쿼리시 오버 헤드를 추가합니다.

자세한 내용은 /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 를 참조 하십시오.


10

필자는 항상 필드를 채우지 않는 경우 별도의 테이블이 페이지 밀도를 개선하고 조각화를 줄이는 것이 좋습니다.

  • 데이터 페이지는 약 8000 바이트를 보유 합니다.
  • 100 바이트의 행과 4000 바이트 이상의 행이 있습니다.
  • 이 긴 행은 자체적으로 페이지에 있으며 나머지 페이지는 DB가 차지하는 "낭비 된"공간이지만 데이터를 보유하지는 않습니다.
  • 대부분의 페이지에서 레코드의 긴 필드에 데이터를 추가하면 페이지가 초과되어 나머지 레코드가있는 페이지에 대한 포인터가 생성 될 수 있습니다.

빈 페이지와 포인터가 모두 있으면 성능이 저하됩니다. 가능하면 해당 필드를 정규화하십시오.


4

이 질문은 매우 비슷합니다. 여분의 빈 열이 SQL 테이블 크기에 크게 영향을 줍니까?

대답은 예처럼 보입니다. 공간을 차지하지만 null 값이 많은 열에 대한 압축 알고리즘이 있습니다.

디자인까지는 외부 테이블을 연결하는 것이 더 깔끔한 디자인이라고 생각합니다. null 값이 빈번한 열이 있으면 데이터베이스 사용자가주의하지 않으면 실수로 null 값을 사용할 수 있으므로 데이터베이스 사용자가 더 어려워집니다. 따라서 데이터베이스를 사용하는 코드에는 오류 검사가 포함되어 있어야하며 오류가 발생합니다.


2
명시 적으로 압축 알고리즘 SPARSE은 "널 값이 많은 열"뿐만 아니라 으로 명시 적으로 정의 된 열에 만 적용됩니다 .
Aaron Bertrand

2

당신은 괜찮을 것입니다-이미 varchar 열이므로 데이터가 들어있을 때만 공간을 사용합니다. int와 같이 널 입력 가능한 고정 크기 열이 많은 경우 공간 사용에 문제가있을 수 있습니다.

다른 테이블에 넣는 한 귀찮게하지 않을 것입니다. varchar (max) 및 in / out of row 옵션 사용을 볼 수도 있습니다. 아마, 아마도 조숙 할 것입니다.


1
조기 최적화는 종종 실제 문제가 될 수 있지만 나중에 리팩토링 비용에 따라 다릅니다. 오늘 행의 1 % 만이 열에 데이터를 가지고 있고 시간이 지남에 따라 테이블이 커질 것으로 예상하는 경우 현재 테이블의 해당 데이터를 유지하면 확장 할 때 결과에만 영향을 미치는 값은 무엇입니까? 나는 조기 최적화를 피하기 위해 노력하지만 장기적인 효과를 평가할 때 중요한 점이 있습니다.
Aaron Bertrand

@Aaron Bertrand Agreed. 사람들은 여기서 성능 질문을하고 수백만 행의 앱이 있다고 생각하기 쉽고 툴킷의 모든 무기를 사용해야하며 모든 것을 염두에 두어야합니다. 반면에, 때때로 사용자는 학습 곡선의 시작에있는 것처럼 보이며 우선 순위가 낮을 수도있는 것에 시간을 투자하도록 요청하기가 어렵습니다. 또한 varchar (max)를 사용하면 효과적으로 스위치를 쓸어 넘겨 저장을 시작할 수 있습니다. 여기에 대한 실제 답변은 "정확한 답변을 제공 할 충분한 정보를 제공하지 않았습니다"라고 생각합니다.
Cade Roux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.