এক্সএমএল ক্ষেত্রের উপস্থিতি বেশিরভাগ টেবিলের ডেটা এলওবি_ডাটা পৃষ্ঠাগুলিতে অবস্থিত করে (আসলে table 90% সারণী পৃষ্ঠাগুলি LOB_DATA) are
কেবলমাত্র টেবিলে এক্সএমএল কলামটি থাকার ফলে এর প্রভাব নেই। এটা তোলে এক্সএমএল উপস্থিতি ডেটা , যে কিছু অবস্থার অধীনে , কারণ একটি সারিতে এর কিছু ডেটা অংশ সারি বন্ধ সঞ্চিত হবে, LOB_DATA পাতায়। এবং যখন একজন (বা হতে পারে বেশ কয়েকটি ;-) এই তর্ক করতে পারে তবে XML
কলামটি বোঝায় যে এক্সএমএল ডেটা সত্যই থাকবে, এটি নিশ্চিত নয় যে এক্সএমএল ডেটা সারি থেকে সঞ্চিত রাখতে হবে: যদি না সারিটি ইতিমধ্যে যথেষ্ট পরিমাণে ভরাট না হয়) তাদের কোনও এক্সএমএল ডেটা হওয়ার বাইরে, ছোট দস্তাবেজগুলি (8000 বাইট পর্যন্ত) সারণিতে ফিট করতে পারে এবং কোনও এলওবি_ডাটা পৃষ্ঠায় যেতে পারে না।
আমি কি এই ভেবে সঠিক হয়েছি যে LOB_DATA পৃষ্ঠাগুলি কেবল তাদের আকারের কারণে ধীরে ধীরে স্ক্যানের কারণ হতে পারে তা নয়, যখন টেবিলের অনেকগুলি LOB_DATA পৃষ্ঠাগুলি থাকে তখন এসকিউএল সার্ভার ক্লাস্টারড ইনডেক্স কার্যকরভাবে স্ক্যান করতে পারে না?
স্ক্যানিং বলতে সমস্ত সারি দেখানো বোঝায়। অবশ্যই, যখন কোনও ডেটা পৃষ্ঠাটি পঠিত হয়, তখন কলামগুলির একটি উপসেট বাছাই করা সত্ত্বেও, ইন-সারি ডেটাগুলির সমস্তগুলি পঠিত হয়। এলওবি ডেটার সাথে পার্থক্য হ'ল আপনি যদি সেই কলামটি নির্বাচন না করেন তবে অফ-সারি ডেটাটি পড়বে না। সুতরাং এসকিউএল সার্ভার কতটা দক্ষতার সাথে এই ক্লাস্টারড ইনডেক্সটি স্ক্যান করতে পারে সে সম্পর্কে কোনও সিদ্ধান্তে পৌঁছানো সত্যিই ন্যায়সঙ্গত নয় কারণ আপনি ঠিক এটি পরীক্ষা করেননি (বা আপনি এর অর্ধেক পরীক্ষা করেছেন)। আপনি সমস্ত কলাম নির্বাচন করেছেন, যার মধ্যে এক্সএমএল কলাম রয়েছে, এবং আপনি যেমন উল্লেখ করেছেন, সেখানেই বেশিরভাগ ডেটা অবস্থিত।
সুতরাং আমরা ইতিমধ্যে জানি যে SELECT TOP 1000 *
পরীক্ষাটি কেবল 8 কে ডেটা পৃষ্ঠাগুলি কেবল একটি সারিতেই পড়ছিল না, বরং প্রতি সারি প্রতি অন্য স্থানে ঝাঁপিয়ে পড়ে । যে LOB ডেটার সঠিক কাঠামো এটি কতটা বড় তার ভিত্তিতে পরিবর্তিত হতে পারে। এখানে প্রদর্শিত গবেষণার উপর ভিত্তি করে (ভারচার, ভারবাইনারি, ইত্যাদি ) এর মতো (এমএএক্স) ধরণের এলওবি পয়েন্টারের আকার কত? ) দুটি ধরণের অফ-সারি এলওবি বরাদ্দ রয়েছে:
- ইনলাইন রুট - 8001 এবং 40,000 (সত্যই 42,000) বাইট, স্পেস অনুমতি সহ ডেটাগুলির জন্য, সেখানে ROW এ 1 থেকে 5 পয়েন্টার (24 - 72 বাইট) থাকবে যা সরাসরি এলওবি পৃষ্ঠায় (গুলি) যাবে।
- 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 বাইট রয়েছে এবং তার FILLFACTOR
100 টি রয়েছে, তারপরে:
কোনও সংকোচনের নয়: 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 মিলিয়ন সারি রয়েছে
- টেবিলের আকার প্রায় 15 জিবি
- ছক এক ধারণ করে
XML
কলাম এবং ধরনের বেশ কয়েকটি কলাম: INT
, BIGINT
, UNIQUEIDENTIFIER
, "ইত্যাদি"
XML
কলামে "আকার", হয় গড়ে প্রায় 15k
- দৌড়ানোর পরে
DBCC DROPCLEANBUFFERS
, নিম্নলিখিত কোয়েরিটি শেষ হতে 20 - 25 সেকেন্ড সময় লাগে:SELECT TOP 1000 * FROM TABLE
- ক্লাস্টার্ড সূচকটি স্ক্যান করা হচ্ছে
- ক্লাস্টারড ইনডেক্সে খণ্ডন 0% এর কাছাকাছি
আমরা কী জানি আমরা জানি:
- এই প্রশ্নের বাইরে অন্য কোনও ডিস্ক ক্রিয়াকলাপ নেই। তুমি কি নিশ্চিত? এমনকি যদি অন্য কোনও ব্যবহারকারীর জিজ্ঞাস্য নাও থাকে, তখনও কি ব্যাকগ্রাউন্ড অপারেশনগুলি চলছে? এসকিউএল সার্ভারের বহিরাগত প্রক্রিয়াগুলি কি একই মেশিনে চলছে যা কিছু আইও গ্রহণ করতে পারে? সেখানে নাও থাকতে পারে তবে কেবলমাত্র সরবরাহ করা তথ্যের ভিত্তিতে এটি পরিষ্কার নয়।
- 15 এমবি এক্সএমএল ডেটা ফিরিয়ে দেওয়া হচ্ছে। এই সংখ্যাটি কিসের উপর ভিত্তি করে? 1000 সারি থেকে প্রাপ্ত একটি অনুমান প্রতি সারিতে XML ডেটার গড় 15 কে গুণ? বা সেই ক্যোয়ারির জন্য কী প্রাপ্ত হয়েছিল তার একটি প্রোগ্রাম্যাটিক সংহতকরণ? যদি এটি কেবল অনুমান হয় তবে আমি এটির উপর নির্ভর করব না যেহেতু এক্সএমএল ডেটা বিতরণ এমনকি সাধারণ গড় দ্বারা বোঝানো পদ্ধতিতেও নাও হতে পারে।
এক্সএমএল সংক্ষেপণ সাহায্য করতে পারে। আপনি নেট কিভাবে সংক্ষেপণ করতে হবে? এর মাধ্যমে GZipStream বা DeflateStream শ্রেণীর? এটি কোনও শূন্য-ব্যয়ের বিকল্প নয়। এটি অবশ্যই একটি বিশাল শতাংশ দ্বারা কিছু ডেটা সংকুচিত করবে, তবে এটির জন্য আরও সিপিইউ প্রয়োজন হবে কারণ আপনাকে প্রতিটি সময় ডেটা সংকুচিত / সংক্ষেপিত করতে অতিরিক্ত প্রক্রিয়া প্রয়োজন। এই পরিকল্পনাটি আপনার এই ক্ষমতাটি পুরোপুরি সরিয়ে ফেলবে:
- ক্যোয়ারী মাধ্যমে এক্সএমএল তথ্য
.nodes
, .value
, .query
, এবং .modify
এক্সএমএল ফাংশন।
এক্সএমএল ডেটা সূচী করুন।
দয়া করে মনে রাখবেন (যেহেতু আপনি উল্লেখ করেছেন যে এক্সএমএল "অত্যন্ত রিডানড্যান্ট") যে XML
ডেটাটাইপটি ইতিমধ্যে অনুকূলিত হয়েছে যে এটি একটি অভিধানে উপাদান এবং বৈশিষ্ট্যগুলির নাম সংরক্ষণ করে, প্রতিটি আইটেমের জন্য একটি পূর্ণসংখ্যার সূচক ID নির্ধারণ করে এবং তারপরে পূর্ণসংখ্যা আইডি ব্যবহার করে পুরো দস্তাবেজ জুড়ে (অতএব এটি প্রতিটি ব্যবহারের পুরো নামটির পুনরাবৃত্তি করে না, আবার এটি উপাদানগুলির জন্য ক্লোজিং ট্যাগ হিসাবে পুনরাবৃত্তি করে না)। আসল ডেটাতে বহিরাগত সাদা স্থানও সরানো আছে। এ কারণেই এক্সট্রাক্ট এক্সএমএল ডকুমেন্টগুলি তাদের মূল কাঠামো ধরে রাখে না এবং খালি উপাদানগুলি কেন সেগুলিতে প্রবেশ করে <element />
এমনভাবে কেন নিষ্কাশন করে<element></element>
। সুতরাং জিজেপ (বা অন্য কিছু) এর মাধ্যমে সংকোচনের কোনও লাভ কেবলমাত্র উপাদান এবং / বা গুণাবলীকে কমপ্রেস করেই পাওয়া যাবে যা বেশিরভাগ প্রত্যাশার তুলনায় উন্নত হতে পারে এবং এটি সম্ভবত ক্ষতি হ্রাসের যোগ্য নয় ক্ষমতা উপরে উল্লিখিত হিসাবে।
দয়া করে এও মনে রাখবেন যে এক্সএমএল ডেটা সংকুচিত করা এবং VARBINARY(MAX)
ফলাফল সংরক্ষণ করা LOB অ্যাক্সেসকে হারাবে না, এটি কেবল এটি হ্রাস করবে। সারিটিতে থাকা বাকী ডেটার আকারের উপর নির্ভর করে, সংকোচিত মানটি সারি-তে সজ্জিত হতে পারে বা এটির জন্য এখনও LOB পৃষ্ঠাগুলির প্রয়োজন হতে পারে।
তথ্যটি সহায়ক হলেও এটি যথেষ্ট পর্যাপ্ত নয়। ক্যোয়ারি পারফরম্যান্সকে প্রভাবিত করে এমন অনেকগুলি উপাদান রয়েছে, তাই আমাদের কী চলছে তার একটি আরও বিশদ চিত্রের প্রয়োজন।
আমরা যা জানি না, তবে এটির দরকার:
SELECT *
পদার্থের পারফরম্যান্স কেন? এটি কি কোড হিসাবে আপনি ব্যবহার করেন এমন একটি প্যাটার্ন। যদি তাই হয় তবে কেন?
- কেবলমাত্র এক্সএমএল কলাম নির্বাচন করার পারফরম্যান্সটি কী? যদি আপনি শুধু কি পরিসংখ্যান এবং সময়জ্ঞান কি আছেন:
SELECT TOP 1000 XmlColumn FROM TABLE;
?
এই 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)
। সুতরাং আমাদের বিকল্পগুলি এখানে কিছুটা সীমিত, তবে এখানে যা করা যায় তা এখানে:
- এসএসএমএস বা এসকিউএলসিএমডি.এক্সই, এসকিউএল সার্ভারে চলমান সার্ভারে ক্যোয়ারী চালিয়ে নেটওয়ার্ক সংক্রান্ত সমস্যাগুলি সমাধান করুন।
- এসএসএমএসে ক্লায়েন্ট সম্পর্কিত সমস্যাগুলি কোয়েরি বিকল্পগুলি -> ফলাফল -> গ্রিডে গিয়ে "মৃত্যুদন্ড কার্যকর করার পরে ফলাফলগুলি বাতিল করুন" বিকল্পটি পরীক্ষা করে নিয়ম করুন। দয়া করে মনে রাখবেন যে এই বিকল্পটি বার্তা সহ সমস্ত আউটপুট প্রতিরোধ করবে, তবে এসএসএমএসের প্রতি সারিতে প্রতিটি মেমরি বরাদ্দ করতে এবং তারপরে গ্রিডে আঁকতে সময় লাগতে কার্যকর হতে পারে।
অন্যথা, আপনি SQLCMD.EXE মাধ্যমে ক্যোয়ারী নির্বাহ এবং আউটপুট মাধ্যমে কোথাও না যেতে নির্দেশ পারে: -o NUL:
।
- এই ক্যোয়ারির সাথে কি কোনও ওয়েট টাইপ যুক্ত? যদি হ্যাঁ, তবে অপেক্ষা প্রকারটি কী?
কলামগুলি ফিরে আসার জন্য প্রকৃত ডেটার আকারটি কী ? পুরো টেবিল জুড়ে column কলামটির গড় আকারটি সত্যিই কিছু যায় আসে না, যদি "শীর্ষস্থানীয় 1000" সারিগুলিতে মোট তথ্যের তুলনামূলকভাবে বড় অংশ থাকে । আপনি যদি শীর্ষ 1000 সারি সম্পর্কে জানতে চান তবে সেই সারিগুলি দেখুন at দয়া করে নিম্নলিখিতটি চালান:XML
XML
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;
- সঠিক টেবিল স্কিমা। সমস্ত সূচী সহ পুরো
CREATE TABLE
বিবৃতি প্রদান করুন ।
- প্রশ্ন পরিকল্পনা? এটি কি এমন কিছু যা আপনি পোস্ট করতে পারেন? এই তথ্যটি সম্ভবত কোনও পরিবর্তন করবে না, তবে এটি জেনে রাখা ভাল যে এটি অনুমান করার চেয়ে এটি নয় এবং ভুল হবে না ;-)
- ডেটা ফাইলে কি শারীরিক / বাহ্যিক খণ্ডন আছে? যদিও এটি এখানে কোনও বৃহত ফ্যাক্টর নাও হতে পারে, যেহেতু আপনি "গ্রাহক-গ্রেড এসটিএ" ব্যবহার করছেন এবং এসএসডি বা এমনকি অতি-ব্যয়বহুল এসটিএ ব্যবহার করছেন না, উপ-অনুকূলভাবে আদেশিত খাতগুলির প্রভাব আরও লক্ষণীয় হবে, বিশেষত sectors খাতগুলির সংখ্যা হিসাবে যে পড়তে হবে বৃদ্ধি।
নিম্নলিখিত কোয়েরির সঠিক ফলাফলগুলি কী :
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 রয়েছে। সুতরাং আবারও, আমাদের আসল টেবিল স্কিমা এবং প্রকৃত ডেটা সম্পর্কিত আরও তথ্য প্রয়োজন।