2010-03-11 3 views
6

조인에 관한 질문. 나는 약 30 개의 들판이있는 테이블을 가지고 있는데, 나는이 들판 중 10 개의 테이블을 저장할 두 번째 테이블을 만들 생각을하고있었습니다. 그런 다음 주 데이터에 연결합니다. 두 번째 테이블에 저장할 계획 인 10 개의 필드는 직접 쿼리되지 않으며 첫 번째 테이블의 데이터에 대한 일부 설정입니다. 같은SQL Server 2008, 가입 또는 가입하지 않습니까?

뭔가 :

Table 1 
Id 
Data1 
Data2 
Data3 
etc ... 

Table 2 
Id (same id as table one) 
Settings1 
Settings2 
Settings3 

이 나쁜 해결책인가? 테이블 하나만 사용해야할까요? 성능에 미치는 영향은 얼마나됩니까? 표 1의 모든 항목에는 표 2에 항목이 있습니다.

작은 업데이트가 순서에 있습니다. 대부분의 데이터 필드는 varchar 유형이고 그 중 2 개는 텍스트 유형입니다. 색인 생성은 어떻게 처리됩니까? 내 계획은 2 개의 데이터 필드, 전자 메일 (varchar 50) 및 작성자 (varchar 20)를 인덱싱하는 것입니다. 그리고 표 1의 모든 레코드는 표 2의 레코드를 갖습니다. 대부분의 설정 필드는 비트 유형으로 약 80 %입니다. 나머지는 int와 varchar의 혼합입니다. varchars는 null 일 수 있습니다.

답변

4

이것은 vertical partitioning으로 알려져 있으며 합법적 인 전략입니다. 다음과 같은 이유로이 작업을 수행 할 수 있습니다.

  • 특정 열이 다른 열보다 많이 액세스되거나 변경되는 경우.
  • 한 세트의 저장 매체에 다른 컬럼을 저장하려는 경우.
  • 특정 열의 업데이트에 대한 응답으로 실행할 필요가없는 확장 트리거가있는 경우.

JOIN을 통해 액세스 할 때 성능에 약간의 영향이있을 수 있지만 구성 요소 테이블 중 하나만 액세스해야하는 경우 성능이 향상 될 수 있습니다.

0

Do 테이블 1과 2의 행 수가 동일합니까? 즉, 테이블 1의 모든 행에 테이블 2의 해당 행이 있습니까? 그렇다면 조인이 불필요하므로 선택 항목으로 원하는 열을 필터링 할 수 있습니다.

조인은 표 2의 행이 표 2의 1 행 이상인 경우에만 유용합니다. 여러 행의 데이터에 적용되는 설정 행입니다.

편집 : 내 질문은 이미 원래 게시물의 편집 내용에 의해 답변되었습니다. 조인이 필요 없으며 퍼포먼스에 좋지 않은 영향을 줄 것이라고 말하고 싶습니다.

4

이것은 테이블 1의 모든 행에 테이블 2의 행 (모든 행에 설정이 있음)과 이러한 설정 중 몇 개가 정기적으로 NULL인지 여부에 따라 달라집니다.

모든 설정 (또는 거의 모든 설정)을 정기적으로 사용하고 정기적으로 사용하는 경우 동일한 테이블에 배치하는 것이 좋습니다.

또한 참조하는 열의 수가 극단적이지 않으므로 필드를 사용하는 경우 조인을 피하는 단일 테이블을 사용하면 좋습니다.

1

데이터가 함께 있으면 함께 보관하십시오.

기본 테이블 데이터없이 설정을 이해하고 일대일로 설정하면 (즉, table1의 한 행에 table2가 하나만 있음) 기본 테이블에 추가해야합니다.

1

당신이 솔루션은 나쁘지는 않지만 다음과 같은 사항을 고려 : 널 (null) 열 개 수와의 많은 상점을 포함

  1. 표는 설정을 저장하려면 다른 테이블
  2. 를 제작하는 기호입니다, 예를 들어 필드, primarykeyid, foreignkeyid, settingname, settingvalue를 갖는 테이블을 생성하는 것과 같이 null을 저장하지 않고 원하는 수의 설정을 저장할 수있는 디자인을 생성하십시오. 2에서 설정 이름의 머리를 저장하고 있지만 int 또는 tiny int를 사용하면 훨씬 더 잘 수행됩니다.

희망이 방법 당신에게 인덱스에 추가하여,

0

필드, 주파수 사용의 유형의 크기 (선택, 업데이트 등) 및 테이블 (행) 모든 문제의 크기를하는 데 도움이 그것.

일반적으로 한 테이블의 데이터 하위 집합이 매우 일반적으로 표시되고 (목록에서) 두 번째 하위 집합을 보거나 편집하는 데 시간이 많이 걸리거나 매우 큰 필드 (예 : varchar (최대)).

그러나 데이터가 항상 함께 표시되는 경우 이는 갈 길이 아닙니다. 따라서 첫 번째 테이블을 읽을 때마다 두 번째 테이블에서 해당 설정을 읽어야하므로이 길로 가지 마십시오.

업데이트 : 인덱스와 거의 모든 설정이 고정 된 크기 (비트)라는 사실을 고려할 때, 나는 하나의 테이블로 만들 것입니다. 전체 테이블없이 하위 집합 쿼리가 필요한 경우 테이블을 분할하는 대신 포함 인덱스를 고려할 수 있습니다.

0

데이터 테이블과 동시에 설정 테이블을 정기적으로 쿼리하는 경우 단일 테이블로 설정해야합니다. 각 데이터 세트를 개별적으로 쿼리하면 데이터 세트를 따로 보관하는 것이 유용 할 수 있습니다.

모든 조인에서 성능이 저하되지만 테이블을 사용하는 방법을 살펴보고 싶을 수도 있습니다. 동시에 그들을 필요로하는 경우, 그들을 함께 유지하는 것이 가장 좋습니다. 그렇지 않으면 자주 미래에 자주 사용 계획을 세우지 않는 한 그들을 분해 할 수 있습니다.