LOB_DATA, ধীর টেবিল স্ক্যান এবং কিছু আই / ও প্রশ্ন


19

আমার পরিবর্তে একটি বড় টেবিল রয়েছে যার একটি কলামে এক্সএমএল ডেটা রয়েছে যার এক্সএমএল এন্ট্রির গড় আকার ~ 15 কিলোবাইট। অন্যান্য সমস্ত কলামগুলি নিয়মিত ইনটস, বিগিন্টস, জিইউইডি ইত্যাদি রয়েছে কিছু কংক্রিট নম্বর পেতে, ধরুন যে টেবিলটির এক মিলিয়ন সারি রয়েছে এবং আকারটি 15 গিগাবাইট।

আমি যেটা লক্ষ্য করেছি তা হ'ল যদি আমি সমস্ত কলামগুলি নির্বাচন করতে চাই তবে এই টেবিলটি ডেটা নির্বাচন করতে সত্যই ধীর। যখন আমি করি

SELECT TOP 1000 * FROM TABLE

ডিস্ক থেকে ডেটা পড়তে প্রায় 20-25 সেকেন্ড সময় লাগে - যদিও আমি ফলাফলটিতে কোনও অর্ডার চাপিয়ে দিই না। আমি কোয়েডটি ঠান্ডা ক্যাশে দিয়ে চালিয়েছি (অর্থাত্ পরে DBCC DROPCLEANBUFFERS)। এখানে আইও পরিসংখ্যান ফলাফল:

স্ক্যান কাউন্ট 1, লজিকাল 364, শারীরিক পাঠ 24, রিড-ফরোয়ার্ড 7191 পড়ে, লব লজিকাল পড়ছে 7924, লব ফিজিকাল 1690, লব রিড-ফরোয়ার্ড 3968 পড়ছে

এটি ~ 15 এমবি ডেটা গ্র্যাব করে। এক্সিকিউশন প্ল্যান ক্লাস্টারড ইনডেক্স স্ক্যানটি যেমনটি প্রত্যাশা করতাম তেমন দেখায়।

আমার প্রশ্নের পাশাপাশি ডিস্কে কোনও আইও চলছে না; আমি এটিও পরীক্ষা করে দেখেছি যে ক্লাস্টারড ইনডেক্স বিভাজন 0% এর কাছাকাছি। এটি একটি গ্রাহক-গ্রেড সাটা ড্রাইভ, তবে আমি এখনও ভাবতে পারি এসকিউএল সার্ভার Server 100-150 এমবি / মিনিটের চেয়ে দ্রুত টেবিলটি স্ক্যান করতে সক্ষম হবে।

এক্সএমএল ক্ষেত্রের উপস্থিতি বেশিরভাগ টেবিলের ডেটা এলওবি_ডাটা পৃষ্ঠাগুলিতে অবস্থিত করে (আসলে table 90% সারণী পৃষ্ঠাগুলি LOB_DATA) are

আমার অনুমানটি হ'ল - আমি কি এই ভেবে সঠিক হয়েছি যে LOB_DATA পৃষ্ঠাগুলি কেবল তাদের আকারের কারণে ধীরে ধীরে স্ক্যান করতে পারে, কিন্তু যখন টেবিলের অনেকগুলি LOB_DATA পৃষ্ঠা রয়েছে তখন এসকিউএল সার্ভার ক্লাস্টারড সূচক কার্যকরভাবে স্ক্যান করতে পারে না?

আরও বিস্তৃতভাবে - এই জাতীয় টেবিলের কাঠামো / ডেটা প্যাটার্ন রাখা কি যুক্তিসঙ্গত বলে মনে করা হয়? ফাইল স্ট্রিম ব্যবহারের জন্য সুপারিশগুলি সাধারণত অনেক বড় ক্ষেত্রের মাপের বিবরণ দেয়, তাই আমি সত্যিই সেই পথে যেতে চাই না। আমি এই নির্দিষ্ট দৃশ্যের সম্পর্কে সত্যই কোনও ভাল তথ্য পাইনি।

আমি এক্সএমএল সংক্ষেপণের দিকে ভাবছিলাম, তবে এটি ক্লায়েন্ট বা এসকিউএলসিএলআর দিয়ে করা দরকার এবং সিস্টেমে বাস্তবায়নের জন্য বেশ কিছু কাজ প্রয়োজন।

