এসকিউএল সার্ভারে পৃষ্ঠা নির্ধারণ


17

আমার কাছে খুব বড় ডাটাবেস, প্রায় 100 জিবি। আমি কোয়েরি সম্পাদন করছি:

select * from <table_name>;

এবং আমি কেবল 100 তম থেকে 200 তম সারি দেখাতে চাই।

অভ্যন্তরীণভাবে এটি কীভাবে হয় তা আমি বুঝতে চাই। ডাটাবেস কি ডিস্ক থেকে সমস্ত রেকর্ডকে মেমরিতে নিয়ে আসে এবং অনুসন্ধান ক্লায়েন্টকে 100 তম থেকে 400 ম সারিটি ফেরত পাঠায়? বা কোনও ব্যবস্থা আছে কি না, যাতে কেবলমাত্র সেই রেকর্ডগুলি (100 তম -200 ম) ডাটাবেস থেকে প্রাপ্ত হয় - বি-গাছ ইত্যাদির সূচক পদ্ধতি ব্যবহার করে?

আমি খুঁজে পেয়েছি যে এটি পৃষ্ঠাবদ্ধকরণ ধারণার সাথে সম্পর্কিত, তবে ডাটাবেস স্তরে অভ্যন্তরীণভাবে কীভাবে ঘটে তা আমি ঠিক খুঁজে পাইনি।

উত্তর:


37

আপনার পোস্ট করা ক্যোয়ারিতে:

select * from <table_name>;

100 ম -200 ম সারিগুলির মতো কোনও জিনিস নেই, কারণ আপনি কোনও অর্ডার দ্বারা নির্দিষ্ট করেন না। আপনি যদি পুরো অনেক আকর্ষণীয় কারণে অর্ডারটি অন্তর্ভুক্ত না করেন তবে অর্ডারের গ্যারান্টিযুক্ত নয় তবে এটি এখানে মূল বিষয় নয়।

সুতরাং আপনার পয়েন্টটি চিত্রিত করতে, আসুন একটি টেবিল ব্যবহার করুন - আমি স্ট্যাক ওভারফ্লো ডেটা ডাম্প থেকে ব্যবহারকারীদের সারণিটি ব্যবহার করব , এবং এই ক্যোয়ারীটি চালাব:

SELECT * FROM dbo.Users ORDER BY DisplayName;

ডিফল্টরূপে, ডিসপ্লেনাম ফিল্ডে কোনও সূচক নেই, সুতরাং এসকিউএল সার্ভারকে পুরো টেবিলটি স্ক্যান করতে হবে, তারপরে এটিকে প্রদর্শন নাম অনুসারে বাছাই করতে হবে। এখানে কার্যকর করার পরিকল্পনা রয়েছে :

একটি সাজানোর সাথে ক্লাস্টারড ইনডেক্স স্ক্যান

এটি সুন্দর নয় - এটি প্রায় 30k এর আনুমানিক সাবট্রি ব্যয়ের সাথে অনেক কাজ। (আপনি এটি প্যাসেটিপ্ল্যানের সিলেক্ট অপারেটরের উপর দিয়ে আপনার মাউসটিকে ঘুরিয়ে দিয়ে দেখতে পাচ্ছেন)) তাহলে আমরা কেবল 100-200 সারি চাইলে কী হয়? আমরা এই সিনট্যাক্সটি এসকিউএল সার্ভার ২০১২+ তে ব্যবহার করতে পারি:

SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;

এটি কার্যকর করার পরিকল্পনাটিও বেশ কুৎসিত:

একটি সাজানো এবং শীর্ষের সাথে ক্লাস্টারড সূচক স্ক্যান

