বহিরাগত প্যারামাইট্রাইজড 'যেখানে' ধারা সহ একটি ভিউ থেকে কল করা হলে উইন্ডো ফাংশনগুলি ভয়াবহ সম্পাদনের পরিকল্পনা করে


10

আমি দীর্ঘদিন আগে এই সমস্যাটি পেয়েছি, আমি একটি কাজের সন্ধান পেয়েছি যা আমার পক্ষে উপযুক্ত ছিল এবং এটি সম্পর্কে ভুলে গিয়েছিলাম।

তবে এখন এসও-তে প্রশ্ন রয়েছে তাই আমি এই সমস্যাটি সামনে আনতে ইচ্ছুক।

একটি দৃশ্য রয়েছে যা খুব সরলভাবে কয়েকটি আদেশে যোগ দেয় (অর্ডার + অর্ডার লাইন)।

কোনও 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 = ?

বা এটি অন্য যে কোনও ক্লায়েন্ট হতে পারে যা স্কয়ার সংক্ষেপণ নয় প্যারামিটার ব্যবহার করে।

উইন্ডো ফাংশনটি যদি ভিউ থেকে সরিয়ে ফেলা হয় তবে এটি পরামিতিগুলির সাথে অনুসন্ধান করা কিনা তা নির্বিশেষে এটি পুরোপুরি দ্রুত চলে।

আমার কাজটি ছিল আপত্তিজনক ফাংশনটি সরিয়ে এবং পরবর্তী পর্যায়ে এটি পুনরায় প্রয়োগ করা।

কিন্তু, কি দেয়? এসকিউএল সার্ভার ২০০৮ উইন্ডো কার্যকারিতা কীভাবে পরিচালনা করে এটিতে এটি কি সত্যই কোনও বাগ?


অর্ডার_নম্বর কি প্রাথমিক কী? কলাম এবং প্যারামিটারের ডেটাটাইপগুলি মিলবে?
gbn

order_numberএকটি প্রাথমিক কী নয়। এটি int not nullউভয় সারণীতে ননক্লাস্টারড সূচক সহ।
GSerg

5
এসকিউএল সার্ভার 2005- এ এই অঞ্চলে প্রিকেটিক চাপ দেওয়ার সাথে সমস্যা ছিল । আমি ভেবেছিলাম সেগুলি এখন ঠিক হয়ে গেছে। আপনার টিএসকিউএল উদাহরণটি বিটিডাব্লু একটি প্যারামিটার না করে একটি চলক ব্যবহার করে। OPTION (RECOMPILE)সাহায্য যোগ করে ?
মার্টিন স্মিথ

1
@ জিসার্গ - সুতরাং ফিল্টারটি নিয়ে খারাপ পরিকল্পনাটি শেষ পর্যন্ত ফিল্টারটিতে আনুমানিক ৫ মিলিয়ন সারি এবং বাস্তবের সাথে মিলে প্রায় আনুমানিক 10 টি সারি রয়েছে? যদি তাই হয় তবে ভবিষ্যদ্বাণীপূর্ণ পুশিং ইস্যুটি এখনও সম্পূর্ণরূপে স্থির হয়নি।
মার্টিন স্মিথ

উত্তর:


5

এটি একটি দীর্ঘস্থায়ী সমস্যা বলে মনে হচ্ছে যা একরকম বা অন্য কোনও রূপে পুনর্নির্মাণ চালিয়ে যায় এবং এসকিউএল সার্ভার ২০১২ এ এখনও উপস্থিত রয়েছে।

এটি নিয়ে আলোচনা করা কিছু পোস্ট

এসকিউএল সার্ভারের সমস্ত বর্তমান সংস্করণ এবং ২০১২ সহ option(recompile)মোটামুটি প্যারামিটারাইজড প্রিডিকেটের জন্য সিকোয়েন্স প্রজেক্টের পূর্বে পার্টিশন গ্রুপে ফিল্টারটি চাপতে সক্ষম হয় না (যদি ২০০৮++ হয়)।

একটি বিকল্প recompileইঙ্গিতটি যেমন @ a1ex07 দ্বারা প্রস্তাবিত ক্যোয়ারিতে একটি parameterised ইনলাইন TVF ব্যবহার করতে পুনর্লিখন হবে)


এসকিউএল সার্ভার ২০১৪-
গিলাইউমূম

3

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


তবুও আরেকটি কাজ, হ্যাঁ আমি এটি করতে পারিনি যদিও সমস্ত ক্লায়েন্টরা একটি টেবিল-মূল্যবান ফাংশন গ্রাস করতে সক্ষম ছিল না।
GSerg

কেন? আমি ১০০% নিশ্চিত নই, তবে আমার মনে হয় আপনার যা যা প্রয়োজন তা হ'ল ক্যোয়ারিকে কিছুটা বদলে যাওয়াSELECT * FROM my_funct(12345)
a1ex07

প্রয়োজনীয়তার মধ্যে একটি হ'ল ক্যোয়ারীটি এক্সেল ব্যবহার করে (যেমন, এমএস কোয়েরি দ্বারা) ব্যবহারকারীরা
উপভোগযোগ্য

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