আমি সংকোচনের চেষ্টা করেছি এবং এক্সএমএলগুলি যেহেতু অত্যধিক অপ্রয়োজনীয়, তাই আমি (এসি # অ্যাপ্লিকেশন) XML কে 20KB থেকে ~ 2.5KB থেকে কমপ্রেস করতে পারি এবং এটি LOB ডেটা পৃষ্ঠাগুলির ব্যবহার রোধ করে ভার্বিনারি কলামে সঞ্চয় করতে পারি। এটি আমার পরীক্ষায় 20x বার গতি নির্বাচন করে।


অ্যালেক্স: নিশ্চিত না যে আপনি আমার উত্তর সম্পর্কিত আলোচনাটি দেখেছেন (লিঙ্কটি আমার উত্তরের নীচে একটি মন্তব্যে রয়েছে), তবে আমি আপনার দৃশ্যের পুনরুত্পাদন করার কাছাকাছি যেতে সক্ষম হয়েছি। আমি আপনার বর্ণনার সাথে একটি টেবিলের মিল খুঁজে পেয়েছি (যতটা আমার কাছে তথ্য ছিল) এবং আমি / হে স্ট্যাটাসগুলি পেয়েছি যা খুব মিল। "এলওবি ফিজিকাল রিডস" বাদে কখনও ঘনিষ্ঠ হয় নি। তাই আমি ভাবছিলাম যে আপনি XML আপডেট করেছেন (তবে অন্যান্য কলামগুলি নয়) এবং / অথবা আপনার ডেটা ফাইলগুলির অনেকগুলি দৈহিক খণ্ড খণ্ড করেছেন। তবুও আপনার টেবিলের ডিডিএল এবং প্রতিটি ডেটা ফাইলের জন্য আপনার অটো-বর্ধন সেটিং নিয়ে আপত্তি জানব না, এবং আপনি কী আপনার ডেটা ফাইল সঙ্কুচিত করবেন?
সলোমন রুটজকি

প্রথমত - বিস্তারিত উত্তরের জন্য অনেক ধন্যবাদ, সময় অভাবের কারণে আমি সেই সময় আলোচনায় অংশ নিতে পারিনি। এখন যেহেতু আপনি এটি উল্লেখ করেছেন (প্রশ্ন জিজ্ঞাসা করার সময় আমি এটি ভেবে দেখিনি) - এক্সএমএল ক্ষেত্রটি তৈরি হওয়ার পরে একাধিকবার আপডেট করা হয় এবং এটি ছোট তৈরি হয়। সুতরাং আমি সন্দেহ করব যে প্রাথমিকভাবে এটি সারি-সারি সঞ্চিত আছে, এবং কিছু আপডেটের পরে এটি একটি এলওবি পৃষ্ঠার কাঠামোতে স্থানান্তরিত হয় এবং তারপরে আরও কিছু আপডেট পাওয়া যায়।
আলেকজান্ডার শিলেমিন

(অবিরত) আমি প্রশ্ন জিজ্ঞাসার আগে ফাইলগুলির দৈহিক খণ্ড পরীক্ষা করে দেখেছি এবং বিল্ট-ইন উইন্ডোজ সরঞ্জামটি এটি ঠিক আছে বলে মনে করেছিল, তাই আমি আর এটির দিকে নজর দিইনি। আমার বিশ্বাস 1 এমবি দ্বারা অটো-বর্ধন ডিফল্ট, এবং ডেটা ফাইল সঙ্কুচিত হয়নি।
আলেকজান্ডার শিলেমিন

আমার বিশেষ ক্ষেত্রে শীর্ষ নির্বাচন করুন 1000 * এর গুরুত্ব রয়েছে। আমি অবশ্যই বুঝতে পারি যে এটি একটি খারাপ অনুশীলন হিসাবে বিবেচিত হয়েছে, তবে কিছু অ্যাপ্লিকেশন ডিজাইনের সিদ্ধান্তগুলি দীর্ঘকাল স্থায়ী হওয়ার পরে পরিবর্তন করা সত্যই কঠিন। নির্বাচন করুন * মূলত আমাদের অ্যাপের বিভিন্ন উপাদানগুলির মধ্যে ক্রস-ডাটাবেস প্রতিলিপি কৌশল হিসাবে ব্যবহৃত হয়। এর পক্ষে মতামত রয়েছে, উদাহরণস্বরূপ, আমরা ফ্লাইতে ডেটা / স্কিমা দিয়ে অনেকগুলি স্বেচ্ছাচারিতামূলক হেরফের করতে পারি যা অন্তর্নির্মিত প্রতিক্রিয়ার কৌশলগুলির সাথে কঠোর হবে, তবে এটি তার সমস্যাগুলির সাথে আসে।
আলেকজান্ডার শিলেমিন

SELECT *আপনার যদি এক্সএমএল ডেটা প্রয়োজন হয় তবে অ্যালেক্স সমস্যা নয়। আপনি যদি এক্সএমএল ডেটা না চান তবে এটি কেবলমাত্র একটি সমস্যা, সেই ক্ষেত্রে আপনি যে ডেটা ব্যবহার করছেন না সেগুলি ফেরত পেতে ক্যোরিয়াকে কেন কমিয়ে দেবেন? আমি এলএমবি পৃষ্ঠায় বিভাজন সঠিকভাবে রিপোর্ট করা হচ্ছে না তা ভেবে XML- এ আপডেট হওয়া সম্পর্কে জিজ্ঞাসা করেছি। কোন কারণে আমি আমার উত্তরে জিজ্ঞাসা করেছি যে আপনি ক্লাস্টারড সূচি খণ্ডিত হয়নি তা ঠিক কীভাবে নির্ধারণ করেছিলেন? আপনি যে আদেশটি দৌড়েছিলেন তা কি আপনি সরবরাহ করতে পারেন? এবং আপনি ক্লাস্টারড ইনডেক্সে একটি সম্পূর্ণ পুনরায় বিল্ডিং করেছেন? (অবিরত)
সলোমন রুটজকি

উত্তর:


11

এক্সএমএল ক্ষেত্রের উপস্থিতি বেশিরভাগ টেবিলের ডেটা এলওবি_ডাটা পৃষ্ঠাগুলিতে অবস্থিত করে (আসলে table 90% সারণী পৃষ্ঠাগুলি LOB_DATA) are

কেবলমাত্র টেবিলে এক্সএমএল কলামটি থাকার ফলে এর প্রভাব নেই। এটা তোলে এক্সএমএল উপস্থিতি ডেটা , যে কিছু অবস্থার অধীনে , কারণ একটি সারিতে এর কিছু ডেটা অংশ সারি বন্ধ সঞ্চিত হবে, LOB_DATA পাতায়। এবং যখন একজন (বা হতে পারে বেশ কয়েকটি ;-) এই তর্ক করতে পারে তবে XMLকলামটি বোঝায় যে এক্সএমএল ডেটা সত্যই থাকবে, এটি নিশ্চিত নয় যে এক্সএমএল ডেটা সারি থেকে সঞ্চিত রাখতে হবে: যদি না সারিটি ইতিমধ্যে যথেষ্ট পরিমাণে ভরাট না হয়) তাদের কোনও এক্সএমএল ডেটা হওয়ার বাইরে, ছোট দস্তাবেজগুলি (8000 বাইট পর্যন্ত) সারণিতে ফিট করতে পারে এবং কোনও এলওবি_ডাটা পৃষ্ঠায় যেতে পারে না।

