2017-01-12 1 views
1

SQL Server 2014를 사용하고 있습니다. 필자는 항상 500 개 이상의 열이있는 여러 개의 테이블을 만들고 있습니다.희박한 열 크기 제한 해결 방법

그래서 열의 수가 1024를 초과 할 경우 문제가되지 않도록 스파 스 열을 만들었습니다.

이 크기 8710의 스파 스 데이터가 행을 만들 수 없습니다 8023.

의 최대 허용 스파 스 데이터 크기보다 큰 내가 알고는 SQL 서버 만 허용 : 이제 새로운 문제가있다 8Kb의 데이터가 연속적으로 저장되는데, 나는 이것을 해결하기 위해 무엇이 필요한지 알아야합니다. No SQL (Mongodb)으로 옮길 계획이 필요한 경우 스토어드 프로 시저를 변환 할 때 얼마나 많은 영향을 미치게 될 것입니다.

답변

0

일반 테이블의 최대 열 수는 1024입니다. 넓은 (스파 스) 테이블의 최대 열 수는 30,000입니다. 스파 스 열은 대개 열이 많을 때 사용되지만 대부분이 NULL입니다.

어쨌든 limit of 8060 bytes per row이 있으므로 스파 스 열이 도움이되지 않습니다.

종종 테이블에 천개의 열이있는 것은 데이터베이스 디자인 및 정규화에 문제가 있음을 나타냅니다.

이 1000 개의 값을 관련 테이블의 행이 아닌 열로 사용해야한다면 테이블을 세로로 분할하는 것이 유일한 해결 방법입니다.

예를 들어 ID (기본 키) 열과 1000 개의 다른 열이있는 Table1이 있습니다. 이것을 Table1Table2으로 분할하십시오. 각각은 ID을 기본 키로, 각각 500 개의 컬럼을 갖습니다. 테이블은 외부 키 제한 조건을 사용하여 1 : 1로 링크됩니다.

+0

동의하지만, 지금은 테이블에 863 개의 열만 있습니다. 하지만 그것은 오류를 던지고있다. – user2956568

+0

당신이 치는 한도는 열의 수는 아니지만 행당 8060 바이트입니다. 내가 생각할 수있는 유일한 해결 방법은 행 당 바이트 수가 적은 여러 테이블로 테이블을 세로로 분할하는 것입니다. –

+0

시간과 노력으로 너무 비쌉니다. 또는 테이블을 nosql 데이터베이스로 이동하고 SQL 저장 프로 시저를 사용할 수있는 방법이 있습니까? – user2956568

0

사용되는 데이터 유형과 행의 데이터 양이 null 인 경우 스파 스 열의 효과가 결정됩니다. 테이블의 모든 필드에 데이터가 채워지면 실제로 이러한 행을 저장하는 데 더 많은 오버 헤드가 발생하므로 해당 최대 페이지 크기를 더 빨리 초과하게됩니다. 그렇다면 스파 스 열을 사용하지 마십시오.

정적 데이터 유형에서 가변 길이 데이터 유형 (varchar, nvarchar, varbinary)으로 변환 할 수있는 데이터의 수를 확인하십시오. 가변 길이 필드를 오버플로 페이지에 넣을 수 있기 때문에 페이지에서 몇 가지 추가 공간을 구입할 수 있지만 오버플로 페이지에 대한 포인터의 오버 헤드는 24 바이트입니다. 나는 당신이 스파 스 컬럼이 30K 컬럼을 저장할 수 있다고 생각하고 있었다고 생각합니다. 이것은 컬럼의 대부분이 널인 넓은 테이블을 가지고있는 상황 일뿐입니다.

MongoDB는 최소한 리팩토링을하지 않아도 답변을 얻지 못할 것입니다. 기존 저장 프로 시저를 활용할 수 없습니다. 가장 적합한 도구 일지 모르지만 MongoDB로 이동할 때 고려해야 할 사항이 많이 있습니다. JSON 문서처럼 관계형 구조에서 데이터를 지속하지 않는 한 데이터 액세스 계층을 다시 작성해야합니다. 나는 그것이 사실이 아니라고 생각한다.

나는 당신이 넓은 테이블을 가지고 있고 밀도가 높다고 가정하고 있습니다 ... 여기에 대한 가정을 토대로 제 추천이 있습니다.

블라디미르 제안대로 테이블을 분할하지만이 테이블을 모두 하나로 결합하여 하나의 테이블처럼 보이게하는보기를 만듭니다.이제 당신은 전에했던 것과 같은 구조를 가지고 있습니다. 그런 다음 트리거 대신 대신 트리거를 뷰에 추가하여 테이블을 업데이트하십시오. 이것은 코드의 주요 리팩토링을하지 않고도 원하는 것을 얻을 수있는 방법입니다. 트리거에 추가해야하는 코드가 있지만 작성하기가 쉽고 코드를 작성하지 않았지만 이후에이 작업을 수행 한 모든 뷰에 대한 코드를 생성하는 스크립트를 작성한 경험이 많습니다 그것은 반복적이었다.