আমি দীর্ঘদিন আগে এই সমস্যাটি পেয়েছি, আমি একটি কাজের সন্ধান পেয়েছি যা আমার পক্ষে উপযুক্ত ছিল এবং এটি সম্পর্কে ভুলে গিয়েছিলাম।
তবে এখন এসও-তে প্রশ্ন রয়েছে তাই আমি এই সমস্যাটি সামনে আনতে ইচ্ছুক।
একটি দৃশ্য রয়েছে যা খুব সরলভাবে কয়েকটি আদেশে যোগ দেয় (অর্ডার + অর্ডার লাইন)।
কোনও where
ধারা ছাড়াই জিজ্ঞাসা করা হলে , ভিউ কয়েক মিলিয়ন লাইন দেয়।
যাইহোক, নুন কখনও এটিকে কল করে না। সাধারণ জিজ্ঞাসা হয়
select * from that_nasty_view where order_number = 123456;
এটি 5 মিটারের মধ্যে প্রায় 10 টি রেকর্ড দেয়।
একটি গুরুত্বপূর্ণ বিষয়: ভিউটিতে একটি উইন্ডো ফাংশন রয়েছে rank()
, যা ক্ষেত্রের দ্বারা ঠিক ভাগ করা হয় যা ব্যবহার করে সবসময় দর্শনটি অনুসন্ধান করা হয়:
rank() over (partition by order_number order by detail_line_number)
এখন, যদি উপরে দেখানো ঠিক মতই এই ভিউটি কোয়েরি স্ট্রিংয়ের আক্ষরিক পরামিতিগুলির দ্বারা অনুসন্ধান করা হয় তবে তা তাত্ক্ষণিকভাবে সারিগুলি ফিরিয়ে দেয়। কার্যকর করার পরিকল্পনাটি ভাল:
- সূচকগুলি সূচকে উভয় সারণিতে সন্ধান করে
order_number
(10 টি সারি দেয়) ind - ফিরে আসা ক্ষুদ্র ফলাফলের জন্য উইন্ডোজ গণনা করা হচ্ছে।
- নির্বাচন করা হচ্ছে।
যাইহোক, যখন ভিউটিকে প্যারামিটারাইজড উপায়ে বলা হয়, জিনিসগুলি কদর্য হয়:
Index scan
সূচকগুলি উপেক্ষা করে সমস্ত টেবিলে। 5 মি সারি প্রদান করে।- বিশাল যোগদান।
- সমস্ত
partition
গুলি (প্রায় 500k উইন্ডো) এর উপর উইন্ডোজ গণনা করা হচ্ছে । Filter
5 মিটারের মধ্যে 10 সারি নিতে।- নির্বাচন করা
প্যারামিটারগুলি জড়িত থাকাকালীন সমস্ত ক্ষেত্রে এটি ঘটে। এটি এসএমএস হতে পারে:
declare @order_number int = 123456;
select * from that_nasty_view where order_number = @order_number;
এটি ওডিবিসি ক্লায়েন্ট হতে পারে যেমন এক্সেল:
select * from that_nasty_view where order_number = ?
বা এটি অন্য যে কোনও ক্লায়েন্ট হতে পারে যা স্কয়ার সংক্ষেপণ নয় প্যারামিটার ব্যবহার করে।
উইন্ডো ফাংশনটি যদি ভিউ থেকে সরিয়ে ফেলা হয় তবে এটি পরামিতিগুলির সাথে অনুসন্ধান করা কিনা তা নির্বিশেষে এটি পুরোপুরি দ্রুত চলে।
আমার কাজটি ছিল আপত্তিজনক ফাংশনটি সরিয়ে এবং পরবর্তী পর্যায়ে এটি পুনরায় প্রয়োগ করা।
কিন্তু, কি দেয়? এসকিউএল সার্ভার ২০০৮ উইন্ডো কার্যকারিতা কীভাবে পরিচালনা করে এটিতে এটি কি সত্যই কোনও বাগ?
order_number
একটি প্রাথমিক কী নয়। এটি int not null
উভয় সারণীতে ননক্লাস্টারড সূচক সহ।
OPTION (RECOMPILE)
সাহায্য যোগ করে ?