Kiểu dữ liệu nào để lưu trữ dữ liệu XML trong: VARCHAR (MAX) hoặc XML


9

Tôi đang xác định một lược đồ cho một bộ tài nguyên mới bằng SQL Server 2008 ... Trong trường hợp này, mỗi bản ghi ( ví dụ: hàng ) sẽ cần lưu trữ các đoạn XML. Theo thời gian; mặc dù không thường xuyên; Tôi sẽ cần truy vấn XML để tìm các giá trị phần tử và thuộc tính. Nếu để lại những suy nghĩ của riêng tôi, tôi sẽ có xu hướng sử dụng kiểu dữ liệu xml mặc dù tôi đã được tin rằng điều này có vấn đề. Vì vậy, điều đó dẫn tôi đến câu hỏi của tôi.

Với kịch bản này, những yếu tố tôi nên được xem xét khi cố gắng để quyết định giữa lưu trữ XML trong một xml cột vs một varchar (MAX) cột

Nếu nó giúp được thì đây là một số chi tiết bổ sung:

  • Không có quyết định nào được đưa ra liên quan đến việc sử dụng lược đồ cho các đoạn này ( ví dụ: XSD, )
  • Kích thước của các mảnh sẽ dao động từ nhỏ đến rất lớn
  • Tất cả XML sẽ được hình thành tốt
  • Trong suốt một ngày, sẽ có tới ~ 10.000 mảnh được thu thập với sự hỗ trợ truy vấn trực tuyến cần thiết trong ~ 3 tháng
  • Các truy vấn đối với XML sẽ diễn ra suốt cả ngày nhưng sẽ vẫn nhẹ với một vài truy vấn đồng thời thuộc loại này

1
Loại xml không đảm bảo duy trì hình thức chính xác của xml gốc, nếu có yêu cầu đối với tài liệu không thay đổi thì nvarchar (max) là lựa chọn duy nhất.
MartinC

@MartinC Nếu đoạn được hình thành rõ ràng thì loại thay đổi nào có thể xảy ra? Tôi tin bạn, tôi chưa từng nghe điều này trước đây ... Bạn có thể chỉ cho tôi thêm một số chi tiết không?
JoeGeeky

Ví dụ: các thẻ trống <foo></foo>sẽ trở thành<foo />
gbn

@gdn Ahhh, ok ... điều này không thay đổi ý nghĩa, vì vậy nó ổn với tôi.
JoeGeeky

Câu trả lời:


5

Nếu Truy vấn đối với XML sẽ xảy ra bởi các khả năng xml của máy chủ sql, thì hãy sử dụng loại XML để lưu trữ xml để tránh truyền

Xin lưu ý rằng loại XML đó có thể được lưu trữ chậm hơn một chút do xác thực xml, nhưng loại XML cơ bản là phương sai thông thường (tối đa)


1
Các dữ liệu cơ bản là không VARBINARY(MAX). Đây là một định dạng được tối ưu hóa, có nghĩa là ngay cả khi bạn không truy vấn nó, bạn vẫn nên sử dụng XMLkiểu dữ liệu.
Solomon Rutzky

6

Những yếu tố nào tôi nên xem xét khi cố gắng quyết định giữa việc lưu trữ XML trong một xmlcột so với một varchar(MAX)cột

Các yếu tố là:

  1. Các XMLloại là queryable / parseable thông qua biểu thức XQuery, bao gồm khả năng sử dụng Statement FLWOR và Iteration
  2. Dữ liệu trong XMLcác biến và cột có thể được sửa đổi nội tuyến bằng cách sử dụng các biểu thức XQuery thông qua XML DML .
  3. XMLdữ liệu được lưu trữ dưới dạng UTF-16 LE (Little Endian), do đó VARCHAR(MAX)sẽ là một lựa chọn kém vì nó có thể dẫn đến mất dữ liệu. Do đó, quyết định thực sự phải nằm giữa XMLNVARCHAR(MAX), cho rằng NCHAR/ NVARCHARcũng là UTF-16 LE.
  4. XMLdữ liệu có thể được xác nhận theo XSD / XML SCHEMA COLLECTION. Không có xác thực (bên ngoài đảm bảo hình dạng tốt) được thực hiện nếu không có Bộ sưu tập Lược đồ XML nào được chỉ định, nhưng tùy chọn này không khả dụng khi sử dụng NVARCHAR(MAX).
  5. Một lợi ích chính của loại XML là nó được lưu trữ ở định dạng được tối ưu hóa cao (không được VARBINARY(MAX)nêu trong câu trả lời của @ Oleg) không lưu trữ biểu diễn chuỗi chính xác mà bạn thấy, nhưng thay vào đó có một từ điển các tên thuộc tính và thuộc tính và tham chiếu cho họ bằng ID của họ. Nó cũng loại bỏ khoảng trắng. Hãy thử như sau:

    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];
    

    Trả về:

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

    Như bạn có thể thấy trong ví dụ đầu ra ở trên, thêm bốn phần tử (#s 3, 4, 5 và 6) đã thêm 80 ký tự (do đó là 80 byte nếu sử dụng VARCHAR) và 160 byte cho NVARCHARbiến. Tuy nhiên, nó chỉ thêm 28 byte cho biến XML, đó là ít hơn nó gia tăng đối với VARCHAR(chỉ trong trường hợp một người nào đó đang diễn ra để tranh luận ủng hộ VARCHARhơn XMLXMLlà UTF-16 đó là [chủ yếu] double-byte). Tối ưu hóa này có thể tiết kiệm hàng tấn không gian và đủ lý do để sử dụng XMLkiểu dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.