আমি কি এই ভেবে সঠিক হয়েছি যে LOB_DATA পৃষ্ঠাগুলি কেবল তাদের আকারের কারণে ধীরে ধীরে স্ক্যানের কারণ হতে পারে তা নয়, যখন টেবিলের অনেকগুলি LOB_DATA পৃষ্ঠাগুলি থাকে তখন এসকিউএল সার্ভার ক্লাস্টারড ইনডেক্স কার্যকরভাবে স্ক্যান করতে পারে না?

স্ক্যানিং বলতে সমস্ত সারি দেখানো বোঝায়। অবশ্যই, যখন কোনও ডেটা পৃষ্ঠাটি পঠিত হয়, তখন কলামগুলির একটি উপসেট বাছাই করা সত্ত্বেও, ইন-সারি ডেটাগুলির সমস্তগুলি পঠিত হয়। এলওবি ডেটার সাথে পার্থক্য হ'ল আপনি যদি সেই কলামটি নির্বাচন না করেন তবে অফ-সারি ডেটাটি পড়বে না। সুতরাং এসকিউএল সার্ভার কতটা দক্ষতার সাথে এই ক্লাস্টারড ইনডেক্সটি স্ক্যান করতে পারে সে সম্পর্কে কোনও সিদ্ধান্তে পৌঁছানো সত্যিই ন্যায়সঙ্গত নয় কারণ আপনি ঠিক এটি পরীক্ষা করেননি (বা আপনি এর অর্ধেক পরীক্ষা করেছেন)। আপনি সমস্ত কলাম নির্বাচন করেছেন, যার মধ্যে এক্সএমএল কলাম রয়েছে, এবং আপনি যেমন উল্লেখ করেছেন, সেখানেই বেশিরভাগ ডেটা অবস্থিত।

সুতরাং আমরা ইতিমধ্যে জানি যে SELECT TOP 1000 *পরীক্ষাটি কেবল 8 কে ডেটা পৃষ্ঠাগুলি কেবল একটি সারিতেই পড়ছিল না, বরং প্রতি সারি প্রতি অন্য স্থানে ঝাঁপিয়ে পড়ে । যে LOB ডেটার সঠিক কাঠামো এটি কতটা বড় তার ভিত্তিতে পরিবর্তিত হতে পারে। এখানে প্রদর্শিত গবেষণার উপর ভিত্তি করে (ভারচার, ভারবাইনারি, ইত্যাদি ) এর মতো (এমএএক্স) ধরণের এলওবি পয়েন্টারের আকার কত? ) দুটি ধরণের অফ-সারি এলওবি বরাদ্দ রয়েছে:

  1. ইনলাইন রুট - 8001 এবং 40,000 (সত্যই 42,000) বাইট, স্পেস অনুমতি সহ ডেটাগুলির জন্য, সেখানে ROW এ 1 থেকে 5 পয়েন্টার (24 - 72 বাইট) থাকবে যা সরাসরি এলওবি পৃষ্ঠায় (গুলি) যাবে।
  2. TEXT_TREE - ৪২,০০০ বাইটের বেশি ডেটার জন্য, বা যদি 1 থেকে 5 পয়েন্টার সারি-সারি ফিট না করতে পারে তবে LOB পৃষ্ঠাগুলিতে পয়েন্টারগুলির তালিকার প্রারম্ভিক পৃষ্ঠায় কেবল 24 বাইট পয়েন্টার থাকবে (যেমন " পাঠ্য_ট্রি "পৃষ্ঠা)।

আপনি যখন 8000 বাইটের বেশি বা সারি-সারি ফিট না করে LOB ডেটা পুনরুদ্ধার করেন তখন এই দুটি পরিস্থিতির মধ্যে একটি ঘটে । আমি PasteBin.com এ একটি পরীক্ষার স্ক্রিপ্ট পোস্ট করেছি (এলওবি বরাদ্দ পরীক্ষা এবং পড়ার জন্য টি-এসকিউএল স্ক্রিপ্ট ) যা 3 ধরণের এলওবি বরাদ্দ (তথ্যের আকারের উপর ভিত্তি করে) পাশাপাশি সেইগুলির প্রতিটিটির যৌক্তিক এবং শারীরিক পড়া। আপনার ক্ষেত্রে, যদি এক্সএমএল ডেটা সারি প্রতি 42,000 বাইটের চেয়ে কম হয়, তবে এর কোনওটিই (বা এর খুব সামান্য) কমপক্ষে দক্ষ TEXT_TREE কাঠামোর মধ্যে থাকা উচিত নয়।

আপনি যদি পরীক্ষা করতে চান যে এসকিউএল সার্ভার সেই ক্লাস্টারড ইনডেক্সটি কত দ্রুত স্ক্যান করতে পারে, SELECT TOP 1000তবে এটি করুন তবে সেই এক্সএমএল কলামটি না করে এক বা একাধিক কলাম নির্দিষ্ট করুন । এটি কীভাবে আপনার ফলাফলগুলিকে প্রভাবিত করে? এটি বেশ কিছুটা দ্রুত হওয়া উচিত।

এ জাতীয় টেবিলের কাঠামো / ডাটা প্যাটার্ন যুক্তিযুক্ত হওয়া কি যুক্তিযুক্ত বলে বিবেচিত হয়?

আমাদের প্রকৃত সারণী কাঠামো এবং ডেটা প্যাটার্নের একটি অসম্পূর্ণ বিবরণ দেওয়া আছে, এই অনুপস্থিত বিবরণগুলি কী তার উপর নির্ভর করে কোনও উত্তর অনুকূল নাও হতে পারে। এই বিষয়টি মাথায় রেখে আমি বলব যে আপনার টেবিলের কাঠামো বা ডেটা প্যাটার্ন সম্পর্কে স্পষ্টত অযৌক্তিক কিছু নেই।

