2013-11-26 2 views
2

나는 SQL 서버에이 쿼리가 2008는 SQL 서버 행 크기 제한 및 테이블 디자인

CREATE TABLE MediaLibrary 
(
MediaId bigint NOT NULL IDENTITY (1, 1), 
MediaTypeId smallint NOT NULL, 
ImageNameByUser nchar(100) NULL, 
GeneratedName uniqueidentifier NOT NULL, 
UploadedByUserId uniqueidentifier NOT NULL, 
UploadedDate date NOT NULL, 
ProfilePhoto bit NOT NULL, 
PublicPhoto bit NOT NULL, 
AppointmentId bigint NULL, 
OriginalImage nchar(1000) NULL, 
ThumbImage nchar(1000) NULL, 
MediumImage nchar(1000) NULL, 
LargeImage nchar(1000) NULL, 
UrlThumb nchar(1000) NULL, 
UrlMedium nchar(1000) NULL, 
UrlLarge nchar(1000) NULL, 
InactiveReasonId smallint NULL, 
InactiveDate datetime NULL 
) ON [PRIMARY] 
GO 

나는 'MediaLibrary을'테이블을 작성 또는 변질이 오류

을 얻을 테이블을 만들려고하면 9 바이트의 내부 오버 헤드를 포함하여 최소 행 크기가 14273이 G로 실패했습니다. 이것은 8060 바이트의 최대 허용 테이블 행 크기를 초과합니다.

나는 행 크기에 제한을 두게된다. 그러나 이것은 큰 테이블이 아니다. 그래서 나는 이것이 좋은 디자인이 아닌지 궁금해하고있다?

nchar(1000)varChar(1000)으로 변경하면 테이블이 잘 보존됩니다. 데이터가 실제로 테이블에 저장되면 행 크기 제한에 다시 도달하게됩니다.

+0

'nchar (1000)'은 ** 정말 나쁜 생각입니다 ** ** ** 내부에 "a"만 저장하더라도 ** 항상 ** 2000 바이트의 저장 공간을 사용합니다. 'nchar (n)'은 짧은 (최대 3 자, 아마도 5 자까지) 문자열에 대해 OK입니다. ISO 통화 코드 등. 더 긴 텍스트 스 니펫의 경우에는 ** 항상 ** 실제로 ** 실제로 ** 저장되는'(n) varchar (x)'데이터 유형을 사용해야합니다! –

답변

5

모든 열을 채우지 않는다고 가정하면 nchar (또는 char)가 아닌 nvarchar (또는 varchar 만 사용)를 사용해야합니다. 그 이유는 사용 여부에 관계없이 nchar(1000)은 2000 바이트를 예약해야하기 때문입니다. varchar/nvarchar에는 해당되지 않습니다.

이제 각 열에 1000자를 사용할 예정이라면 사용하는 데이터 유형에 관계없이 작동하지 않습니다. 그 이유는 SQL Server의 기본 저장소 요소가 8K 페이지이기 때문입니다. 따라서 ~ 8K 이상의 행을 저장할 수 없습니다 (일부 페이지 머리글 오버 헤드와 열의 데이터 형식에 따라 사용할 수있는 다른 비트가 있음). BLOB으로 오프 행에 맞지 않는 데이터를 저장할 수 있지만,이 성능 오버 헤드 이럴이며, 어떤 한계 예를 도입 할 수있다 -

  • VARCHAR (최대) 해결 방법이 전형적이다 온라인 재구성 수행 능력
  • 테이블 구조를 변경하여 이러한 URL이 별도의 테이블에 별도의 행으로 저장되도록합니다. 예 : 여담으로

    CREATE TABLE dbo.Media 
    (
        MediaID BIGINT IDENTITY(1,1) PRIMARY KEY, 
        MediaTypeID SMALLINT NOT NULL, 
        ImageNameByUser NVARCHAR(100) NULL, -- should also not be nchar 
        GeneratedName UNIQUEIDENTIFIER NOT NULL, 
        UploadedByUserId UNIQUEIDENTIFIER NOT NULL, 
        UploadedDate date NOT NULL, 
        ProfilePhoto bit NOT NULL, 
        PublicPhoto bit NOT NULL, 
        AppointmentId bigint NULL, 
        InactiveReasonId smallint NULL, 
        InactiveDate datetime NULL 
    ); 
    
    CREATE TABLE dbo.URLTypes 
    (
        URLTypeID TINYINT NOT NULL PRIMARY KEY, 
        Description NVARCHAR(32) NOT NULL UNIQUE 
    ); 
    
    INSERT dbo.URLTypes VALUES(1,'OriginalImage'),(2,'ThumbImage'),...; 
    
    CREATE TABLE dbo.MediaURLs 
    (
        MediaID BIGINT NOT NULL FOREIGN KEY REFERENCES dbo.Media(MediaID), 
        URLTypeID TINYINT NOT NULL FOREIGN KEY REFERENCES dbo.URLTypes(URLTypeID), 
        URL VARCHAR(2048) NOT NULL 
    ); 
    

, 당신은 정말 URL에 유니 코드를 지원해야하는 건가요?

+0

아니요. URL은 서버 측 파일 위치와 중복됩니다. 나는 아마도 하나 또는 다른 것을 구할 필요가있을 뿐이다. 또한 테이블에서 3 열을 노크합니다. 또한 각 열에는 Thumb, medium, large의 경로가 있습니다. 나는 또한 패딩이 너무 많을 수도 있지만 더 적게 생각하는 것이 더 좋을 것이라고 1000으로 덧붙였다. 폴더 구조를 알고 있고 호스팅 서버에서 경로를 얻을 수 있기 때문에 패딩의 더 가까운 범위까지 계산할 수 있습니다. – ChampChris

+0

EDIT는 제가 생각한 다른 방법입니다. 감사! – ChampChris

+0

마지막 질문은 서버 경로가 아닌 URL을 저장하는 것이 가장 좋습니다. 과도한 살인과 같아. – ChampChris