ประเภทข้อมูลที่จะเก็บข้อมูล XML ใน: VARCHAR (MAX) หรือ XML


9

ฉันกำลังกำหนด schema สำหรับชุดทรัพยากรใหม่โดยใช้ SQL Server 2008 ... ในกรณีนี้แต่ละระเบียน ( เช่นแถว ) จะต้องเก็บชิ้นส่วน XML เมื่อเวลาผ่านไป; แม้ว่าจะไม่บ่อย ฉันจะต้องสืบค้น XML เพื่อค้นหาองค์ประกอบและค่าแอตทริบิวต์ หากปล่อยทิ้งไว้กับสิ่งที่ฉันทำเองฉันมักจะใช้ประเภทข้อมูลxmlแม้ว่าฉันจะถูกชักนำให้เชื่อว่าสิ่งนี้มีปัญหา นั่นทำให้ฉันมีคำถาม

รับสถานการณ์นี้สิ่งที่ปัจจัยที่ฉันควรจะมีการพิจารณาเมื่อพยายามที่จะตัดสินใจระหว่างการจัดเก็บ XML ในXMLคอลัมน์เทียบกับvarchar (MAX)คอลัมน์

ถ้ามันช่วย ... นี่คือรายละเอียดเพิ่มเติม:

  • ไม่มีการตัดสินใจเกี่ยวกับการใช้สคีมาสำหรับชิ้นส่วนเหล่านี้ ( เช่น XSD's )
  • ขนาดของชิ้นส่วนจะมีตั้งแต่เล็กไปจนถึงใหญ่มาก
  • XML ทั้งหมดจะมีรูปแบบที่ดี
  • ในแต่ละวันจะมีการรวบรวมชิ้นส่วนได้มากถึง 10,000 ชิ้นพร้อมการสนับสนุนการสืบค้นออนไลน์ที่จำเป็นสำหรับ ~ 3 เดือน
  • การค้นหากับ XML จะเกิดขึ้นตลอดทั้งวัน แต่ควรอยู่ในสถานะที่มีคำสั่งประเภทนี้พร้อมกันเล็กน้อย

1
ประเภท xml ไม่รับประกันว่าจะรักษารูปแบบที่แน่นอนของ xml ดั้งเดิมหากมีข้อกำหนดสำหรับเอกสารที่จะไม่เปลี่ยนแปลง nvarchar (สูงสุด) เป็นเพียงตัวเลือกเดียว
MartinC

@MartinC หากแฟรกเมนต์มีรูปร่างดีแล้วการเปลี่ยนแปลงแบบไหนที่จะเกิดขึ้นได้? ฉันเชื่อว่าคุณฉันไม่เคยได้ยินเรื่องนี้มาก่อน ... คุณช่วยชี้รายละเอียดให้ฉันหน่อยได้ไหม?
JoeGeeky

ตัวอย่างแท็กเปล่า<foo></foo>จะกลายเป็น<foo />
gbn

@gdn Ahhh โอเค ... มันไม่เปลี่ยนความหมายดังนั้นมันก็โอเคกับฉัน
JoeGeeky

คำตอบ:


5

หากการค้นหากับ XML จะเกิดขึ้นโดยความสามารถของ xml ของเซิร์ฟเวอร์ sql ให้ใช้ประเภท XML เพื่อเก็บ xml เพื่อหลีกเลี่ยงการส่ง

และ

โปรดทราบว่าประเภท XML อาจถูกเก็บไว้ช้าลงเล็กน้อยเนื่องจากการตรวจสอบความถูกต้องของ XML แต่ประเภทพื้นฐานของ XML นั้นเป็น varbinary ทั่วไป (สูงสุด)


1
VARBINARY(MAX)ข้อมูลพื้นฐานไม่ได้ เป็นรูปแบบที่ปรับให้เหมาะสมซึ่งหมายความว่าแม้ว่าคุณจะไม่ได้สืบค้นก็ตามคุณก็ควรใช้XMLประเภทข้อมูล
โซโลมอน Rutzky

6

ฉันควรพิจารณาปัจจัยอะไรบ้างเมื่อพยายามตัดสินใจระหว่างการจัดเก็บ XML ในxmlคอลัมน์กับvarchar(MAX)คอลัมน์

ปัจจัยคือ:

  1. XMLประเภทคือ queryable / parseable ผ่านการแสดงออก XQuery รวมทั้งความสามารถในการใช้งบ FLWOR และซ้ำ
  2. ข้อมูลในXMLตัวแปรและคอลัมน์สามารถแก้ไขแบบอินไลน์ใช้นิพจน์ XQuery ผ่านXML ดราก้อน
  3. XMLข้อมูลถูกจัดเก็บในรูปแบบ UTF-16 LE (Little Endian) ดังนั้นVARCHAR(MAX)จะเป็นตัวเลือกที่แย่เพราะอาจทำให้ข้อมูลสูญหายได้ ดังนั้นการตัดสินใจที่แท้จริงควรอยู่ระหว่างXMLและNVARCHAR(MAX)ด้วยNCHAR/ / NVARCHARยังเป็น UTF-16 LE
  4. XMLข้อมูลสามารถถูกตรวจสอบกับ XSD XML SCHEMA COLLECTION/ ไม่มีการตรวจสอบ (นอกมั่นใจได้ว่ารูปแบบที่ดี) จะทำถ้าไม่มี XML Schema เก็บระบุไว้ NVARCHAR(MAX)แต่ตัวเลือกนี้ไม่สามารถใช้ได้เมื่อใช้
  5. ข้อดีอย่างหนึ่งที่สำคัญของประเภท XML คือมันถูกเก็บไว้ในรูปแบบที่ได้รับการปรับให้เหมาะสมที่สุด (ไม่ได้VARBINARY(MAX)ระบุไว้ในคำตอบของ @ Oleg) ที่ไม่ได้เก็บการแทนค่าสตริงที่แน่นอนที่คุณเห็น แต่มีพจนานุกรมชื่อองค์ประกอบและแอตทริบิวต์ ถึงพวกเขาด้วยรหัสของพวกเขา นอกจากนี้ยังลบช่องว่าง ลองทำสิ่งต่อไปนี้:

    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

    ดังที่คุณเห็นในตัวอย่างผลลัพธ์ด้านบนการเพิ่มองค์ประกอบสี่อย่าง (#s 3, 4, 5 และ 6) เพิ่ม 80 ตัวอักษร (ดังนั้น 80 ไบต์ถ้าใช้VARCHAR) และ 160 ไบต์ในNVARCHARตัวแปร แต่ก็เพิ่มเพียง 28 ไบต์ตัวแปร XML ซึ่งเป็นน้อยกว่าที่มันเพิ่มสำหรับVARCHAR(ในกรณีที่มีคนกำลังจะไปยืนยันในความโปรดปรานของVARCHARมากกว่าXMLเพราะXMLเป็น UTF-16 ซึ่งเป็น [ส่วนใหญ่] ไบต์คู่) การเพิ่มประสิทธิภาพนี้สามารถประหยัดพื้นที่ได้มากและมีเหตุผลเพียงพอที่จะใช้XMLประเภทข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.