আমি (এসি # অ্যাপ্লিকেশন) XML কে 20KB থেকে ~ 2.5KB থেকে সংকুচিত করতে এবং এটি LOB ডেটা পৃষ্ঠাগুলির ব্যবহার রোধ করে ভার্বিনারি কলামে সঞ্চয় করতে পারি। এটি আমার পরীক্ষায় 20x বার গতি নির্বাচন করে।

এটি সমস্ত কলামগুলি বা কেবলমাত্র এক্সএমএল ডেটা (এখন ইন VARBINARY) দ্রুত নির্বাচন করেছে, তবে এটি আসলে এমন প্রশ্নের উদ্রেক করে যা "এক্সএমএল" ডেটা নির্বাচন করে না। ধরে নিচ্ছি যে অন্যান্য কলামগুলিতে আপনার প্রায় 50 বাইট রয়েছে এবং তার FILLFACTOR100 টি রয়েছে, তারপরে:

  • কোনও সংকোচনের নয়: 15k XMLডেটাতে 2 টি LOB_DATA পৃষ্ঠাগুলি প্রয়োজন, যার জন্য ইনলাইন রুটের জন্য 2 পয়েন্টার প্রয়োজন। প্রথম পয়েন্টারটি 24 বাইট এবং দ্বিতীয়টি 12, এক্সএমএল ডেটার জন্য সজ্জিত মোট 36 বাইটের জন্য। মোট সারির আকার 86 বাইট এবং আপনি এই সারির প্রায় 93 টি 8060 বাইট ডেটা পৃষ্ঠায় ফিট করতে পারেন। সুতরাং, 1 মিলিয়ন সারিগুলির জন্য 10,753 ডেটা পৃষ্ঠা প্রয়োজন requires

  • কাস্টম সংক্ষেপণ: 2.5k VARBINARYডেটা ইন-সারি ফিট করবে। মোট সারির আকার 2610 (2.5 * 1024 = 2560) বাইট, এবং আপনি 8060 বাইট ডেটা পৃষ্ঠায় এই সারিগুলির মধ্যে কেবল 3 ফিট করতে পারেন। সুতরাং, 1 মিলিয়ন সারিগুলির জন্য 333,334 ডেটা পৃষ্ঠা প্রয়োজন।

তদ্ব্যতীত, ক্লাস্টারড ইনডেক্সের ডেটা পৃষ্ঠাগুলিতে 30x বর্ধিত কাস্টম সংক্ষেপণের বাস্তবায়ন । অর্থ, ক্লাস্টার ইনডেক্স স্ক্যান ব্যবহার করে সমস্ত প্রশ্নের কাছে এখন প্রায় 322,500 টি ডেটা পৃষ্ঠা পড়তে হবে। এই ধরণের সংকোচনের অতিরিক্ত ক্রিয়াকলাপগুলির জন্য দয়া করে নীচের বিশদটি দেখুন।

এর পারফরম্যান্সের ভিত্তিতে আমি কোনও রিফ্যাক্টরিং করার বিরুদ্ধে সতর্কতা করব SELECT TOP 1000 *। এটি অ্যাপ্লিকেশন এমনকি জারি করবে এমন কোনও কোয়েরি হওয়ার সম্ভাবনাও নেই এবং সম্ভাব্য অপ্রয়োজনীয় অপ্টিমাইজেশনের (গুলি) একমাত্র ভিত্তি হিসাবে ব্যবহার করা উচিত নয়।

আরও বিশদ তথ্য এবং আরও পরীক্ষার চেষ্টা করার জন্য, দয়া করে নীচের বিভাগটি দেখুন।


এই প্রশ্নের একটি যথাযথ উত্তর দেওয়া যাবে না, তবে আমরা কমপক্ষে কিছুটা অগ্রগতি করতে পারি এবং সঠিক গবেষণার (আদর্শভাবে প্রমাণের ভিত্তিতে) সন্ধানের আরও কাছে যেতে সহায়তা করার জন্য অতিরিক্ত গবেষণার পরামর্শ দিতে পারি।

আমরা যা জানি:

  1. সারণীতে প্রায় 1 মিলিয়ন সারি রয়েছে
  2. টেবিলের আকার প্রায় 15 জিবি
  3. ছক এক ধারণ করে XMLকলাম এবং ধরনের বেশ কয়েকটি কলাম: INT, BIGINT, UNIQUEIDENTIFIER, "ইত্যাদি"
  4. XMLকলামে "আকার", হয় গড়ে প্রায় 15k
  5. দৌড়ানোর পরে DBCC DROPCLEANBUFFERS, নিম্নলিখিত কোয়েরিটি শেষ হতে 20 - 25 সেকেন্ড সময় লাগে:SELECT TOP 1000 * FROM TABLE
  6. ক্লাস্টার্ড সূচকটি স্ক্যান করা হচ্ছে
  7. ক্লাস্টারড ইনডেক্সে খণ্ডন 0% এর কাছাকাছি

আমরা কী জানি আমরা জানি:

  1. এই প্রশ্নের বাইরে অন্য কোনও ডিস্ক ক্রিয়াকলাপ নেই। তুমি কি নিশ্চিত? এমনকি যদি অন্য কোনও ব্যবহারকারীর জিজ্ঞাস্য নাও থাকে, তখনও কি ব্যাকগ্রাউন্ড অপারেশনগুলি চলছে? এসকিউএল সার্ভারের বহিরাগত প্রক্রিয়াগুলি কি একই মেশিনে চলছে যা কিছু আইও গ্রহণ করতে পারে? সেখানে নাও থাকতে পারে তবে কেবলমাত্র সরবরাহ করা তথ্যের ভিত্তিতে এটি পরিষ্কার নয়।
  2. 15 এমবি এক্সএমএল ডেটা ফিরিয়ে দেওয়া হচ্ছে। এই সংখ্যাটি কিসের উপর ভিত্তি করে? 1000 সারি থেকে প্রাপ্ত একটি অনুমান প্রতি সারিতে XML ডেটার গড় 15 কে গুণ? বা সেই ক্যোয়ারির জন্য কী প্রাপ্ত হয়েছিল তার একটি প্রোগ্রাম্যাটিক সংহতকরণ? যদি এটি কেবল অনুমান হয় তবে আমি এটির উপর নির্ভর করব না যেহেতু এক্সএমএল ডেটা বিতরণ এমনকি সাধারণ গড় দ্বারা বোঝানো পদ্ধতিতেও নাও হতে পারে।
  3. এক্সএমএল সংক্ষেপণ সাহায্য করতে পারে। আপনি নেট কিভাবে সংক্ষেপণ করতে হবে? এর মাধ্যমে GZipStream বা DeflateStream শ্রেণীর? এটি কোনও শূন্য-ব্যয়ের বিকল্প নয়। এটি অবশ্যই একটি বিশাল শতাংশ দ্বারা কিছু ডেটা সংকুচিত করবে, তবে এটির জন্য আরও সিপিইউ প্রয়োজন হবে কারণ আপনাকে প্রতিটি সময় ডেটা সংকুচিত / সংক্ষেপিত করতে অতিরিক্ত প্রক্রিয়া প্রয়োজন। এই পরিকল্পনাটি আপনার এই ক্ষমতাটি পুরোপুরি সরিয়ে ফেলবে:

    • ক্যোয়ারী মাধ্যমে এক্সএমএল তথ্য .nodes, .value, .query, এবং .modifyএক্সএমএল ফাংশন।
    • এক্সএমএল ডেটা সূচী করুন।

      দয়া করে মনে রাখবেন (যেহেতু আপনি উল্লেখ করেছেন যে এক্সএমএল "অত্যন্ত রিডানড্যান্ট") যে XMLডেটাটাইপটি ইতিমধ্যে অনুকূলিত হয়েছে যে এটি একটি অভিধানে উপাদান এবং বৈশিষ্ট্যগুলির নাম সংরক্ষণ করে, প্রতিটি আইটেমের জন্য একটি পূর্ণসংখ্যার সূচক ID নির্ধারণ করে এবং তারপরে পূর্ণসংখ্যা আইডি ব্যবহার করে পুরো দস্তাবেজ জুড়ে (অতএব এটি প্রতিটি ব্যবহারের পুরো নামটির পুনরাবৃত্তি করে না, আবার এটি উপাদানগুলির জন্য ক্লোজিং ট্যাগ হিসাবে পুনরাবৃত্তি করে না)। আসল ডেটাতে বহিরাগত সাদা স্থানও সরানো আছে। এ কারণেই এক্সট্রাক্ট এক্সএমএল ডকুমেন্টগুলি তাদের মূল কাঠামো ধরে রাখে না এবং খালি উপাদানগুলি কেন সেগুলিতে প্রবেশ করে <element />এমনভাবে কেন নিষ্কাশন করে<element></element>। সুতরাং জিজেপ (বা অন্য কিছু) এর মাধ্যমে সংকোচনের কোনও লাভ কেবলমাত্র উপাদান এবং / বা গুণাবলীকে কমপ্রেস করেই পাওয়া যাবে যা বেশিরভাগ প্রত্যাশার তুলনায় উন্নত হতে পারে এবং এটি সম্ভবত ক্ষতি হ্রাসের যোগ্য নয় ক্ষমতা উপরে উল্লিখিত হিসাবে।

      দয়া করে এও মনে রাখবেন যে এক্সএমএল ডেটা সংকুচিত করা এবং VARBINARY(MAX)ফলাফল সংরক্ষণ করা LOB অ্যাক্সেসকে হারাবে না, এটি কেবল এটি হ্রাস করবে। সারিটিতে থাকা বাকী ডেটার আকারের উপর নির্ভর করে, সংকোচিত মানটি সারি-তে সজ্জিত হতে পারে বা এটির জন্য এখনও LOB পৃষ্ঠাগুলির প্রয়োজন হতে পারে।

তথ্যটি সহায়ক হলেও এটি যথেষ্ট পর্যাপ্ত নয়। ক্যোয়ারি পারফরম্যান্সকে প্রভাবিত করে এমন অনেকগুলি উপাদান রয়েছে, তাই আমাদের কী চলছে তার একটি আরও বিশদ চিত্রের প্রয়োজন।

আমরা যা জানি না, তবে এটির দরকার:

  1. SELECT *পদার্থের পারফরম্যান্স কেন? এটি কি কোড হিসাবে আপনি ব্যবহার করেন এমন একটি প্যাটার্ন। যদি তাই হয় তবে কেন?
  2. কেবলমাত্র এক্সএমএল কলাম নির্বাচন করার পারফরম্যান্সটি কী? যদি আপনি শুধু কি পরিসংখ্যান এবং সময়জ্ঞান কি আছেন: SELECT TOP 1000 XmlColumn FROM TABLE;?
  3. এই 1000 টি সারিটি ফিরিয়ে আনতে 20 - 25 সেকেন্ডের মধ্যে কতটা নেটওয়ার্ক কারণগুলির সাথে সম্পর্কিত (তারের জুড়ে ডেটা প্রাপ্তি), এবং ক্লায়েন্টের কারণগুলির সাথে কতটা সম্পর্কিত ( এসএসএমএসে গ্রিডে এক্সএমএল ডেটা, বা সম্ভবত ডিস্কে সঞ্চয় করা)?

    অপারেশন এই দুটি দিক ফ্যাক্টরিং কখনও কখনও কেবল তথ্য ফিরিয়ে না দিয়ে করা যেতে পারে। এখন, কেউ একটি অস্থায়ী টেবিল বা টেবিল ভেরিয়েবলের মধ্যে বাছাই করার কথা ভাবতে পারে তবে এটি কেবলমাত্র কয়েকটি নতুন ভেরিয়েবল (যেমন ডিস্ক I / O এর জন্য tempdb, লেনদেন লগ লিখবে, টেম্পডিবি ডাটা এবং / অথবা লগ ফাইলের সম্ভাব্য স্বয়ংবৃদ্ধি প্রয়োজন হবে) বাফার পুলে স্থান) ইত্যাদি। এই সমস্ত নতুন কারণগুলি আসলে ক্যোয়ারির সময় বাড়াতে পারে। পরিবর্তে, আমি সাধারণত কলামগুলি ভেরিয়েবলগুলিতে সংরক্ষণ করি (উপযুক্ত ডেটাটাইপের; না SQL_VARIANT) যা প্রতিটি নতুন সারি (যেমন SELECT @Column1 = tab.Column1,...) দিয়ে ওভাররাইট হয়ে যায় ।

    তা যে , এই DBA.StackExchange Q & A- মধ্যে @PaulWhite দ্বারা নির্দিষ্ট করা হয়েছে, লজিক্যাল বিভিন্ন সার্চ যখন একই lob তথ্য অ্যাক্সেস PasteBin পোস্ট আমার নিজের অতিরিক্ত গবেষণা সঙ্গে, ( টি-SQL স্ক্রিপ্ট lob সার্চ জন্য বিভিন্ন পরিস্থিতিতে পরীক্ষা করার জন্য ) , LOBs ধারাবাহিকভাবে মধ্যে অ্যাক্সেস করা হয় SELECT, SELECT INTO, SELECT @XmlVariable = XmlColumn, SELECT @XmlVariable = XmlColumn.query(N'/'), এবং SELECT @NVarCharVariable = CONVERT(NVARCHAR(MAX), XmlColumn)। সুতরাং আমাদের বিকল্পগুলি এখানে কিছুটা সীমিত, তবে এখানে যা করা যায় তা এখানে:

    1. এসএসএমএস বা এসকিউএলসিএমডি.এক্সই, এসকিউএল সার্ভারে চলমান সার্ভারে ক্যোয়ারী চালিয়ে নেটওয়ার্ক সংক্রান্ত সমস্যাগুলি সমাধান করুন।
    2. এসএসএমএসে ক্লায়েন্ট সম্পর্কিত সমস্যাগুলি কোয়েরি বিকল্পগুলি -> ফলাফল -> গ্রিডে গিয়ে "মৃত্যুদন্ড কার্যকর করার পরে ফলাফলগুলি বাতিল করুন" বিকল্পটি পরীক্ষা করে নিয়ম করুন। দয়া করে মনে রাখবেন যে এই বিকল্পটি বার্তা সহ সমস্ত আউটপুট প্রতিরোধ করবে, তবে এসএসএমএসের প্রতি সারিতে প্রতিটি মেমরি বরাদ্দ করতে এবং তারপরে গ্রিডে আঁকতে সময় লাগতে কার্যকর হতে পারে।
      অন্যথা, আপনি SQLCMD.EXE মাধ্যমে ক্যোয়ারী নির্বাহ এবং আউটপুট মাধ্যমে কোথাও না যেতে নির্দেশ পারে: -o NUL:
  4. এই ক্যোয়ারির সাথে কি কোনও ওয়েট টাইপ যুক্ত? যদি হ্যাঁ, তবে অপেক্ষা প্রকারটি কী?
  5. কলামগুলি ফিরে আসার জন্য প্রকৃত ডেটার আকারটি কী ? পুরো টেবিল জুড়ে column কলামটির গড় আকারটি সত্যিই কিছু যায় আসে না, যদি "শীর্ষস্থানীয় 1000" সারিগুলিতে মোট তথ্যের তুলনামূলকভাবে বড় অংশ থাকে । আপনি যদি শীর্ষ 1000 সারি সম্পর্কে জানতে চান তবে সেই সারিগুলি দেখুন at দয়া করে নিম্নলিখিতটি চালান:XMLXML

    SELECT TOP 1000 tab.*,
           SUM(DATALENGTH(tab.XmlColumn)) / 1024.0 AS [TotalXmlKBytes],
           AVG(DATALENGTH(tab.XmlColumn)) / 1024.0 AS [AverageXmlKBytes]
           STDEV(DATALENGTH(tab.XmlColumn)) / 1024.0 AS [StandardDeviationForXmlKBytes]
    FROM   SchemaName.TableName tab;
    
  6. সঠিক টেবিল স্কিমা। সমস্ত সূচী সহ পুরো CREATE TABLE বিবৃতি প্রদান করুন ।
  7. প্রশ্ন পরিকল্পনা? এটি কি এমন কিছু যা আপনি পোস্ট করতে পারেন? এই তথ্যটি সম্ভবত কোনও পরিবর্তন করবে না, তবে এটি জেনে রাখা ভাল যে এটি অনুমান করার চেয়ে এটি নয় এবং ভুল হবে না ;-)
  8. ডেটা ফাইলে কি শারীরিক / বাহ্যিক খণ্ডন আছে? যদিও এটি এখানে কোনও বৃহত ফ্যাক্টর নাও হতে পারে, যেহেতু আপনি "গ্রাহক-গ্রেড এসটিএ" ব্যবহার করছেন এবং এসএসডি বা এমনকি অতি-ব্যয়বহুল এসটিএ ব্যবহার করছেন না, উপ-অনুকূলভাবে আদেশিত খাতগুলির প্রভাব আরও লক্ষণীয় হবে, বিশেষত sectors খাতগুলির সংখ্যা হিসাবে যে পড়তে হবে বৃদ্ধি।
  9. নিম্নলিখিত কোয়েরির সঠিক ফলাফলগুলি কী :

    SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(),
                              OBJECT_ID(N'dbo.SchemaName.TableName'), 1, 0, N'LIMITED');
    

