এক্সএমএল ডেটা কোন ডেটাটাইপ এতে সংরক্ষণ করবে: ভারচার (ম্যাক্স) বা এক্সএমএল


9

আমি এসকিউএল সার্ভার ২০০৮ ব্যবহার করে নতুন সংস্থার সংস্থানগুলির জন্য একটি স্কিমা সংজ্ঞায়িত করছি ... এই ক্ষেত্রে, প্রতিটি রেকর্ড ( যেমন সারি ) এক্সএমএল টুকরো সংরক্ষণ করতে হবে। মাঝে মাঝে; যদিও ঘন ঘন না; উপাদান এবং বৈশিষ্ট্যগুলির মানগুলি খুঁজতে আমাকে এক্সএমএলটি জিজ্ঞাসা করতে হবে। যদি আমার নিজস্ব পরিকল্পনা থেকে ছেড়ে যায় তবে আমি এক্সএমএল ডেটা টাইপ ব্যবহার করতে পারি যদিও আমাকে বিশ্বাস করতে পরিচালিত হয়েছে যে এটি ইস্যুগুলি নিয়ে আসে। সুতরাং এটি আমাকে আমার প্রশ্নের দিকে নিয়ে যায়।

এই দৃশ্যের প্রেক্ষিতে, এক্সএমএল একটি ভার্সার (ম্যাক্স) কলামে এক্সএমএল সংরক্ষণের মধ্যে সিদ্ধান্ত নেওয়ার চেষ্টা করার সময় আমাকে কী বিষয়গুলি বিবেচনা করা উচিত?

