টেন্যান্টআইডি প্রথম:এটি মোটেই নির্বাচনী নয়। আপনার যদি 100 টি টেন্যান্টআইডি থাকে তবে 1 মিলিয়ন সারিগুলিতে খুব কম পার্থক্য থাকতে পারে। তবে এসকিউএল সার্ভার জানতে পারে যে টেন্যান্ট এ-এর জন্য একটি কোয়েরি 500,000 সারি পিছনে টেনে তুলবে তবে টেন্যান্ট বি এর জন্য একই কোয়েরিটি কেবল 50 টি সারি But এটিই মূল ব্যথা-বিন্দু। এই পদ্ধতিটি প্যারামিটার স্নিফিংয়ের সমস্যাগুলি অনেক বেড়ে যায় যেখানে কোনও সঞ্চিত প্রক্রিয়ার প্রথম চালক টেন্যান্ট এ এর জন্য হয় এবং কোয়েরি অপটিমাইজারের উপর ভিত্তি করে যথাযথভাবে কাজ করে সেই পরিসংখ্যানগুলি দেখে এবং এটি জেনে যে এটি 500k সারি পাওয়ার দক্ষ হতে হবে। কিন্তু যখন টেন্যান্ট বি, মাত্র 50 টি সারি নিয়ে চালিত হয় তখন কার্যকর করার পরিকল্পনাটি আর উপযুক্ত হয় না এবং বাস্তবে এটি বেশ অনুপযুক্ত। এবং, যেহেতু শীর্ষস্থানীয় ক্ষেত্রের ক্রমে ডেটা প্রবেশ করা হচ্ছে না,
তবে, প্রথম টেন্যান্টআইডি-র একটি সঞ্চিত প্রক্রিয়া চালানোর জন্য, অন্যান্য পদ্ধতির তুলনায় পারফরম্যান্সটি আরও ভাল হওয়া উচিত যেহেতু ডেটা (কমপক্ষে সূচী রক্ষণাবেক্ষণের পরে) শারীরিক এবং যৌক্তিকভাবে এমনভাবে সংগঠিত হবে যেগুলি পূরণ করার জন্য খুব কম তথ্য পৃষ্ঠাগুলির প্রয়োজন হয় প্রশ্নের। এর অর্থ শারীরিক আই / ও, কম যুক্তিসঙ্গত পাঠ, একই ডেটা পৃষ্ঠাগুলির জন্য ভাড়াটেদের মধ্যে কম ঝগড়া, বাফার পুলে কম অপচয় করা স্থান (যার ফলে পেজ লাইফ প্রত্যাশা উন্নত) ইত্যাদি means
এই উন্নত কর্মক্ষমতা পাওয়ার জন্য দুটি মূল ব্যয় রয়েছে are প্রথমটি এতটা কঠিন নয়: বর্ধিত খণ্ডকে প্রতিহত করতে আপনাকে অবশ্যই নিয়মিত সূচী রক্ষণাবেক্ষণ করতে হবে। দ্বিতীয়টি কিছুটা কম মজা।
বর্ধিত প্যারামিটার স্নিফিংয়ের সমস্যাগুলির মোকাবিলা করতে আপনার ভাড়াটেদের মধ্যে কার্যকর করার পরিকল্পনাগুলি পৃথক করা দরকার। সরল পদ্ধতিটি হল WITH RECOMPILE
প্রোস বা OPTION (RECOMPILE)
ক্যোয়ারির ইঙ্গিত ব্যবহার করা , তবে এটি এমন পারফরম্যান্সের উপর আঘাত যা TenantID
প্রথমে রেখে সমস্ত লাভ মুছে ফেলতে পারে । যে পদ্ধতিটি আমি সবচেয়ে ভালভাবে কাজ করেছি তা হ'ল প্যারামিটারাইজড ডায়নামিক এসকিউএল এর মাধ্যমে ব্যবহার করা sp_executesql
। ডায়নামিক এসকিউএল প্রয়োজন হওয়ার কারণ হ'ল টেন্যান্টআইডিটিকে ক্যোয়ারীর পাঠ্যর সাথে যুক্ত করার অনুমতি দেওয়া হয়, অন্যদিকে যে সমস্ত অন্যান্য পূর্বাভাস সাধারণত পরামিতি হবে তা এখনও প্যারামিটার। উদাহরণস্বরূপ, আপনি যদি একটি নির্দিষ্ট আদেশ খুঁজছেন, আপনি যেমন কিছু করতে হবে:
DECLARE @GetOrderSQL NVARCHAR(MAX);
SET @GetOrderSQL = N'
SELECT ord.field1, ord.field2, etc.
FROM dbo.Orders ord
WHERE ord.TenantID = ' + CONVERT(NVARCHAR(10), @TenantID) + N'
AND ord.OrderID = @OrderID_dyn;
';
EXEC sp_executesql
@GetOrderSQL,
N'@OrderID_dyn INT',
@OrderID_dyn = @OrderID;
এর প্রভাবটি হ'ল কেবল সেই টেন্যান্টআইডি-র জন্য পুনরায় ব্যবহারযোগ্য ক্যোয়ারী পরিকল্পনা তৈরি করা যা সেই নির্দিষ্ট টেন্যান্টের ডেটা ভলিউমের সাথে মিলবে। যদি সেই একই টেন্যান্ট এ আবার অন্যটির জন্য সঞ্চিত প্রক্রিয়া চালায় @OrderID
তবে তা সেই ক্যাশেড ক্যোয়ারী প্ল্যানটিকে পুনরায় ব্যবহার করবে। একই স্টোরড পদ্ধতিতে চলমান একটি পৃথক ভাড়াটে একটি কোয়েরি পাঠ্য উত্পন্ন করবে যা কেবল টেন্যান্টআইডি'র মানেই আলাদা ছিল , তবে ক্যোয়ারী পাঠ্যের যে কোনও পার্থক্য একটি আলাদা পরিকল্পনা উত্পন্ন করতে যথেষ্ট। এবং টেন্যান্ট বি এর জন্য উত্পন্ন পরিকল্পনাটি কেবল টেন্যান্ট বি এর সাথে ডেটা ভলিউমের সাথে মেলে না তবে এটি টেন্যান্ট বি এর বিভিন্ন মানগুলির জন্য পুনরায় ব্যবহারযোগ্য হবে @OrderID
(যেহেতু সেই ভবিষ্যদ্বাণীটি এখনও প্যারামিটারাইজড)।
এই পদ্ধতির ডাউনসাইডগুলি হ'ল:
- এটি কেবল একটি সাধারণ ক্যোয়ারিতে টাইপ করার চেয়ে কিছুটা বেশি কাজ (তবে সমস্ত প্রশ্নের ডায়নামিক এসকিউএল হওয়া দরকার না, কেবলমাত্র প্যারামিটার স্নিফিংয়ের সমস্যা রয়েছে)।
- কোনও সিস্টেমে কত ভাড়াটে রয়েছে তার উপর নির্ভর করে এটি পরিকল্পনার ক্যাশের আকার বাড়ায় যেহেতু প্রতিটি প্রশ্নের জন্য এখন টেন্যান্টআইডি প্রতি 1 টি পরিকল্পনা প্রয়োজন যা এটি কল করছে। এটি কোনও সমস্যা নাও হতে পারে তবে সচেতন হওয়ার জন্য অন্তত এমন কিছু বিষয়।
ডায়নামিক এসকিউএল মালিকানা শৃঙ্খলা ভঙ্গ করে, যার অর্থ সারণী পদ্ধতিতে অনুমতি / লেখার মাধ্যমে টেবিলগুলিতে পঠন / লেখার অ্যাক্সেস অনুমান করা যায় না EXECUTE
। সহজ তবে কম সুরক্ষিত ফিক্সটি কেবলমাত্র টেবিলগুলিতে ব্যবহারকারীকে সরাসরি অ্যাক্সেস দেওয়া। এটি অবশ্যই আদর্শ নয়, তবে এটি সাধারণত দ্রুত এবং সহজ জন্য বাণিজ্য off সার্টিফিকেট-ভিত্তিক সুরক্ষা ব্যবহার করা আরও সুরক্ষিত পদ্ধতির। অর্থ, একটি শংসাপত্র তৈরি করুন, তারপরে সেই শংসাপত্রটি থেকে একটি ব্যবহারকারী তৈরি করুন, সেই ব্যবহারকারীকে পছন্দসই অনুমতি প্রদান করুন (একটি শংসাপত্র ভিত্তিক ব্যবহারকারী বা লগইন নিজেই এসকিউএল সার্ভারের সাথে সংযোগ স্থাপন করতে পারে না) এবং তারপরে ডায়নামিক এসকিউএল ব্যবহার করে এমন সঞ্চিত পদ্ধতিতে স্বাক্ষর করুন that ADD স্বাক্ষরের মাধ্যমে একই শংসাপত্র ।
মডিউল স্বাক্ষর এবং শংসাপত্রগুলি সম্পর্কে আরও তথ্যের জন্য, দয়া করে দেখুন: মডিউলসাইনিং.আইনফো