হালনাগাদ

আমার সাথে এটি ঘটেছিল যে আমার অনুরূপ আচরণের অভিজ্ঞতা আছে কিনা তা দেখার জন্য আমার এই দৃশ্যটি পুনরুত্পাদন করার চেষ্টা করা উচিত। সুতরাং, আমি বেশ কয়েকটি কলাম (প্রশ্নে অস্পষ্ট বর্ণনার অনুরূপ) সহ একটি টেবিল তৈরি করেছি এবং এরপরে এটি 1 মিলিয়ন সারি দিয়ে পপুলেট করেছি এবং এক্সএমএল কলামটিতে সারি প্রতি প্রায় 15k ডেটা রয়েছে (নীচের কোডটি দেখুন)।

যা আমি পেয়েছি তা হ'ল SELECT TOP 1000 * FROM TABLEপ্রথমবারের মতো 8 সেকেন্ডে সম্পূর্ণ করা এবং তারপরে প্রতিবার 2 - 4 সেকেন্ড (হ্যাঁ, ক্যোয়ারীর DBCC DROPCLEANBUFFERSপ্রতিটি রানের আগে নির্বাহ করা SELECT *)। এবং আমার বেশ কয়েক বছরের পুরানো ল্যাপটপটি দ্রুত নয় : এসকিউএল সার্ভার 2012 এসপি 2 বিকাশকারী সংস্করণ, bit৪ বিট, 6 জিবি র‌্যাম, দ্বৈত 2.5 গিগাহার কোর আই 5, এবং একটি 5400 আরপিএম সাটা ড্রাইভ। আমি এসএসএমএস 2014, এসকিউএল সার্ভার এক্সপ্রেস 2014, ক্রোম এবং অন্যান্য বেশ কয়েকটি জিনিসও চালাচ্ছি।