যদি এটি সহায়তা করে ... এখানে কিছু অতিরিক্ত বিবরণ দেওয়া হল:

  • এই টুকরাগুলির জন্য স্কিমা ব্যবহার সম্পর্কিত কোনও সিদ্ধান্ত নেওয়া হয়নি ( যেমন এক্সএসডি'র )
  • খণ্ডগুলির আকারগুলি ছোট থেকে খুব বড় পর্যন্ত হবে
  • সমস্ত এক্সএমএল সুসংহত হবে
  • এক দিনের মধ্যে, query 3 মাসের জন্য প্রয়োজনীয় অনলাইন ক্যোয়ারী সহায়তা সহ 10,000 ডলার পর্যন্ত সংগ্রহ করা হবে
  • এক্সএমএলের বিরুদ্ধে অনুসন্ধানগুলি দিনব্যাপী ঘটবে তবে এই ধরণের কয়েকটি সাম্প্রতিক প্রশ্নের সাথে হালকা থাকতে হবে

1
এক্সএমএল টাইপটি মূল এক্সএমএলের সঠিক ফর্মটি সংরক্ষণের গ্যারান্টি দেয় না, যদি নথির অপরিবর্তিত পরিবর্তন প্রয়োজন হয় তবে এনভারচার (সর্বাধিক) একমাত্র বিকল্প।
মার্টিনসি

@ মার্টিনসি যদি খণ্ডটি ইতিমধ্যে সুগঠিত হয় তবে কোন ধরণের পরিবর্তন আসতে পারে? আমি আপনাকে বিশ্বাস করি, আমি এর আগে শুনিনি ... আপনি কি আমাকে আরও কিছু বিবরণে নির্দেশ করতে পারেন?
জোজিকি

উদাহরণস্বরূপ, খালি ট্যাগগুলি <foo></foo>হয়ে যাবে<foo />
gbn

@ জিডিএন আহহ, ঠিক আছে ... এর অর্থ পরিবর্তন হয় না, তাই আমার সাথে ঠিক আছে।
জোজিকি

উত্তর:


5

যদি এক্সএমএলের বিপরীতে প্রশ্নগুলি এসকিএল সার্ভারের এক্সএমএল ক্ষমতা দ্বারা ঘটে থাকে তবে কাস্টিং এড়ানোর জন্য এক্সএমএল সংরক্ষণ করতে এক্সএমএল টাইপ ব্যবহার করুন

এবং

মনে রাখবেন, এক্সএমএল বৈধতার কারণে এক্সএমএল প্রকারটি কিছুটা ধীর গতিতে সংরক্ষণ করা যেতে পারে তবে অন্তর্নিহিত প্রকারের এক্সএমএলটি সাধারণ বর্ণের (সর্বোচ্চ)


1
অন্তর্নিহিত ডেটা নয় VARBINARY(MAX)। এটি একটি অপ্টিমাইজড ফর্ম্যাট, যার অর্থ আপনি এটি জিজ্ঞাসা করতে যাচ্ছেন না, আপনার এখনও XMLডেটাটাইপ ব্যবহার করা উচিত ।
সলোমন রুটজকি

6

একটি xmlকলামে বনাম একটি varchar(MAX)কলামে এক্সএমএল সংরক্ষণের মধ্যে সিদ্ধান্ত নেওয়ার চেষ্টা করার সময় আমার কী বিষয়গুলি বিবেচনা করা উচিত

কারণগুলি হ'ল:

  1. এফএলডাব্লোর স্টেটমেন্ট এবং আইট্রেশনXML ব্যবহার করতে সক্ষম হওয়া সহ এই প্রকারটি এক্সকিউয়ের এক্সপ্রেশনগুলির মাধ্যমে ক্যোয়ারযোগ্য / পার্সেবল
  2. XMLভেরিয়েবল এবং কলামগুলিতে থাকা ডেটা এক্সএমএল ডিএমএলের মাধ্যমে এক্সকুয়েরি এক্সপ্রেশন ব্যবহার করে ইনলাইনে সংশোধন করা যেতে পারে ।
  3. XMLডেটা ইউটিএফ -১ 16 এলই (লিটল এন্ডিয়ান) হিসাবে সংরক্ষণ করা হয়, সুতরাং VARCHAR(MAX)এটি একটি ক্ষুদ্র পছন্দ হবে কারণ এর ফলে ডেটা ক্ষতি হতে পারে। তাই, সত্য সিদ্ধান্ত উচিত এর মধ্যে হতে XMLএবং NVARCHAR(MAX)দেওয়া যে NCHAR/ NVARCHARএছাড়াও হল UTF-16 লে।
  4. XMLতথ্য করতে বিরুদ্ধে XSD / যাচাই করা XML SCHEMA COLLECTION। কোনও এক্সএমএল স্কিমা সংগ্রহ নির্দিষ্ট না করা থাকলে কোনও বৈধতা (সু-গঠনের বিষয়টি নিশ্চিত করার বাইরে) করা হয় না, তবে এই বিকল্পটি ব্যবহার করার সময় উপলভ্য নয় NVARCHAR(MAX)
  5. এক্সএমএল টাইপের একটি বড় সুবিধা হ'ল এটি একটি উচ্চতর অনুকূলিত বিন্যাসে সংরক্ষণ করা হয় ( VARBINARY(MAX)@ ওলেগের উত্তরে বর্ণিত নয় ) যা আপনি দেখতে পাচ্ছেন সঠিক স্ট্রিং প্রতিনিধিত্ব সংরক্ষণ করে না, তবে পরিবর্তে এলিমেন্ট এবং বৈশিষ্ট্যযুক্ত নামের অভিধান রয়েছে এবং রেফারেন্স রয়েছে তাদের আইডি দ্বারা তাদের। এটি হোয়াইটস্পেসও সরিয়ে দেয়। নিম্নলিখিত চেষ্টা করুন:

    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

    আপনি উপরের উদাহরণের আউটপুটটিতে দেখতে পাচ্ছেন, চারটি উপাদান যুক্ত করে (# এস 3, 4, 5 এবং 6) ভ্যারিয়েবলটিতে 80 টি অক্ষর (সুতরাং ব্যবহারের ক্ষেত্রে 80 বাইট VARCHAR) এবং 160 বাইট যুক্ত করেছে NVARCHAR। তবুও, এটি কেবলমাত্র এক্সএমএল ভেরিয়েবলে 28 বাইট যুক্ত করেছে, যা এটির জন্য যোগ করার চেয়ে কমVARCHAR (কেবলমাত্র কেউ যদি VARCHARওভারের পক্ষে তর্ক করতে চলেছে XMLকারণ XMLইউটিএফ -16 যা [বেশিরভাগ] ডাবল-বাইট)। এই অপ্টিমাইজেশানটি প্রচুর স্থান বাঁচাতে পারে এবং XMLডেটাটাইপ ব্যবহার করার জন্য এটি নিজেরাই যথেষ্ট কারণ ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.