আমার অফিসে, আমাদের কাছে একটি ক্যোয়ারী রয়েছে যা বেশ কুৎসিত, তবে উত্পাদন এবং উন্নয়নের পরিবেশে যথাক্রমে চলে (যথাক্রমে 20 সেকেন্ড এবং 4 সেক)। তবে আমাদের পরীক্ষার পরিবেশে এটি 4 ঘন্টা সময় নেয়। এসকিউএল 2003 (+ সর্বশেষ প্যাচগুলি) উত্পাদন এবং বিকাশে চলছে। SQL2008R2 পরীক্ষায় চলছে।
আমি ক্যোয়ারী প্ল্যানটি একবার দেখেছিলাম এবং এটিতে দেখা যায় যে সংযুক্ত-সার্ভার থেকে ফিরে আসা সারিগুলি সংরক্ষণ করার জন্য এসকিউএল ২০০8 আর 2 টেবিল স্পুল (অলস স্পুল) এর মাধ্যমে টেম্পডিবি ব্যবহার করছে। পরবর্তী পদক্ষেপটি কোস্টের 96.3% খেয়ে নেস্টেড লুপগুলি (বাম বিরোধী আধা সেমিন) দেখাচ্ছে showing দুই অপারেটরের মধ্যে লাইনটি 5,398 এমবি!
এসকিউএল ২০০ for এর ক্যোয়ারী প্ল্যানটি টেম্পডিবি এবং কোন বাম অ্যান্টি সেমি যোগের কোনও ব্যবহার না দেখায়।
নীচে স্যানিটাইজড কোড রয়েছে এবং এক্সিকিউশনটি শীর্ষে ২০০ 2005 এর পরিকল্পনার নীচে, ২০০৮ আর ২ পরিকল্পনা করে।
কী কারণে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পরিবর্তন আনা হচ্ছে? আমি অন্যরকম এক্সিকিউশন পরিকল্পনা দেখার আশা করছিলাম, যাতে এটি আমাকে বিরক্ত করে না। ক্যোয়ারির সময় নাটকীয়ভাবে ধীরে ধীরে আমাকে কষ্ট দেয়।
আমার কি অন্তর্নিহিত হার্ডওয়্যারটি লক্ষ্য করা উচিত, যেহেতু ২০০৮ আরআর ভার্সনটি টেম্পডিবি ব্যবহার করছে তবে এর ব্যবহারটি কীভাবে অপ্টিমাইজ করা যায় তা আমাকে একবার দেখে নিতে হবে?
কোয়েরি লেখার আরও ভাল উপায় আছে কি?
সাহায্যের জন্য ধন্যবাদ.
INSERT INTO Table1_GroupLock (iGroupID, dLockedDate)
SELECT
Table1.iGroupID,
GETDATE()
FROM Table1
WHERE
NOT EXISTS (
SELECT 1
FROM LinkedServer.Database.Table2 Alias2
WHERE
(
Alias2.FirstName + Alias2.LastName = dbo.fnRemoveNonLetter(Table1.FullName)
AND NOT dbo.fnRemoveNonLetter(Table1.FullName) IS NULL
AND NOT Alias2.FirstName IS NULL
AND NOT Alias2.LastName IS NULL
) OR (
Alias2.FamilyName = dbo.fnRemoveNonLetter(Table1.FamilyName)
AND Alias2.Child1Name = dbo.fnRemoveNonLetter(Table1.Child1Name)
AND NOT dbo.fnRemoveNonLetter(Table1.FamilyName) IS NULL
AND NOT dbo.fnRemoveNonLetter(Table1.Child1Name) IS NULL
AND NOT Alias2.Familyname IS NULL
AND NOT Alias2.Child1Name IS NULL
) OR (
Alias2.StepFamilyName = dbo.fnRemoveNonLetter(Table1.StepFamilyName)
AND Alias2.StepFamilyNameChild1 = dbo.fnRemoveNonLetter(Table1.StepFamilyNameChild2)
AND NOT Alias2.StepFamilyName IS NULL
AND NOT Alias2.StepFamilyNameChild1 IS NULL
AND NOT dbo.fnRemoveNonLetter(Table1.StepFamilyName) IS NULL
AND NOT dbo.fnRemoveNonLetter(Table1.StepFamilyNameChild2) IS NULL
)
) AND NOT EXISTS (
SELECT 1
FROM Table3
INNER JOIN Table4
ON Table4.FirstNameType = Table3.FirstNameType
INNER JOIN table5
ON table5.LastNameType = Table3.LastNameType
WHERE
Table3.iGroupID = Table1.iGroupID
AND Table3.bIsClosed = 0
AND Table4.sNameTypeConstant = 'new_lastname'
AND table5.sFirstNameConstant = 'new_firstname'
)