আমার সিস্টেমের প্রতিক্রিয়া সময়ের উপর ভিত্তি করে, আমি আবার বলব যে 20 - 25 সেকেন্ডের প্রতিক্রিয়া সময়টির কারণ সঙ্কুচিত করতে আমাদের আরও তথ্য (যেমন সারণী এবং ডেটা সম্পর্কে সুনির্দিষ্ট, প্রস্তাবিত পরীক্ষাগুলির ফলাফল ইত্যাদি) প্রয়োজন need যে আপনি দেখছেন।

SET ANSI_NULLS, NOCOUNT ON;
GO

IF (OBJECT_ID(N'dbo.XmlReadTest') IS NOT NULL)
BEGIN
    PRINT N'Dropping table...';
    DROP TABLE dbo.XmlReadTest;
END;

PRINT N'Creating table...';
CREATE TABLE dbo.XmlReadTest 
(
    ID INT NOT NULL IDENTITY(1, 1),
    Col2 BIGINT,
    Col3 UNIQUEIDENTIFIER,
    Col4 DATETIME,
    Col5 XML,
    CONSTRAINT [PK_XmlReadTest] PRIMARY KEY CLUSTERED ([ID])
);
GO

DECLARE @MaxSets INT = 1000,
        @CurrentSet INT = 1;