এসকিউএল সার্ভারটি এখনও সজ্জিত তালিকাটি তৈরি করতে পুরো টেবিলটি স্ক্যান করছে কেবল আপনাকে আপনার সারিগুলি 100-200 দেওয়ার জন্য, এবং ব্যয় এখনও 30k এর কাছাকাছি। আরও খারাপ, আপনার জিজ্ঞাসাটি চলার সময় এই পুরো তালিকাটি পুনর্নির্মাণ করা হবে (কারণ সর্বোপরি, কেউ তাদের ডিসপ্লে নাম পরিবর্তন করে থাকতে পারে))

এটি আরও দ্রুতগতিতে চালিত করতে, আমরা ডিসপ্লেনামে একটি অবিচ্ছিন্ন সূচক তৈরি করতে পারি, যা আমাদের সারণীর অনুলিপি, সেই নির্দিষ্ট ক্ষেত্রের দ্বারা সাজানো:

CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);

সেই সূচকটি সহ, আমাদের ক্যোয়ারির সম্পাদনের পরিকল্পনা এখন একটি সূচি চায়:

সূচি সন্ধান এবং কী অনুসন্ধান

কোয়েরিটি তাত্ক্ষণিকভাবে শেষ হবে এবং আনুমানিক সাবট্রি ব্যয় রয়েছে মাত্র 0.66 (30 কে বিপরীতে)।

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


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

আপনার উত্তর থেকে, আমি বুঝতে পারি যে যদি ক্ষেত্রটি সূচকযুক্ত হয়, তবে 100 তম থেকে 200 তম সারিটি তৈরি করা যেমন এসকিউএল সূচক (বি-ট্রি ইত্যাদি) পর্যন্ত দেখায় এবং সরাসরি সেই বিন্দুতে চলে যায় (100 তম সারিতে) তবে এমন প্রশ্নগুলি তৈরি করা। আপনি দয়া করে আমাকে বলতে পারেন যদি এটি সঠিক বোঝার হয়?
AV94

আপনার প্রথম প্রশ্ন সম্পর্কে অ্যানিলভেদালা - হ্যাঁ, ডেটা বাছাই করতে হবে। একটি ডাটাবেস অপ্রয়োজনীয় তালিকা সহ এটি কীভাবে সম্পাদন করতে পারে?
ব্রেন্ট ওজার

1
। আপনার দ্বিতীয় প্রশ্ন সম্পর্কে @AnilVedala - (। তুমি কেমন, একটি মৃত্যুদন্ড পরিকল্পনা পড়া গ্রান্ট Fritchey বই এক্সেকিউশন প্ল্যান নিতে সম্পর্কে জিজ্ঞাসা করা করছি) যে যেখানে গত সঞ্চালনের পরিকল্পনা আমি আপনার দেওয়া আসে
ব্রেন্ট Ozar

15

কোন ধরণের এড়ানোর জন্য নন কভারিং সূচক ব্যবহার করার সময় যেমন ব্রেন্টের উত্তরের সংযোজন হ'ল পরবর্তী পৃষ্ঠা নম্বরগুলি সহ একটি সম্ভাব্য সমস্যা রয়েছে যা নীচে চালানো থেকে দেখা যায়

SELECT * 
FROM dbo.Users 
ORDER BY DisplayName 
OFFSET 100000 ROWS 
FETCH NEXT 100 ROWS ONLY;

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

এখানে চিত্র বর্ণনা লিখুন

নীচের প্যাটার্নটি ব্যবহার করে এটি প্রশমিত করা যায়

WITH T
     AS (SELECT Id,
                DisplayName
         FROM   dbo.Users
         ORDER  BY DisplayName
        OFFSET 100000 ROWS 
        FETCH NEXT 100 ROWS ONLY
        )
SELECT U.*
FROM   dbo.Users U
       JOIN T
         ON U.Id = T.Id
ORDER  BY T.DisplayName 

লুপআপগুলি করার আগে এটি চূড়ান্ত 100 টি সারি বাদে সমস্ত ফিল্টার করে যা বড় অফসেট মানের জন্য গতিতে উল্লেখযোগ্য প্রভাব ফেলতে পারে।

এখানে চিত্র বর্ণনা লিখুন


3

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

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

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