:: সম্পাদনা :: একটি ভিন্ন এসকিউএল ২০০৫ উদাহরণ থেকে ক্যোয়ারী কার্যকর করা হয়েছে, "ভাল একটি" এর মতো একই বাস্তবায়ন পরিকল্পনা। এখনও নিশ্চিত নয় যে ২০০ 2005-এর দুটি সংস্করণ ২০০RR2 সংযুক্ত সার্ভারের সাথে ২০০R -২-এর উদাহরণগুলির চেয়ে ২০০R -২ এর তুলনায় আরও ভাল চলছে।
যদিও আমি অস্বীকার করি না যে কোডটি কোনও কাজ ব্যবহার করতে পারে, যদি কোডটি সমস্যা হচ্ছিল, তবে আমি কি আমার সমস্ত পরীক্ষায় একইরকম এক্সিকিউটিভ পরিকল্পনাগুলি দেখতে পাব না? এসকিউএল সংস্করণ নির্বিশেষে?
:: সম্পাদনা :: আমি ২০০৮ আরআর দু'টি ক্ষেত্রেই এসপি 1 এবং সিইউ 3 প্রয়োগ করেছি, এখনও কোনও পাশ নেই। আমি সংযুক্ত সার্ভারে বিশেষত সংঘাত স্থাপন করেছি, কোন পাশা নেই। আমি উভয় দৃষ্টান্তে আমার ব্যবহারকারী অ্যাক্টের সিসাদমিন হওয়ার অনুমতি নির্দিষ্ট করে রেখেছি, কোনও ডাইস নেই। আমি আমার এসকিএল সার্ভার ২০০৮ এর অভ্যন্তরীণ এবং সমস্যা সমাধানের কথাও স্মরণ করেছি, আমরা কীভাবে এটি ট্র্যাক করতে পারি তা আমরা দেখতে পাব।
সাহায্য এবং টিপস জন্য সবাইকে ধন্যবাদ।
:: সম্পাদনা :: লিঙ্কযুক্ত সার্ভারে আমি বিভিন্ন অনুমতি পরিবর্তন করেছি। আমি এসকিউএল লগইন, ডোমেন লগইন, ব্যবহারকারীর ছদ্মবেশ ব্যবহার করেছি, আমি "এই সুরক্ষা প্রসঙ্গটি ব্যবহার করে তৈরি করা" বিকল্পটি ব্যবহার করেছি। আমি লিঙ্কযুক্ত সার্ভারের উভয় পক্ষের ব্যবহারকারী তৈরি করেছি যার সার্ভারে সিসাদমিন অধিকার রয়েছে। আমি ধারনা বাইরে থাকি।
আমি এখনও জানতে চাই যে এসকিউএল ২০০৫ কেন এসকিউএল ২০০৮আর 2 থেকে এত নাটকীয়ভাবে কোয়েরি চালাচ্ছে। যদি এটি ছিল যে কোয়েরিটি খারাপ ছিল, আমি এসকিউএল 2003 এবং এসকিউএল ২০০8 আর 2 উভয়টিতে 4 + ঘন্টা চালানোর সময়টি দেখতে পাচ্ছি।