WHILE (@CurrentSet <= @MaxSets)
BEGIN
    RAISERROR(N'Populating data (1000 sets of 1000 rows); Set # %d ...',
              10, 1, @CurrentSet) WITH NOWAIT;
    INSERT INTO dbo.XmlReadTest (Col2, Col3, Col4, Col5)
        SELECT  TOP 1000
                CONVERT(BIGINT, CRYPT_GEN_RANDOM(8)),
                NEWID(),
                GETDATE(),
                N'<test>'
                  + REPLICATE(CONVERT(NVARCHAR(MAX), CRYPT_GEN_RANDOM(1), 2), 3750)
                  + N'</test>'
        FROM        [master].[sys].all_columns sac1;

    IF ((@CurrentSet % 100) = 0)
    BEGIN
        RAISERROR(N'Executing CHECKPOINT ...', 10, 1) WITH NOWAIT;
        CHECKPOINT;
    END;

    SET @CurrentSet += 1;
END;

--

SELECT COUNT(*) FROM dbo.XmlReadTest; -- Verify that we have 1 million rows

-- O.P. states that the "clustered index fragmentation is close to 0%"
ALTER INDEX [PK_XmlReadTest] ON dbo.XmlReadTest REBUILD WITH (FILLFACTOR = 90);
CHECKPOINT;

--

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;

SET STATISTICS IO, TIME ON;
SELECT TOP 1000 * FROM dbo.XmlReadTest;
SET STATISTICS IO, TIME OFF;

/*
Scan count 1, logical reads 21,       physical reads 1,     read-ahead reads 4436,
              lob logical reads 5676, lob physical reads 1, lob read-ahead reads 3967.

 SQL Server Execution Times:
   CPU time = 171 ms,  elapsed time = 8329 ms.
*/

এবং, যেহেতু আমরা অ-এলওবি পৃষ্ঠাগুলি পড়তে সময় নির্ধারণ করতে চাই, এক্সএমএল কলাম ব্যতীত (আমি উপরে প্রস্তাবিত পরীক্ষাগুলির মধ্যে একটি) সমস্ত বেছে নেওয়ার জন্য আমি নিম্নলিখিত কোয়েরিটি চালিয়েছি। এটি মোটামুটি ধারাবাহিকভাবে 1.5 সেকেন্ডে ফিরে আসে।

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;

SET STATISTICS IO, TIME ON;
SELECT TOP 1000 ID, Col2, Col3, Col4 FROM dbo.XmlReadTest;
SET STATISTICS IO, TIME OFF;

/*
Scan count 1, logical reads 21,    physical reads 1,     read-ahead reads 4436,
              lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 1666 ms.
*/

