2012-06-07 2 views
5

데이터베이스를 설계 할 때 어떤 접근 방식이 더 좋은지 궁금합니다.수백 대 소수의 메인 테이블

나는 현재 할 수있는 조회 테이블에 대한 참조와 함께 하나의 큰 테이블 (행당 97 개의 열)을 가지고 있습니다.

일부 열을 작은 테이블로 그룹화하고 하나의 전체 행을 참조하기 위해 키 열을 추가하는 것이 성능면에서 좋지 않습니까?

+0

** ** [check here] (http://stackoverflow.com/a/10931849/1425057) ** –

답변

3

테이블을 여러 부분으로 나누면 한 행에 대해 모든 열을 가져 오기 위해 추가 조인이 필요합니다. 그러면 시간이 오래 걸립니다.

97 열은 많이, 정말하지 않습니다 - 나는 그것은 모든 데이터가 어떻게 사용되는지에 따라 달라집니다 (100)

을 넘어 길을 보았다 - 당신의 행 단지 97 열, 모든 시간, 요구가있는 경우 97 열로 - 그럼 정말 여러 테이블에 그들을 분할하는 의미가 거의 없습니다. 당신이 그에게 모든 시간이 필요하지 않은 경우

  • 하면, 별도의 테이블에 약간의 "큰"열 (같은 XML, VARCHAR(MAX) 등)을 이동할 수 있습니다 -> 다음과 같은 경우

    이 적합 할 수 있습니다 이 경우, "기본"행이 작아지고 기본 테이블이 더 잘 수행됩니다. - 여분의 큰 열이 필요하지 않는 한

  • 일부 열을 다른 테이블로 옮길 수 있습니다 항상 존재한다. '선택 사항'일 수 있으며 예 : 20 %의 행 -이 경우 해당 열이 필요하지 않은 경우의 나머지 80 %에 대해 일부 처리를 생략 할 수 있습니다.

+1

+1 : Comment1, Comment2, Comment3 ... – JeffO

+0

@marc_s와 같은 열을 제거하십시오. int가 아니라 텍스트 기반 값입니까? –

+0

@AdrianK .: SQL Server는 데이터 형식이 작을수록 작업을보다 잘 처리하며 고정 길이 형식의 오버 헤드가 적기 때문에 가변 길이에 비해 INT와 같은 고정 길이 형식을 선호합니다. –

0

관련 열을 다른 테이블로 그룹화하는 것이 좋습니다. 이렇게하면 데이터베이스의 성능은 물론 프로그래머로서의 사용 용이성이 향상됩니다. 먼저 열 사이의 모든 다른 관계를 찾아서 이러한 관계 (기본 키, 분기 키, 참조 등 사용)를 염두에두고 모든 것을 테이블로 분할하려고 시도해야합니다. 다음과 같이 다이어그램을 작성하십시오. 이 http://www.simple-talk.com/iwritefor/articlefiles/354-image008.gif 및 거기에서 가져 가라.

+0

꼭 그렇지는 않습니다! 단일 행에 여러 개의 "부분"을 갖는 것은 추가 JOIN을 의미하며 "자유"가 아닙니다. 테이블을 함께 결합하는 데 시간이 걸립니다! –

+0

@marc_s 그래, 한 셀에 대해 97 개의 열이있는 테이블을 쿼리 할 때 더 작은 테이블을 갖는 것이 훨씬 낫다. 조직적인 목적으로 플러스 (+)를 사용하는 것이 더 합리적입니다. (물론 데이터 자체에 따라 ..데이터가 모든 97 cols에 모두 관련된 경우 다음과 같은 방법으로 보관하십시오.) –

0

데이터가 비정규화된 경우가 아니면 모든 열을 동일한 테이블에 보관하는 것이 가장 좋습니다. SQL Server는 개별 테이블에서 버퍼 풀로 페이지를 읽습니다. 따라서 액세스 된 페이지가 이미 버퍼 풀에 있더라도 모든 액세스에서 조인 비용이 발생합니다. 키를 사용하여 쿼리 당 데이터의 몇 행에 액세스하면 인덱스는 동일한 테이블의 모든 열과 함께 해당 쿼리를 잘 처리합니다. 많은 수의 행 (큰 테이블의> 1 %)을 스캔하지만 97 개의 열 중 일부만 스캔하더라도 동일한 테이블에 열을 유지하는 것이 더 효과적입니다.이 테이블은 비 클러스터형 인덱스를 사용할 수 있습니다 쿼리. 그러나 데이터가 지나치게 비정규 화 된 다음 정규화 규칙을 기반으로 여러 테이블로 나누어 정규화하면 성능이 크게 향상되고 특정 데이터에만 액세스 할 수있는 쿼리를 작성할 수 있습니다 필요한 요소.