XML 데이터를 저장할 데이터 유형 : VARCHAR (MAX) 또는 XML


9

SQL Server 2008을 사용하여 새로운 리소스 집합에 대한 스키마를 정의하고 있습니다.이 경우 각 레코드 ( 예 : row )는 XML 조각을 저장해야합니다. 때때로; 자주는 아니지만; 요소 및 속성 값을 찾으려면 XML을 쿼리해야합니다. 내 자신의 고안에 맡기면 xml 데이터 형식 을 사용하는 경향이 있지만 이것이 문제가 있다고 생각하게되었습니다. 그래서 그것은 저의 질문으로 이어집니다.

이 시나리오에서 XML을 XML 열에 저장하는 것과 varchar (MAX) 열 을 결정할 때 고려해야 할 요소는 무엇입니까?

도움이되는 경우 다음과 같은 추가 세부 정보가 있습니다.

  • 이러한 단편에 스키마를 사용하는 것에 대한 결정은 없습니다 ( 예 : XSD )
  • 조각의 크기는 작은 것에서 매우 큰 것입니다
  • 모든 XML은 잘 구성됩니다
  • 하루 동안 3 개월 동안 필요한 온라인 쿼리 지원으로 최대 10,000 개의 조각이 수집됩니다.
  • XML에 대한 쿼리는 하루 종일 발생하지만이 유형의 동시 쿼리는 거의 없어야합니다.

1
xml 유형은 원본 xml의 정확한 형식을 유지한다고 보장하지 않습니다. 문서를 변경하지 않아도되는 경우 nvarchar (max)가 유일한 옵션입니다.
MartinC

@MartinC 조각이 이미 잘 구성되어 있으면 어떤 종류의 변경이 발생할 수 있습니까? 나는 당신을 믿습니다, 나는 전에 이것을들은 적이 없습니다 ... 더 자세한 내용을 말씀해 주시겠습니까?
JoeGeeky

예를 들어, 빈 태그 <foo></foo><foo />
gbn

@gdn Ahhh, 알았어 ... 이것은 의미를 바꾸지 않으므로 나도 괜찮습니다.
JoeGeeky

답변:


5

경우 는 XML에 대한 쿼리가 발생합니다 SQL 서버 XML 기능에 의해, 다음 피하기 캐스팅에 XML을 저장하기 위해 XML 형식을 사용

XML 형식은 XML 유효성 검사로 인해 조금 느리게 저장 될 수 있지만 기본 XML 형식은 일반적인 varbinary (max)입니다.


1
기본 데이터가 아닙니다 VARBINARY(MAX). 이 형식은 최적화 된 형식이므로 쿼리하지 않더라도 여전히 XML데이터 유형을 사용해야합니다 .
Solomon Rutzky

6

에 저장하는 XML 사이에서 결정하려고 할 때 나는 어떤 요인을 고려하여야한다 xml대 열 varchar(MAX)

요인은 다음과 같습니다.

  1. XML형식은 FLWOR 문 및 반복 을 사용할 수있는 것을 포함하여 XQuery 식을 통해 쿼리 가능 / 구문 분석 가능
  2. XML변수 및 열의 데이터는 XML DML을 통해 XQuery 표현식을 사용하여 인라인으로 수정할 수 있습니다 .
  3. XML데이터는 UTF-16 LE (Little Endian)로 저장되므로 VARCHAR(MAX)데이터가 손실 될 수 있으므로 선택이 좋지 않습니다. 따라서, 진정한 결정 해야 사이 XMLNVARCHAR(MAX)점을 감안 NCHAR/ NVARCHAR또한 UTF-16 LE이다.
  4. XML데이터 는 XSD /에 대해 검증 될 있습니다 XML SCHEMA COLLECTION. XML 스키마 컬렉션이 지정되지 않은 경우 유효성 검사 (정확한 형식을 제외하고)는 수행되지 않지만을 사용할 때는이 옵션을 사용할 수 없습니다 NVARCHAR(MAX).
  5. XML 유형의 주요 이점 중 하나는 VARBINARY(MAX)사용자가 보는 정확한 문자열 표현을 저장하지 않고 대신 요소 및 속성 이름의 사전을 가지며 참조 하는 고도로 최적화 된 형식 ( @Oleg의 답변에 명시되어 있지 않음)으로 저장된다는 것입니다 그들의 ID로 그들에게. 또한 공백을 제거합니다. 다음을 시도하십시오 :

    DECLARE @Test1 XML = N'<Test><TagName>1</TagName><TagName>2</TagName></Test>';
    
    DECLARE @String1 NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];
    
    SET @Test1 = N'<Test><TagName>1</TagName><TagName>2</TagName><TagName>3</TagName>
    <TagName>4</TagName><TagName>5</TagName><TagName>6</TagName></Test>';
    
    SET @String1 = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];

    보고:

    XmlBytes   StringCharacters   StringBytes
    56         53                 106
    
    XmlBytes   StringCharacters   StringBytes
    84         133                266

    위의 예제 출력에서 ​​볼 수 있듯이 4 개의 요소 (#s 3, 4, 5 및 6)를 추가하면 80 자 (따라서 80 바이트 VARCHAR)와 160 바이트가 NVARCHAR변수에 추가됩니다. 그러나, 그것은 단지 인 XML 변수, 28 바이트를 추가 적은 이 추가보다 VARCHAR(다만 만일 누군가가 찬성 주장 거라고 VARCHAR이상 XML때문에 XMLUTF-16 [주로] 더블 바이트입니다). 이 최적화는 많은 공간을 절약 할 수 있으며 XML데이터 유형 을 사용하기에 충분한 이유 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.