2012-07-10 5 views
0

다음과 같은 딜레마가 여러 번 발생했으며 다른 사람들이이 문제를 어떻게 해결했는지 또는 상황을 해결할 수있는 표준 방법이 있는지에 관심이 있습니다.SQL 서버에서 매우 넓은 테이블을 처리하는 방법은 무엇입니까?

일부 도메인에서는 당연히 매우 넓은 테이블을 고려하게됩니다. 예를 들어 수년에 걸쳐 진화하는 시계열 조사를 예로 들어 보겠습니다. 이러한 조사는 수천 가지가 아니라해도 수백 가지의 변수를 가질 수 있습니다. 전형적으로 수천 또는 수만 행의 행이 있지만 일반적으로 그렇습니다. 이러한 결과 집합을 테이블의 각 열이 테이블의 열에 해당하는 테이블로 간주하는 것은 당연한 일입니다. 그러나 SQL Server에서는 적어도 하나는 1024 개의 (희소가 아닌) 열로 제한됩니다.

  1. 이 말의 열, ResponseId, VariableName으로 하나의 테이블에 여러 개의 테이블
  2. 물건을 데이터를 통해 각 레코드를 배포에

    확실한 해결 방법은 ResponseValue

수 2 있습니다. 나는 여러 가지 이유로 (쿼리하기 어렵고 차선의 스토리지 등) 여러 가지 이유로 매우 나쁘다고 생각합니다. 그래서 첫 번째 선택이 내가 볼 수있는 유일한 실행 가능한 옵션입니다. 이 선택 사항은 아마도 쿼리 할 가능성이있는 열을 같은 테이블에 그룹화하여 향상시킬 수 있지만 실제로 데이터베이스를 실제로 사용할 때까지는 알 수 없습니다.

그럼, 기본적인 질문입니다.이 상황을 처리하는 더 좋은 방법이 있습니까?

+0

'xml' 데이터 유형을 사용하면 더 적은 수의 데이터로 그룹화 할 수 있습니다. – HABO

답변

1

단일 테이블 인 것처럼 테이블 앞에보기를 배치 할 수 있습니다. 장점은 나중에 쿼리를 변경하지 않고도 스토리지를 재정렬 할 수 있다는 것입니다. 단점은 뷰를 통해 기본 테이블을 수정할 수 있다는 것입니다. 필요한 경우 자주 사용하는 수정을 위해 내장 프로 시저를 사용하여이를 완화 할 수 있습니다. 시간 시리즈 설문 조사의 유스 케이스를 기반으로하면 삽입 및 선택이 업데이트 또는 삭제보다 훨씬 빈번하게 발생하므로 나중에 상황을 재구성해야하는 경우 클라이언트의 업데이트없이 유연하게 유지할 수있는 실용적인 방법 일 수 있습니다.

+0

그러나보기도 1024 열로 제한되지 않습니까? 그렇지 않으면 좋은 방법이라고 생각합니다. – 3Sphere

+0

넓은 테이블이 30,000 개의 열을 허용하고보기의 열 수에 대한 명시적인 제한이 표시되지 않는다면 적어도 시도해 볼만한 가치가 있다고 말할 수 있습니다. http://msdn.microsoft.com/en-us/library/ms143432.aspx. 또 다른 가능성은 사용자가 이해할 수있는 방식으로 파티션을 만들고 여러 개의보기를 만들고 나중에 다시 구성해야하는 경우 여러 개의보기가 여러 개의 테이블에 계속 표시 될 수 있습니다. 이상적인 것은 아니지만 사용 방법에 따라 테이블에 직접 액세스하는 것보다 낫습니다. –

1

흠 정말로 당신이 무엇을할지는에 달려 있습니다. 테이블을 그대로 유지하려면 (아마도 OLAP 또는 데이터웨어 하우스 용입니다) 적절한 인덱스를 사용하는 것이 좋습니다. 또한 더 자주 선택되는 열을 기반으로 색인 인덱스를 사용할 수도 있습니다. 더 자주 검색되는 행을 기반으로 필터 된 인덱스를 사용할 수도 있습니다. 예를 들어, 테이블에 수십억 개의 레코드가 있다면, 테이블도 분할 할 수 있습니다.

여러 테이블에 테이블을 저장하려면 큰 테이블을 작은 테이블로 나누기 위해 적절한 정규화 기술을 사용합니다 (최대 3NF 또는 3.5NF). 큰 테이블에 대한 데이터를 저장하기 위해 당신의 첫 번째 방법 인 정규화를 사용할 것입니다.

0

이것은 오래된 주제이지만 해결을 위해 현재 작업 중입니다. 위의 답변 중 어느 것도 실제로 우리가 찾은 해결책만큼 많은 이점을 제공하지 않습니다.

이전에는 와이드 테이블을 사용하는 것이 실제로 문제가되지 않는다고 생각했습니다. 이것을 분석하는 데 시간을 소비 했으므로 빛을 보았고 삽입/업데이트에 드는 비용이 실제로 통제에서 벗어 났음을 알았습니다.

위의 John이 설명한 것처럼 솔루션은 실제로 응용 프로그램에 일관성있는 스키마를 제공하기 위해 VIEW를 만드는 것입니다.어떤 재 설계의 문제점 중 하나는 이전의 넓은 테이블을 참조하는 수천 또는 수백만 줄의 코드가있을 수 있으며 이전 버전과의 호환성을 제공 할 수 있다는 것입니다. 요한은 우리가 처음 발견했다 그러나 문제에 암시로

뷰는 업데이트와 인서트에 사용할 수 있습니다 당신은 수백 개의 컬럼을 가질 수있다 myWideTable의 예를 가지고 당신은 열 amyWideTable_a이 분할하려는 경우 열 x, yzbcmyWideTable_b는 만 열 a을 설정하는 뷰에 삽입은 당신이 나중에 레코드를 업데이트하고 싶은 myWideTable.z을 설정할 때이 문제가 될 myWideTable_a

에 대한 레코드를 삽입합니다 이것은 실패 할 것이다.

우리가 채택하고있는 솔루션과 성능 테스트에서는 뷰 삽입에 항상 '대신'트리거가있어 분할 테이블에 항상 삽입하여 뷰를 계속 업데이트하거나 뷰에서 읽을 수 있습니다.

삽입시이 트리거를 사용하면 넓은 테이블이 열려있는 것보다 더 많은 오버 헤드를 제공하는지 여부에 대한 질문은 각 분할 테이블의 열에 대한 후속 쓰기를 개선한다는 것이 확실합니다.

+0

우리에 대한 후속 성능 테스트 결과,이 접근 방식은 "넓은"테이블을 유지하는 것보다 느립니다. 우리 테이블의 'only'테이블에는 약 200 개의 컬럼이 있습니다. 원래 게시물에 언급 된 30,000 개가 아닙니다. 1,000 개 이상의 열에 접근하면 다시 방문 할 가치가 있습니다. – JLo

관련 문제