উপসংহার (এই মুহুর্তের জন্য)
আপনার দৃশ্যের পুনঃনির্ধারণের প্রয়াসের ভিত্তিতে, আমি মনে করি না যে আমরা SATA ড্রাইভ বা অ-অনুক্রমিক I / O কে 20 - 25 সেকেন্ডের মূল কারণ হিসাবে চিহ্নিত করতে পারি, বিশেষত কারণ আমরা এখনও এক্সএমএল কলামটি অন্তর্ভুক্ত না করে ক্যোরি কত দ্রুত ফিরে আসে তা জানেন না don't এবং আপনি যে বড় বড় লজিকাল রিডস (নন-এলওবি) প্রদর্শন করছেন তা পুনরুত্পাদন করতে পারিনি, তবে আমার অনুভূতি রয়েছে যে এর প্রতিবেদনে এবং প্রতিটি বিবৃতিতে আমার প্রতিটি সারিতে আরও তথ্য যুক্ত করতে হবে :

Table 90% সারণী পৃষ্ঠাগুলি LOB_DATA

আমার টেবিলটিতে 1 মিলিয়ন সারি রয়েছে, প্রত্যেকের XML ডেটা মাত্র 15 sys.dm_db_index_physical_statsকিলো বেশি রয়েছে এবং এটি দেখায় যে 2 মিলিয়ন LOB_DATA পৃষ্ঠা রয়েছে। বাকি 10% তখন 222k IN_ROW ডেটা পৃষ্ঠাগুলি হবে, তবুও আমার কাছে কেবল তার মধ্যে 11,630 রয়েছে। সুতরাং আবারও, আমাদের আসল টেবিল স্কিমা এবং প্রকৃত ডেটা সম্পর্কিত আরও তথ্য প্রয়োজন।



10

আমি কি এই ভেবে সঠিক হয়ে গেছি যে LOB_DATA পৃষ্ঠাগুলি কেবল তাদের আকারের কারণে নয়, কারণ এসকিউএল সার্ভার ক্লাস্টারড সূচককে কার্যকরভাবে স্ক্যান করতে পারে না বলে ধীর স্ক্যান করতে পারে

হ্যাঁ, সারি-মধ্যে সঞ্চিত LOB ডেটা পড়ার ফলে ক্রমবর্ধমান আইওর পরিবর্তে এলোমেলো আইও বাড়ে। এটি দ্রুত বা ধীর কেন র্যান্ডম রিড আইওপিএস তা বুঝতে এখানে ডিস্ক পারফরম্যান্স মেট্রিক ব্যবহার করতে হবে।

এলওবি ডেটা একটি গাছের কাঠামোতে সংরক্ষণ করা হয় যেখানে ক্লাস্টারড ইনডেক্সের ডেটা পৃষ্ঠাটি একটি এলওবি ডেটা পৃষ্ঠায় একটি এলওবি ডেটা পৃষ্ঠায় নির্দেশ করে যা ফলস্বরূপ আসল এলওবি ডেটাতে নির্দেশ করে। ক্লাস্টারড ইনডেক্স এসকিউএল সার্ভারের রুট নোডগুলি অনুসরণ করার সময় সিক্যুয়ালিটি রিডের মাধ্যমে কেবল ইন-সারি ডেটা পেতে পারে। LOB ডেটা পেতে এসকিউএল সার্ভারকে ডিস্কের অন্য কোথাও যেতে হবে।

আমি অনুমান করি যে আপনি যদি এসএসডি ডিস্কে পরিবর্তিত হন তবে আপনি এসএসডি-র জন্য এলোমেলো আইওপিএস কোনও স্পিনিং ডিস্কের চেয়ে বেশি উচ্চমানের থেকে এতটা ভোগ করবেন না।

এ জাতীয় টেবিলের কাঠামো / ডাটা প্যাটার্ন যুক্তিযুক্ত হওয়া কি যুক্তিযুক্ত বলে বিবেচিত হয়?

হ্যাঁ এটা হতে পারে। এই টেবিলটি আপনার জন্য কী করছে তার উপর নির্ভর করে।

সাধারণত এসকিউএল সার্ভারে এক্সএমএলের সাথে পারফরম্যান্সের সমস্যাগুলি ঘটে থাকে আপনি যখন এক্সএমএলটিতে কোয়েরি করতে টি-এসকিউএল ব্যবহার করতে চান এবং আরও বেশি কিছু যখন আপনি এক্সএমএল থেকে কোনও অনুচ্ছেদে যেখানে কোনও ক্লজ বা যোগদানের মান ব্যবহার করতে চান। যদি এমনটি হয় তবে আপনি সম্পত্তি প্রচার বা নির্বাচনী এক্সএমএল সূচকগুলি দেখতে পারেন বা পরিবর্তে আপনার টেবিলগুলিতে এক্সএমএলকে ছাঁটাতে আপনার টেবিলের কাঠামোগুলির একটি নতুন নকশা দেখতে পারেন।

আমি সংকোচনের চেষ্টা করেছি

আমি 10 বছরেরও বেশি আগে কোনও প্রোডাক্টে একবার এটি করেছি এবং তখন থেকেই আফসোস করেছি। আমি টি-এসকিউএল ব্যবহার করে ডেটা নিয়ে কাজ করতে সক্ষম হচ্ছিলাম না, তাই এড়াতে পারলে আমি কারও কাছে এটির পরামর্শ দেব না।


ধন্যবাদ উত্তরের জন্য অনেক। সংক্ষেপণের বিষয়ে: আমি নিশ্চিত নই যে এইরকম কঠোর বিরোধী-সুপারিশটি ন্যায়সঙ্গত কিনা, যেহেতু টি-এসকিউএল থেকে তথ্যটি অবশ্যই সঞ্চিত ডেটার প্রকৃতির উপর নির্ভর করে। আমার ক্ষেত্রে, আমি আপাতত সংকোচনের সাথে যাওয়ার সিদ্ধান্ত নিয়েছি।
আলেকজান্ডার শিলেমিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.