[SQL] SQL 서버의 최대 열 주위 일은 1024 8킬로바이트의 레코드 크기 제한
SQLSQL 서버의 최대 열 주위 일은 1024 8킬로바이트의 레코드 크기 제한
나는 1000 열이있는 테이블을 생성하고있다. 컬럼의 대부분은 nvarchar 유형입니다. 표하지만 경고가 생성됩니다
테이블의 열의 대부분은 이미 데이터가 (즉, 컬럼의 99 %가 데이터가). 나는 (일부 값을 갖는 모든 시작 (309) 열로 경우)가 오류를주는 310번째 후 어떤 열을 업데이트하려고 할 때 :
나는 모든 시작 (308 개) 컬럼에 데이터를 삽입하고
"LOREM의 ipsum의 당근, 강화 된 리베이트."
그때 NTEXT 데이터 형식을 사용하고 때 저를 허용하지 않는 또한 나 450 개 컬럼에 대해 있지만 NTEXT의 이상으로 업데이트하는 것입니다 수 있습니다. 나는 적어도 700 열을 업데이트해야합니다. 어떤 SQL 서버는 그렇게 할 수 없습니다. 나는 다른 테이블에 테이블의 일부 열을 이동할 수있는 시나리오가 있습니다.
사실은 내가 기존 윈도우 응용 프로그램에 대해 작동하고 있습니다. 그것은 매우 큰 Windows 응용 프로그램입니다.
사실 나는 700 개 NVARCHAR 열 데이터까지 삽입하려고하는 테이블은 런타임에 동적으로 생성됩니다. 만 어떤 경우에는 400-600 열을 삽입해야합니다. 그러나 일반적으로 내가 쉽게 처리 할 수 있어요 (100) -200 열이 필요합니다.
문제는 내가 여러 테이블에서이 테이블을 분할 할 수 있다는 것입니다. 이 구조 및 테이블 이름으로 작성된 테이블의 로트가, 즉 다른 테이블에 유지되기 때문에 이러한 구조가 100 개 이상의 테이블이 있고 그것들은 동적으로 생성되고있다. 4-5 언어 테이블을 생성하고 데이터를 조작하기 위해 (C 번호를, 자바 ..)가 사용되고 있으며, WCF, Windows 서비스 및 웹 서비스도 포함됩니다.
나는 그것이 될 것이라고 생각하지 않는다 그래서 쉽게 테이블과 분할 후 데이터 테이블을 조작 할 수 있습니다. 나는 테이블을 분할하는 경우 그것은 구조적인 변화를 많이 필요로한다.
그래서이 문제를 해결하는 가장 좋은 방법 일 것입니다 무슨 저를 제안 해주십시오.
또한 같은 스파 스 열을 사용하는 것을 시도했다 :
Create table ABCD(Id int, Name varchar(100) Sparse, Age int);
또한 ColumnStoreIndex 생각했지만 내 목적은 해결되지 않습니다.
스파 스 열이 나 테이블에 대해 3000 열을 만들 수뿐만 아니라 페이지 크기에 저를 제한합니다.
일부 임시 테이블을 사용하거나 SQL 서버 개체의 다른 유형을 사용하여 얻을 수있는 방법이 있습니까?
해결법
-
==============================
1.SQL 서버 최대 열 제한
SQL 서버 최대 열 제한
짧은 문자열 열 8,000 당 바이트
GROUP BY 당 바이트, 8060 BY ORDER
행 8,060 당 바이트
인덱스 키 (16) 당 열
외래 키 (16) 당 열
기본 키 (16) 당 열
nonwide 테이블 1,024 당 열
넓은 테이블 30,000 당 열
SELECT 문 4,096 당 열
INSERT 문을 4096 당 열
UPDATE 문 당 열 (와이드 테이블) 4096
당신이 행 당 8,060 바이트를 초과 할 사용자 정의 유형 컬럼 VARCHAR, NVARCHAR, VARBINARY,의 sql_variant 또는 CLR을 결합 할 때 다음 사항을 고려 :
SQL 서버는 여전히 페이지 당 8킬로바이트의 제한을 유지하기 때문에 8,060 바이트 행 크기 제한을 능가하는 성능에 영향을 줄 수 있습니다. VARCHAR, NVARCHAR, VARBINARY, SQL_VARIANT 또는 CLR 사용자 정의 형 컬럼의 조합이 제한을 초과하면 24을 유지하면서 SQL 서버 데이터베이스 엔진은 ROW_OVERFLOW_DATA 할당 부에서 다른 페이지로 큰 폭으로 기록 열을 이동 원래 페이지 바이트 포인터. 다른 페이지로 큰 기록을 이동하면 기록이 업데이트 작업을 기반으로 연장되는 동적으로 발생합니다. Lite 버전 기록은 기록이 발생할 수 있음을 업데이트 작업은 IN_ROW_DATA 할당 부에서 일본어 페이지로 다시 이동한다. 이러한 레코드는 동기 비동기 대신의 처리 있기 때문에, 질의 및 다른 종류의 선택 동작을 수행하거나 행 오버플 감속 데이터 처리 시간을 포함하는 큰 레코드에 결합한다.
따라서, 여러 VARCHAR, NVARCHAR, VARBINARY,의 sql_variant 또는 CLR 사용자 정의 형식 열이있는 테이블을 설계 할 때, 흘러 가능성이 행의 비율이 오버 플로우 데이터가 가능성이 조회되는 빈도를 고려한다. 이 경우 가능성이 행 오버플로 데이터의 많은 행에 자주 쿼리 될 일부 열은 다른 테이블로 이동되도록 테이블을 정상화 고려한다. 이것은 다음 비동기에서 조회 할 수 있습니다 작동 가입하세요.
n 개의 컬럼의 수와 데이터 형식 NVARCHAR로 테이블 만들기
CREATE Proc [dbo].[CreateMaxColTable_Nvarchar500] (@TableName nvarchar(100),@NumofCols int) AS BEGIN DECLARE @i INT DECLARE @MAX INT DECLARE @SQL VARCHAR(MAX) DECLARE @j VARCHAR(10) DECLARE @len int SELECT @i=1 SELECT @MAX=@NumofCols SET @SQL='CREATE TABLE ' + @TableName + '(' WHILE @i<=@MAX BEGIN select @j= cast(@i as varchar) SELECT @SQL= @SQL+'X'+@j +' NVARCHAR(500) , ' SET @i = @i + 1 END select @len=len(@SQL) select @SQL = substring(@SQL,0,@len-1) SELECT @SQL= @SQL+ ' )' exec (@SQL) END
자세한 정보는 다음 링크를 방문 할 수 있습니다 :
http://msdn.microsoft.com/en-us/library/ms186981%28SQL.105%29.aspx?PHPSESSID=tn8k5p1s508cop8gr43e1f34d2
http://technet.microsoft.com/en-us/library/ms143432.aspx
당신은 너무 많은 열이있는 테이블이 필요 왜하지만 당신은 시나리오를 말할 수주십시오? 난 당신이 데이터베이스의 재 설계에 대해 고려해야한다고 생각합니다.
-
==============================
2.이것은 단순히 수 없습니다. 참조 내부 스토리지 엔진 : 기록의 해부학
이것은 단순히 수 없습니다. 참조 내부 스토리지 엔진 : 기록의 해부학
테이블을 가정하면이 같은 것입니다.
CREATE TABLE T1( col_1 varchar(8000) NULL, col_2 varchar(8000) NULL, /*....*/ col_999 varchar(8000) NULL, col_1000 varchar(8000) NULL )
그런 다음 모든 NULL 값으로도 행은 다음과 같은 저장 장치를 사용합니다.
즉 이미 사용 보장 129 바이트 그래서 (7,931 떠나).
열 중 하나는 당신은 또한 공간이 필요하거나 NULL 또는 빈 문자열이 아닌 값이있는 경우
칼럼 오프셋 배열은 컬럼 및 이후의 모든 열은 또한 제로 길이 인 경우를 제외하고, 가변 길이 항목 당 2 바이트를 소모. 업데이트 col_1000 전체 2000 바이트를 강제 그래서 그냥 2 바이트를 사용하는 것이 컬럼 col_1를 업데이트하는 반면 사용합니다.
당신은 데이터의 5 바이트로 각 열을 채울 수 있고, 고려 때 2는 7929 남은 내에 7,000 바이트까지 추가 할 열 오프셋 배열의 각 바이트 그래서.
그러나 만약 기억 된 데이터가 행에 남아있는 실제 데이터에 24 바이트 포인터 행 떨어져서 저장 될 수 있으므로,이 102 바이트 (51 NVARCHAR 자)이다.
FLOOR(7929/(24 + 2)) = 304
최상의 경우는이 길이 데이터의 304 열을 저장할 수 있다는 것입니다 그리고 당신이 컬럼 col_1, col_2에는에서 업데이트하는 경우 즉 그래서 col_1000에 데이터가 포함되어있는 경우, ... 다음 계산이다
FLOOR(5929/24) = 247
당신이 몇 가지 추가 컬럼에 데이터를 짜낼 수 있도록 해주는 16 바이트 포인터를 사용할 수 있습니다 제외 NTEXT의 계산과 유사
FLOOR(7929/(16 + 2)) = 440
테이블에 대한 어떠한 SELECT에 대한 모든 오프 행 포인터를 따라 할 필요는 가능성이 성능에 매우 해로운 것입니다.
DROP TABLE T1 /* Create table with 1000 columns*/ DECLARE @CreateTableScript nvarchar(max) = 'CREATE TABLE T1(' SELECT @CreateTableScript += 'col_' + LTRIM(number) + ' VARCHAR(8000),' FROM master..spt_values WHERE type='P' AND number BETWEEN 1 AND 1000 ORDER BY number SELECT @CreateTableScript += ')' EXEC(@CreateTableScript) /* Insert single row with all NULL*/ INSERT INTO T1 DEFAULT VALUES /*Updating first 304 cols succeed. Change to 305 and it fails*/ DECLARE @UpdateTableScript nvarchar(max) = 'UPDATE T1 SET ' SELECT @UpdateTableScript += 'col_' + LTRIM(number) + ' = REPLICATE(1,1000),' FROM master..spt_values WHERE type='P' AND number BETWEEN 1 AND 304 ORDER BY number SET @UpdateTableScript = LEFT(@UpdateTableScript,LEN(@UpdateTableScript)-1) EXEC(@UpdateTableScript)
-
==============================
3.1.000 열이있는 테이블을 갖는 데이터베이스 설계에서 매우 뭔가 잘못이 있음을 알려줍니다.
1.000 열이있는 테이블을 갖는 데이터베이스 설계에서 매우 뭔가 잘못이 있음을 알려줍니다.
나는 테이블 중 하나는 500 개 이상의 열을 가지고있는 프로젝트를 상속 이상 1 년 후에 난 아직도 응용 프로그램의 90 %를 재 작업해야하기 때문에 상당히, 그것을 감소 드릴 수 없습니다.
너무 늦기 전에 그래서 DB를 재 설계.
-
==============================
4.'nonwide'테이블 당 최대 열 : 1,024 '전체'테이블 당 최대 열 : 30,000
'nonwide'테이블 당 최대 열 : 1,024 '전체'테이블 당 최대 열 : 30,000
정확히 하나의 테이블 당이 번호를 요구하는 경우 무엇 비록? 매우 더 나은 성능을 쉽게 개발을 얻을 수 있도록 수직으로 테이블을 여러 번 분할 좋습니다.
-
==============================
5.n 개의 컬럼의 수와 데이터 형식 NVARCHAR로 테이블 만들기
n 개의 컬럼의 수와 데이터 형식 NVARCHAR로 테이블 만들기
CREATE Proc [dbo].[CreateMaxColTable_Nvarchar500] (@TableName nvarchar(100),@NumofCols int) AS BEGIN DECLARE @i INT DECLARE @MAX INT DECLARE @SQL VARCHAR(MAX) DECLARE @j VARCHAR(10) DECLARE @len int SELECT @i=1 SELECT @MAX=@NumofCols SET @SQL='CREATE TABLE ' + @TableName + '(' WHILE @i<=@MAX BEGIN select @j= cast(@i as varchar) SELECT @SQL= @SQL+'A'+@j +' NVARCHAR(500) , ' SET @i = @i + 1 END select @len=len(@SQL) select @SQL = substring(@SQL,0,@len-1) SELECT @SQL= @SQL+ ' )' exec (@SQL) END
-
==============================
6.SQL 서버의 각 행에 대한 제한이 있습니다.
SQL 서버의 각 행에 대한 제한이 있습니다.
http://msdn.microsoft.com/en-us/library/ms143432.aspx
세부 정보를 제공합니다
-
==============================
7.우리는 대출 신청 5000 개 필드를 캡처 응용 프로그램을했다. 모든 필드는 하나의 기본 키 loanid에 따라 달라집니다. 우리는 배수에 테이블을 분할 할 수 있지만 필드는 동적입니다. 관리자는 또한 더 많은 필드를 만들 수있는 기능이 있습니다. 그래서 모든 동적이다. 그들은 단지 좋은 점은 loanid과 필드 사이에 하나의 관계에 대한 하나였다.
우리는 대출 신청 5000 개 필드를 캡처 응용 프로그램을했다. 모든 필드는 하나의 기본 키 loanid에 따라 달라집니다. 우리는 배수에 테이블을 분할 할 수 있지만 필드는 동적입니다. 관리자는 또한 더 많은 필드를 만들 수있는 기능이 있습니다. 그래서 모든 동적이다. 그들은 단지 좋은 점은 loanid과 필드 사이에 하나의 관계에 대한 하나였다.
그래서, 결국 우리는 XML 솔루션과 함께 갔다. 전체 데이터는 XML 문서의 저장소입니다. 최대 유연성 그러나 그것이 쿼리의 보고서에 diffifcult 있습니다.
from https://stackoverflow.com/questions/14070932/work-around-sql-server-maximum-columns-limit-1024-and-8kb-record-size by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 7 일 롤링 평균에 대한 SQL 쿼리 (0) | 2020.05.21 |
---|---|
[SQL] SQL 서버에 데이터를 삽입하는 방법 (0) | 2020.05.21 |
[SQL] 의 가입 사용할 때 어떻게 MS Access에서 삭제? (0) | 2020.05.21 |
[SQL] 웹 응용 프로그램에서 밖으로 쿼리 시간이지만 관리 스튜디오에서 벌금을 실행 (0) | 2020.05.21 |
[SQL] MySQL의 대량 INSERT 또는 UPDATE (0) | 2020.05.21 |