डीबीफोर्ज ट्रांजेक्शन लॉग के रिलीज पर काम करते समय, अन्य कार्यों के साथ, हमारी टीम को यह पता लगाना था कि टाइप किए गए एक्सएमएल डेटा को ठीक से कैसे स्टोर किया जाए।
शुरू करने के लिए, यह ध्यान देने योग्य है कि SQL सर्वर XML को उस प्रारूप में संग्रहीत नहीं करता है जिसे वह दर्ज किया गया था। एक एक्सएमएल स्ट्रिंग को पार्स किया जाता है, टैग में विभाजित किया जाता है, और इस प्रकार एक संपीड़ित प्रारूप में संग्रहीत किया जाता है। विवरण तत्व जिन्हें सर्वर अनावश्यक मानता है, उन्हें छोड़ दिया जाता है।
यह भी ध्यान में रखा जाना चाहिए कि, यदि किसी स्तंभ के डेटा प्रकार को साधारण XML के रूप में निर्दिष्ट किया जाता है, तो सर्वर इस डेटा को यूनिकोड स्ट्रिंग्स के रूप में संग्रहीत करेगा।
उदाहरण 1.
CREATE TABLE XmlValuesTable ( [uid] [int] IDENTITY PRIMARY KEY, v XML NOT NULL ); GO INSERT INTO XmlValuesTable (v) VALUES ('<note><float>123.456</float><time>01:23:45.789</time></note>'); INSERT INTO XmlValuesTable (v) VALUES ('<note><float>4.0000000000</float><time>01:23:45Z</time></note>');
सर्वर इन्सर्ट . को स्टोर करेगा डेटा इस प्रकार है:
F0 04 6E006F0074006500 <- Name "note" EF 000001 <- Namespace 01 F8 01 <- tag 01 F0 05 66006C006F0061007400 <- Name "float" EF 000002 <- Namespace 02 F8 02 <- tag 02 11 07 3100320033002E00340035003600 <- string "123.456" F7 <- closing tag F0 04 740069006D006500 <- Name "time" EF 000003 <- Namespace 02 F8 03 <- tag 03 11 0C 300031003A00320033003A00340035002E00370038003900 <- string "01:23:45.789" F7 <- closing tag F7 <- closing tag
निम्नलिखित उदाहरण में, स्तंभ डेटा प्रकार को XML स्कीमा संग्रह के माध्यम से टाइप किए गए के रूप में निर्दिष्ट किया गया है।
उदाहरण 2.
CREATE XML SCHEMA COLLECTION [XmlValuesSchemaCollection_datetime2] AS '<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" <xsd:element name="datetime2" type="sqltypes:datetime2"/> </xsd:schema>'; GO CREATE TABLE XmlValuesTable_datetime2 ( [uid] [int] IDENTITY PRIMARY KEY, v XML(XmlValuesSchemaCollection_datetime2) NOT NULL ); GO INSERT INTO XmlValuesTable_datetime2 (v) VALUES (N'<datetime2>2014-06-18T06:39:05.190</datetime2>'); GOमें जाएं
इस विशेष मामले में, सर्वर सम्मिलित करें . को स्टोर करेगा डेटा इस प्रकार है:
EA 09 014C010015 1A000000 <- type info 0x14C (332) “datetime2”, 0x15 (21) “dateTime” + offset F0 09 6400610074006500740069006D0065003200 <- Name "datetime2" EF 000001 <- Namespace 01 F8 01 <- tag 01 EA 05 004C010015 <- type info 7E 02978924A9380B <- "2014-06-18T06:39:05.190" F7 <- closing tag
इस तरह, सर्वर संग्रहीत डेटा को इस लेख के परिशिष्ट में निर्दिष्ट प्रकारों में परिवर्तित करता है (आप सर्वर पर "sys.xml_schema_types से चयन करें" क्वेरी चलाकर सभी डेटा प्रकारों की सूची देख सकते हैं)।
आइए एक नज़र डालते हैं कि कैसे सर्वर उदाहरण 1 के समान और XML स्कीमा संग्रह के साथ वर्णित अधिक जटिल संरचना को सहेजेगा।
उदाहरण 3.
CREATE XML SCHEMA COLLECTION [XmlValuesSchemaCollection] AS '<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sql2008/sqltypes.xsd"/> <xsd:element name="note"> <xsd:complexType> <xsd:sequence> <xsd:element name="float" type="xsd:float"/> <xsd:element name="time" type="xsd:time"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>'; GO CREATE TABLE XmlValuesTable ( [uid] [int] IDENTITY PRIMARY KEY, v XML(XmlValuesSchemaCollection) NOT NULL ); GO INSERT INTO XmlValuesTable (v) VALUES ('<note><float>123.456</float><time>01:23:45.789</time></note>');
सर्वर सम्मिलित करें . को सहेज लेगा डेटा इस प्रकार है:
EA 05 0001000100 <- type info F0 04 6E006F0074006500 <- Name "note" EF 000001 <- Namespace F8 01 <- tag 01 EA 09 0111000011 12000000 <- type info 0x11 (17) "float" + offset F0 05 66006C006F0061007400 <- Name "float" EF 000002 <- Namespace F8 02 <- tag 02 EA 05 0011000011 <- type info 0x11 (17) "float" 03 79E9F642 <- "123.456" F7 <- closing tag EA 09 0116000016 10000000 <- type info 0x16 (22) "time" + offset F0 04 740069006D006500 <- Name "time" EF 000003 <- Namespace F8 03 <- tag 03 EA 05 0016000016 <- type info 0x16 (22) "time" 7D 03FDAF4C005B950A <- "01:23:45.789" F7 <- closing tag F7 <- closing tag
आइए सम्मिलित करने के लिए एक स्कीमा लिंक जोड़ने का प्रयास करें।
उदाहरण 4.
INSERT INTO XmlValuesTable (v) VALUES ('<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><float>123.456</float><time>01:23:45.789</time></note>');
EA 05 0001000100 <- type info F0 04 6E006F0074006500 <- Name "note" EF 000001 <- Namespace F8 01 <- tag 01 F0 09 78006D006C006E0073003A00780073006900 <- Name "xmlns:xsi" EF 000200 <- Namespace "xmlns:xsi" F6 02 <- Attribute 11 29 68007400740070003A002F002F007700770077002E00770033002E006F00720067002F0032003000300031002F0058004D004C0053006300680065006D0061002D0069006E007300740061006E0063006500 <- "http://www.w3.org/2001/XMLSchema-instance" F5 <- closing bracket EA 09 0111000011 12000000 <- type info 0x11 (17) "float" + offset F0 05 66006C006F0061007400 <- Name "float" EF 000003 <- Namespace F8 03 <- tag 03 EA 05 0011000011 <- type info 0x11 (17) "float" 03 79E9F642 <- "123.456" F7 <- closing tag EA 09 0116000016 10000000 <- type info 0x16 (22) "time" + offset F0 04 740069006D006500 <- Name "time" EF 000004 <- Namespace F8 04 <- tag 08 EA 05 0016000016 <- type info 0x16 (22) "time" 7D 03FDAF4C005B950A <- "01:23:45.789" F7 <- closing tag F7 <- closing tag
जैसा कि आप देख सकते हैं, सर्वर ने नेमस्पेस को एक विशेषता के रूप में सावधानीपूर्वक सहेजा है और इसके लिए लगभग आधे स्थान का उपयोग किया है, इस तथ्य के बावजूद कि नेमस्पेस वास्तव में यहां किसी भी उपयोगी उद्देश्य की पूर्ति नहीं करता है - डेटा उसी तरह से सहेजा गया था जैसे यह होगा नाम स्थान के बिना सहेजा गया।
निष्कर्ष
ऊपर से, ऐसा लग सकता है कि आप कुछ डेटा प्रकारों (जैसे फ्लोट) को टाइप किए गए मानों के रूप में संग्रहीत करके डेटाबेस के आकार को कम कर सकते हैं क्योंकि 4 बाइट्स को यूनिकोड स्ट्रिंग के रूप में सहेजे गए समान मान की तुलना में काफी कम संग्रहण की आवश्यकता होती है। हालांकि, आपको यह ध्यान रखना चाहिए कि प्रत्येक मान के प्रकार का वर्णन करने और उसे आवश्यक स्थान पर ले जाने के लिए अतिरिक्त 7-18 बाइट्स का उपयोग किया जाता है।
परिशिष्ट
XML प्रकार, आधार प्रकार और डेटा प्रकारों का सहसंबंध जो सर्वर टाइप किए गए मानों को संग्रहीत करने के लिए उपयोग करता है।
XML प्रकार | आधार प्रकार | प्रकार के रूप में संग्रहीत | बाइट्स में आकार | |
कोई भी प्रकार | स्ट्रिंग | 2 * अक्षर | ||
कोई भी सरल प्रकार | कोई भी प्रकार | स्ट्रिंग | ||
स्ट्रिंग | कोई भी सरल प्रकार | स्ट्रिंग | ||
बूलियन | कोई भी सरल प्रकार | बूलियन | 1 | |
फ्लोट | कोई भी सरल प्रकार | फ्लोट | 4 | |
डबल | कोई भी सरल प्रकार | डबल | 8 | |
दशमलव | कोई भी सरल प्रकार | एसक्लडेसिमल | 20 | |
अवधि | कोई भी सरल प्रकार | स्ट्रिंग | ||
तारीख समय | कोई भी सरल प्रकार | *1 | ||
समय | कोई भी सरल प्रकार | *1 | ||
तारीख | कोई भी सरल प्रकार | *1 | ||
gYearMonth | कोई भी सरल प्रकार | स्ट्रिंग | ||
जीवर्ष | कोई भी सरल प्रकार | स्ट्रिंग | ||
gMonthDay | कोई भी सरल प्रकार | स्ट्रिंग | ||
gDay | कोई भी सरल प्रकार | स्ट्रिंग | ||
जीमाह | कोई भी सरल प्रकार | स्ट्रिंग | ||
हेक्सबाइनरी | कोई भी सरल प्रकार | बाइट्स की सरणी | ||
बेस 64 बाइनरी | कोई भी सरल प्रकार | बाइट्स की सरणी | ||
anyURI | कोई भी सरल प्रकार | स्ट्रिंग | ||
QName | कोई भी सरल प्रकार | स्ट्रिंग | ||
सामान्यीकृत स्ट्रिंग | स्ट्रिंग | स्ट्रिंग | ||
टोकन | स्ट्रिंग | स्ट्रिंग | ||
भाषा | स्ट्रिंग | स्ट्रिंग | ||
नाम | स्ट्रिंग | स्ट्रिंग | ||
एनसीनाम | स्ट्रिंग | स्ट्रिंग | ||
ENTITY | स्ट्रिंग | स्ट्रिंग | ||
NMTOKEN | स्ट्रिंग | स्ट्रिंग | ||
पूर्णांक | दशमलव | एसक्लडेसिमल | 20 | |
गैर सकारात्मक पूर्णांक | पूर्णांक | एसक्लडेसिमल | 20 | |
नकारात्मक पूर्णांक | गैर सकारात्मक पूर्णांक | एसक्लडेसिमल | 20 | |
लंबा | पूर्णांक | एसक्लडेसिमल | 20 | |
int | लंबा | एसक्लडेसिमल | 20 | |
संक्षिप्त | इंट | एसक्लडेसिमल | 20 | |
बाइट | संक्षिप्त | एसक्लडेसिमल | 20 | |
गैर-नकारात्मक पूर्णांक | पूर्णांक | एसक्लडेसिमल | 20 | |
अहस्ताक्षरित लंबा | गैर नकारात्मक पूर्णांक | एसक्लडेसिमल | 20 | |
unsignedInt | अहस्ताक्षरित लंबा | एसक्लडेसिमल | 20 | |
अहस्ताक्षरित लघु | unsignedInt | एसक्लडेसिमल | 20 | |
अहस्ताक्षरितबाइट | अहस्ताक्षरित लघु | एसक्लडेसिमल | 20 | |
सकारात्मक पूर्णांक | गैर नकारात्मक पूर्णांक | एसक्लडेसिमल | 20 | |
चार | स्ट्रिंग | स्ट्रिंग | ||
nchar | स्ट्रिंग | स्ट्रिंग | ||
वर्कर | स्ट्रिंग | स्ट्रिंग | ||
नवरचर | स्ट्रिंग | स्ट्रिंग | ||
पाठ | स्ट्रिंग | स्ट्रिंग | ||
ntext | स्ट्रिंग | स्ट्रिंग | ||
varbinary | बेस64बाइनरी | बाइट्स की सरणी | ||
बाइनरी | बेस64बाइनरी | बाइट्स की सरणी | ||
छवि | बेस64बाइनरी | बाइट्स की सरणी | ||
टाइमस्टैम्प | बेस64बाइनरी | बाइट्स की सरणी | ||
टाइमस्टैम्पसंख्यात्मक | लंबा | एसक्लडेसिमल | 20 | |
संख्यात्मक | दशमलव | एसक्लडेसिमल | 20 | |
बिगिंट | लंबा | एसक्लडेसिमल | 20 | |
छोटा सा | संक्षिप्त | एसक्लडेसिमल | 20 | |
छोटेपन | अहस्ताक्षरितबाइट | एसक्लडेसिमल | 20 | |
बिट | बूलियन | बूलियन | 1 | |
असली | फ्लोट | फ्लोट | 4 | |
तारीख | तारीख समय | *1 | ||
स्मॉलडेटटाइम | तारीख समय | *1 | ||
पैसा | दशमलव | एसक्लडेसिमल | ||
छोटी रकम | दशमलव | एसक्लडेसिमल | ||
अद्वितीय पहचानकर्ता | दशमलव | स्ट्रिंग | ||
डेटाटाइम2 | तारीख समय | *1 | ||
डेटाटाइमऑफ़सेट | तारीख समय | *1 | ||
पदानुक्रमित | स्ट्रिंग | स्ट्रिंग | ||
dboject | anyURI | स्ट्रिंग |
* 1 - डेटा / समय की जानकारी। विशिष्ट प्रकार को मान द्वारा परिभाषित किया जाता है।
मान | प्रकार के रूप में संग्रहीत | बाइट्स में आकार |
दिनांक ऑफसेट | तारीख (दिनों की राशि) | 3 |
दिनांक ऑफसेट (2019-09-16+02:00) | DateTimeOffset | 11 |
दिनांक समय | दिनांक समय | 7-9 सटीकता पर निर्भर करता है |
दिनांक समय ऑफसेट | DateTimeOffset | 9 |
समय | दिनांक समय | 7-9 सटीकता पर निर्भर करता है |
समय ऑफसेट (01:23:45Z) | DateTimeOffset | 9 |