একটি ক্লাস্টার ইনডেক্স ব্যবহার করা হয় "ক্ষেত্রের বাইরে" ক্ষেত্রগুলি কি পড়বে?


10

আমি জানি যে VARCHAR(MAX)/NVARCHAR(MAX)কলামগুলি যখন ব্যবহৃত হয় তখন ডেটা সংরক্ষণ করা হয় out of the row- ডেটা সারিটিতে অন্য স্থানে পয়েন্টার থাকবে যেখানে 'বৃহত্তর মান' সঞ্চয় করা আছে।

আমার নিম্নলিখিত প্রশ্নগুলি রয়েছে:

  1. প্রতিটি ক্ষেত্র সঞ্চিত out of the rowবা কেবল একটি max?
  2. আপনি যদি clustered indexপুরো রেকর্ডটি পড়তে সারণির মধ্যে ব্যবহার করেন , সারিগুলির বাইরে পড়া ক্ষেত্রগুলিও কি খুব বেশি পড়তে পারে?

ভর্চার (ম্যাক্স) বা এনভিচারার (ম্যাক্স) একটি 'বৃহত মান ধরণের' হিসাবে বিবেচিত। বড় মানের ধরণগুলি সাধারণত 'সারি বাইরে' সঞ্চিত থাকে। এর অর্থ ...


2
সর্বশেষ উদ্ধৃত বিটটি কোথা থেকে এসেছে? এটা সঠিক নয়.
পল হোয়াইট 9


3
মূল এমএসডিএন থ্রেডের সম্পূর্ণ পাঠ্যটি (জ্যাকব সেবাস্তিয়ান দ্বারা) সঠিক। স্ট্যাক ওভারফ্লো "উক্তি" এর বেশ কিছুটা হারায়। উপরে উল্লিখিত ছোট্ট অংশটি সমস্ত গুরুত্বপূর্ণ বিটগুলি বাদ দেয় :)
পল হোয়াইট 9

উত্তর:


13

আমি জানি যে VARCHAR(MAX)/NVARCHAR(MAX)কলামগুলি যখন ব্যবহৃত হয় তখন তথ্যগুলি সারির বাইরে সংরক্ষণ করা হয় ...

আসলে, এটি large value types out of rowবিকল্পের সেটিং এর উপর নির্ভর করে , যা ব্যবহার করে সেট করা যায় sp_tableoptionডকুমেন্টেশন থেকে :

বিএল এক্সট্র্যাক্ট

ডিফল্ট জন্য MAXমান সংরক্ষণ করার জন্য ইন-সারি , 8000 বাইট, আপ যদি তারা মাপসই করা হবে। আপনি যদি sp_tableoptionনা ডিফল্ট পরিবর্তন করতে ব্যবহার না করেন তবে আপনার MAXডেটা সম্ভবত সারি-ইন সংরক্ষণ করা হবে।

এটি বলেছে MAXযে মানগুলির জন্য ডেটা ধরণের ব্যবহার করা খারাপ অভ্যাস যা 8000 বাইটের বেশি হবে না - পরিবর্তে একটি নন-ম্যাক্স প্রকার ব্যবহার করুন। অন্য যে কোনও বিষয় বাদ দিয়ে, MAXপ্রকারের সাথে কাজ করার সময় পারফরম্যান্স প্রায়শই উল্লেখযোগ্যভাবে দরিদ্র হয় , কারণ এসকিউএল সার্ভার অবশ্যই ডেটা 2 জিবি পর্যন্ত হতে পারে এমন ডেটা মোকাবেলার জন্য প্রস্তুত থাকতে হবে।

প্রতিটি ক্ষেত্র সারি থেকে সঞ্চিত বা কেবল সর্বোচ্চ?

শুধু MAXবেশী। তদ্ব্যতীত, পূর্ববর্তী-সারি MAXকলামটি যদি সারি-সারি সরানো হয় তবে কেবলমাত্র সেই সারিটির কলামটিই প্রভাবিত হবে। এটি অফ-সারি LOBকাঠামোর পয়েন্টার দ্বারা সারি-সারি প্রতিস্থাপন করা হয় । এমন পরিস্থিতিতেও রয়েছে যেখানে নন-ম্যাক্স কলামগুলি সারি থেকে সরানো হতে পারে।

আপনি যদি পুরো রেকর্ডটি পড়ার জন্য টেবিলের ক্লাস্টারড ইনডেক্স ব্যবহার করছেন, সারি থেকে সঞ্চিত ক্ষেত্রগুলি কি খুব বেশি পড়তে পারে?

ক্লাস্টারড ইনডেক্স স্ক্যান করা কেবল ইন-সারি ডেটা অনুসরণ করে। যদি ক্যোয়ারির জন্য অফ-সারি ডেটা প্রয়োজন হয় তবে এটি ইন-সারি পয়েন্টার ব্যবহার করে সন্ধান করা হবে।


এটা কি সবসময় সত্য - Scanning the clustered index traverses only in-row data.? উদাহরণস্বরূপ, আপনি যদি NVARCHAR(MAX)ক্ষেত্রের মানগুলি প্রদর্শন করতে চান তবে কেবলমাত্র in-row-data(যদি মানগুলি সারি থেকে সঞ্চিত থাকে) দিয়ে কীভাবে কাজ করা সম্ভব হয় ? অথবা আপনি যখন ক্লাস্টারড ইনডেক্স ব্যবহার করছেন (কারণ কোনও প্রচ্ছদ সূচক নেই) তবে আপনি ক্ষেত্রের workসাথে যাচ্ছেন না NVARCHAR(MAX)এসকিউএল সার্ভারটি দেখতে যথেষ্ট চালাক এবং out-of-rowডেটা অবধি এড়িয়ে যেতে পারে ?
gotqn

উত্তরের জন্য ধন্যবাদ. সুতরাং, পরিশেষে, আপনি যদি দুটি কলাম আছে - intএবং nvarchar(max)এবং আপনি শুধুমাত্র নির্বাচন করছি intকলাম, এসকিউএল সার্ভারের রিসোর্স নষ্ট করেন না তথ্য হিসাবে তা জানেন আপনি এটি ব্যবহার না করতে যাচ্ছ? readout-of-row
15

অনেক ধন্যবাদ. ওঁটা খুব সুন্দর. দেখে মনে হচ্ছে, sp_tableoptionপ্রচুর ক্লাস্টারড ইনডেক্স সন্ধান / স্ক্যান করা হয়ে গেলে আপনি সারণির আকার হ্রাস করতে প্রায়শই ব্যবহৃত হয় না এমন সমস্ত কিছু টেবিলের বাইরে রাখতে সক্ষম হন।
gotqn

3
@gotqn হ্যাঁ অফ সারি পুরাতন lob ধরনের জন্য ডিফল্ট ছিল text, ntextএবং image। আপনি অবশ্যই পৃথক টেবিলের বড় ধরণের সঞ্চয় করতে পারেন।
পল হোয়াইট 9

4

বৃহত অবজেক্ট স্টোরেজের জন্য এই আচরণটি টেবিল সেটিং দ্বারা নিয়ন্ত্রণ করা যেতে পারে:

exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>

: SQL সার্ভার 2012 ডকুমেন্টেশন রেফারেন্স এ http://msdn.microsoft.com/en-us/library/ms173530.aspx

অতএব আপনি স্থানটি কোথায় ব্যবহৃত হয়েছে, সারি-সারি বা সারি থেকে সঞ্চিত সেখানে নিয়ন্ত্রণ করতে পারবেন।


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