문제

이진 파일을 다음과 같이 SQL Server 2005에 Varbinary (Max) 열에 저장해야합니다.

fileInfo

  • FileInfoid int, pk, Identity
  • filetext varchar (max) (null이 될 수 있음)
  • filecreateddate dateTime 등

Filecontent

  • FileInfoid int, pk, fk
  • Filecontent varbinary (max)

FileInfo는 FileContent와 일대일 관계가 있습니다. Filetext는 업로드 할 파일이 없을 때 사용되어야하며 항목에 대해 수동으로 텍스트 만 입력됩니다. 항목의 비율이 바이너리 파일을 갖는 비율이 확실하지 않습니다.

두 번째 테이블을 만들어야합니다. 두 테이블 디자인으로 성능 향상이 있습니까? 논리적 이점이 있습니까?

내가 찾았 어 이 페이지, 내 경우에 그것이 적용되는지 확실하지 않습니다.

도움이 되었습니까?

해결책

성능이나 운영 이점이 없습니다. SQL 2005 이후 로브 유형은 다음과 같습니다 이미 별도의 할당 장치 인 별도의 B- 트리로 엔진이 저장했습니다. 당신이 공부한다면 표 및 색인 조직 SQL Server의 모든 파티션에는 최대 3 개의 할당 장치가 있음을 알 수 있습니다 : 데이터, LOB 및 Row-Overflow :

Table Organization

LOB 필드 (Varchar (max), nvarchar (max), varbinary (max), xml, clr udts 및 더 이상 사용되지 않은 유형 텍스트, ntext 및 이미지)는 클러스터 된 인덱스에만 데이터 레코드 자체에 있습니다. 매우 작은 발자국 : LOB 할당 장치에 대한 포인터, 기록의 해부학.

로브를 별도의 테이블에 명시 적으로 저장함으로써 당신은 절대적으로 아무것도 얻지 못합니다. 이전 원자 업데이트가 이제 두 개의 개별 테이블에 배포되어 응용 프로그램과 응용 프로그램 트랜잭션 구조를 복잡하게 만들어야하므로 불필요한 복잡성을 추가합니다.

LOB 컨텐츠가 전체 파일 인 경우 SQL 2008로 업그레이드하고 파일 스트림.

다른 팁

진짜가 없습니다 논리적 이 두 테이블 디자인에 대한 장점 관계는 1-1이므로 FileInfo 테이블에 모든 정보가 번들 수 있습니다. 그러나 심각한 것이 있습니다 운영 및 성능 이진 데이터의 크기가 평균 수백 바이트 이상인 경우 장점.

편집하다: Remus Rusanu가 지적한 바와 같이, SQL2005와 같은 일부 DBMS 구현에서, 대형 객체 유형은 별도의 테이블에 투명하게 저장되어 큰 레코드를 갖는 실질적인 단점을 효과적으로 완화시킨다. 이 기능의 도입은 [True] 단일 테이블 접근법의 약점을 암시 적으로 확인합니다.

나는 단지이 질문에 참조 된 SO 게시를 스캔했다. 나는 일반적으로 다른 게시물이 본질적인 데이터 무결성과 같은 몇 가지 유효한 점을 만듭니다 (주어진 항목의 모든 CRUD 조치가 원자체이기 때문에), 그리고 상대적으로 비정형적인 사용 사례 (예 : 항목 사용)가 아니라면 테이블 테이블은 주로 한 번에 단일 항목에 대해 쿼리 된 저장소로서), 성능 장점은 두 테이블 접근 방식을 사용하는 것입니다 (여기서 "헤더"테이블의 색인이 더 효율적입니다. 이진 데이터가 필요하지 않은 쿼리는 훨씬 더 빨리 반환됩니다. . 등.)

그리고 두 테이블 접근법은 디자인이 다른 컨텍스트에서 다른 유형의 이진 객체를 공급하기 위해 진화하는 경우 더 많은 이점이 있습니다. 예를 들어, 이러한 항목은 이미지 (GIF, JPG 등)라고 가정합니다. 나중에이 이미지의 작은 미리보기 버전 (및/또는 고해상도 버전)을 제공하려고합니다.이 선택은 컨텍스트 (사용자 선호도, 저 대역폭 클라이언트, 가입자 대 방문자 등.). 이러한 경우 단일 테이블 접근법과 관련된 작동 문제가 더 심각하게 만들어 졌을뿐만 아니라 모델이 다재다능 해집니다.

이미지, (n) 텍스트, (n) varchar (max) 및 varbinary (max) 열을 순수한 테이블에서 SQL Server의 일부 제한을 분리하는 데 도움이 될 수 있습니다.

예를 들어 2012 년 이전에는 LOB가 포함 된 경우 클러스터 테이블을 온라인으로 재건 할 수 없었습니다. 반면에 당신은 그러한 제한에 관심이 없을 수도 있으므로 데이터와 같은 테이블을 설정하는 것이 더 좋은 일입니다.

LOB 데이터를 테이블 할당 장치에서 물리적으로 유지하려는 경우 여전히 "큰 값 유형을 행"으로 설정할 수 있습니다. 테이블 옵션.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top