আমার একটি এসকিউএল সার্ভার ডাটাবেস রয়েছে যেখানে ক্যোয়ারীগুলি বেশ ধীর গতিতে রয়েছে এবং প্রচুর লকিং এবং ব্লকিং রয়েছে।
আমি যখন অনুপস্থিত সূচক ডিএমভিগুলি এবং ক্যোয়ারী পরিকল্পনাগুলি দেখি তখন কোনও পরামর্শ নেই।
কেন এমন?
আমার একটি এসকিউএল সার্ভার ডাটাবেস রয়েছে যেখানে ক্যোয়ারীগুলি বেশ ধীর গতিতে রয়েছে এবং প্রচুর লকিং এবং ব্লকিং রয়েছে।
আমি যখন অনুপস্থিত সূচক ডিএমভিগুলি এবং ক্যোয়ারী পরিকল্পনাগুলি দেখি তখন কোনও পরামর্শ নেই।
কেন এমন?
উত্তর:
আমরা আরও কয়েকটি কারণের কয়েকটি কারণ বিবেচনা করব এবং বৈশিষ্ট্যের কিছু সাধারণ সীমাবদ্ধতা সম্পর্কেও কথা বলব।
প্রথম, এর থেকে: অনুপস্থিত সূচকগুলির সীমাবদ্ধতা :
- এটি কোনও সূচীতে কলামগুলি ব্যবহার করার জন্য কোনও অর্ডার নির্দিষ্ট করে না।
এই প্রশ্নোত্তর হিসাবে উল্লিখিত হিসাবে: এসকিউএল সার্ভার কীভাবে অনুপস্থিত সূচির অনুরোধগুলিতে কী কলামের ক্রম নির্ধারণ করে? , সূচী সংজ্ঞায় কলামগুলির ক্রমটি ইক্যুয়ালিটি বনাম অসমতার পূর্বাভাস দ্বারা নির্ধারিত হয়, এবং তারপরে সারণীতে কলামের অর্ডিনাল অবস্থান।
নির্বাচনের কোনও অনুমান নেই, এবং আরও ভাল অর্ডার পাওয়া যেতে পারে। এটি নির্ধারণ করা আপনার কাজ।
বিশেষ সূচকসমূহ
অনুপস্থিত সূচক অনুরোধগুলি 'বিশেষ' সূচিগুলিও কভার করে না, যেমন:
অনুপস্থিত সূচক কী কলামগুলি ফলাফলগুলি ফিল্টার করতে ব্যবহৃত কলামগুলি থেকে তৈরি করা হয়েছে যেমন:
অনুপস্থিত সূচক অন্তর্ভুক্ত কলামগুলি কোয়েরির মতো প্রয়োজনীয় কলামগুলি থেকে তৈরি করা হয়েছে যেমন:
যদিও বেশিরভাগ ক্ষেত্রেই আপনি কলামগুলি অর্ডার করছেন বা গোষ্ঠীভুক্ত করছেন মূল কলাম হিসাবে উপকারী হতে পারে। এটি সীমাবদ্ধতার একটিতে ফিরে যায়:
- এটি সূচীকরণ কনফিগারেশন টিউন করার উদ্দেশ্যে নয়।
উদাহরণস্বরূপ, লাস্টঅ্যাক্সেসডেটে একটি সূচক যুক্ত করা বাছাইয়ের (এবং ডিস্কে ছড়িয়ে পড়ার) প্রতিরোধ করা সত্ত্বেও, এই কোয়েরিটি অনুপস্থিত সূচক অনুরোধটি নিবন্ধ করবে না।
SELECT TOP (1000) u.DisplayName
FROM dbo.Users AS u
ORDER BY u.LastAccessDate DESC;
বা অবস্থানের উপর এই গ্রুপিং কোয়েরি করে না।
SELECT TOP (20000) u.Location
FROM dbo.Users AS u
GROUP BY u.Location
হ্যাঁ, তবে এটি কোনও কিছুর চেয়ে ভাল। কান্নাকাটি শিশুর মতো সূচি অনুরোধগুলি হারিয়ে যাওয়ার কথা ভাবুন। আপনি জানেন যে সমস্যা আছে, তবে সমস্যাটি কী তা বোঝার জন্য প্রাপ্তবয়স্ক হিসাবে এটি আপনার উপর নির্ভর করে।
আরাম করুন, বকো আমরা সেখানে পৌঁছে যাচ্ছি।
আপনি যদি টিএফ 2330 সক্ষম করেন , অনুপস্থিত সূচক অনুরোধগুলি লগ করা হবে না। আপনি এটি সক্ষম করেছেন কিনা তা জানতে, এটি চালান:
DBCC TRACESTATUS;
পুনর্নির্মাণ সূচিগুলি অনুপস্থিত সূচকগুলির অনুরোধগুলি সাফ করবে। সুতরাং আপনি হাই-হো-সিলভার-অ্যাওয়ে প্রতিটি সূচি পুনরায় তৈরি করার আগে দ্বিতীয় ভাগে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো পরিষ্কার করার পরে,
আপনি কেন আপনার সূচকে Defragmenting সহায়তা করছেন না, সে সম্পর্কেও ভাবতে চাইতে পারেন । যদি না আপনি কলামস্টোর ব্যবহার করেন ।
একটি সূচি যোগ করা, অপসারণ করা বা অক্ষম করা that সারণীর জন্য সমস্ত অনুপস্থিত সূচক অনুরোধ সাফ করবে। আপনি যদি একই টেবিলে বেশ কয়েকটি সূচি পরিবর্তনের মধ্য দিয়ে কাজ করছেন তবে নিশ্চিত হয়ে নিন যে কোনও তৈরির আগে আপনি সেগুলি স্ক্রিপ্ট করে ফেলেছেন।
যদি কোনও পরিকল্পনা যথেষ্ট সহজ হয় এবং সূচকের অ্যাক্সেস পছন্দটি যথেষ্ট সুস্পষ্ট হয় এবং ব্যয়ও যথেষ্ট কম হয় তবে আপনি একটি তুচ্ছ পরিকল্পনা পাবেন get
এর কার্যকরভাবে অর্থ হ'ল অপ্টিমাইজারটি নিতে কোনও ব্যয় ভিত্তিক সিদ্ধান্ত ছিল না।
পল হোয়াইট মাধ্যমে :
তুচ্ছ পরিকল্পনা থেকে কোন ধরণের কোয়েরিটি উপকার করতে পারে তার বিশদটি প্রায়শই পরিবর্তিত হয়, তবে যোগদান, সাবকিউরি এবং অসমতার পূর্বাভাসের মতো বিষয়গুলি সাধারণত এই অপ্টিমাইজেশনটিকে আটকা দেয়।
যখন কোনও পরিকল্পনা তুচ্ছ হয়, অতিরিক্ত অপ্টিমাইজেশন পর্যায়গুলি অন্বেষণ করা হয় না এবং অনুপস্থিত সূচকের অনুরোধ করা হয় না ।
এই প্রশ্নগুলি এবং তাদের পরিকল্পনার মধ্যে পার্থক্য দেখুন :
SELECT *
FROM dbo.Users AS u
WHERE u.Reputation = 2;
SELECT *
FROM dbo.Users AS u
WHERE u.Reputation = 2
AND 1 = (SELECT 1);
প্রথম পরিকল্পনাটি তুচ্ছ, এবং কোনও অনুরোধ দেখানো হয় না। কিছু ক্ষেত্রে থাকতে পারে যে বাগগুলি কোয়েরি পরিকল্পনাগুলিতে অনুপস্থিত সূচীগুলি উপস্থিত হতে বাধা দেয়; যদিও এগুলি সাধারণত নিখোঁজ সূচক ডিএমভিতে আরও নির্ভরযোগ্যভাবে লগ হয়।
ভবিষ্যদ্বাণী করে যেখানে অপ্টিমাইজার কোনও সূচক সহ দক্ষতার সাথে কোনও সূচক ব্যবহার করতে সক্ষম হবে না তাদের লগ হতে বাধা দিতে পারে।
যে জিনিসগুলি সাধারণত SARGable নয় সেগুলি হ'ল:
SELECT *
FROM dbo.Users AS u
WHERE ISNULL(u.Age, 1000) > 1000;
SELECT *
FROM dbo.Users AS u
WHERE DATEDIFF(DAY, u.CreationDate, u.LastAccessDate) > 5000
SELECT *
FROM dbo.Users AS u
WHERE u.UpVotes + u.DownVotes > 10000000
DECLARE @ThisWillHappenWithStoredProcedureParametersToo NVARCHAR(40) = N'Eggs McLaren'
SELECT *
FROM dbo.Users AS u
WHERE u.DisplayName LIKE @ThisWillHappenWithStoredProcedureParametersToo
OR @ThisWillHappenWithStoredProcedureParametersToo IS NULL;
এই প্রশ্নের কোনওটিই অনুপস্থিত সূচক অনুরোধগুলি নিবন্ধভুক্ত করবে না। এ সম্পর্কিত আরও তথ্যের জন্য নীচের লিঙ্কগুলি দেখুন:
এই সূচকটি নিন:
CREATE INDEX ix_whatever ON dbo.Posts(CreationDate, Score) INCLUDE(OwnerUserId);
এই প্রশ্নের জন্য এটি ঠিক আছে:
SELECT p.OwnerUserId, p.Score
FROM dbo.Posts AS p
WHERE p.CreationDate >= '20070101'
AND p.CreationDate < '20181231'
AND p.Score >= 25000
AND 1 = (SELECT 1)
ORDER BY p.Score DESC;
পরিকল্পনাটি একটি সরল সিক ...
তবে যেহেতু শীর্ষস্থানীয় কী কলামটি কম-বাছাই করা ভবিষ্যদ্বাণীটির জন্য, তাই আমাদের চেয়ে আমাদের আরও কাজ করা শেষ:
সারণী 'পোস্ট'। স্ক্যান গণনা 13, লজিকাল 136890 পড়ে
যদি আমরা সূচি কী কলামের ক্রম পরিবর্তন করি তবে আমরা অনেক কম কাজ করি:
CREATE INDEX ix_whatever ON dbo.Posts(Score, CreationDate) INCLUDE(OwnerUserId);
এবং উল্লেখযোগ্যভাবে কম পড়া:
সারণী 'পোস্ট'। স্ক্যান কাউন্ট 1, যৌক্তিক পাঠ 5
কিছু ক্ষেত্রে, এসকিউএল সার্ভার একটি সূচক স্পুলের মাধ্যমে ফ্লাইতে একটি সূচক তৈরি করতে পছন্দ করবে। যখন একটি সূচক স্পুল উপস্থিত থাকে, অনুপস্থিত সূচকের অনুরোধটি হবে না। অবশ্যই সূচকটি যুক্ত করা আপনার পক্ষে একটি ভাল ধারণা হতে পারে তবে এসকিউএল সার্ভারের উপর নির্ভর করবেন না যা আপনাকে এটি নির্ধারণ করতে সহায়তা করে।