এসকিউএল সার্ভার ২০১২-এ খালি ফলাফল সহ কোয়েরির ত্রুটি কেন সেট করে?


31

এমএস এসকিউএল সার্ভার ২০১২-এ নিম্নলিখিত কোয়েরিগুলি চালনার সময় দ্বিতীয় কোয়েরিটি ব্যর্থ হয় তবে প্রথমটি নয়। এছাড়াও, যেখানে ক্লজগুলি ছাড়া চালানো হলে উভয় প্রশ্নের ব্যর্থ হবে। দুজনেরই ফাঁকা ফলাফলের সেট থাকা উচিত বলেই কেন আমি ব্যর্থ হই। কোনও সহায়তা / অন্তর্দৃষ্টি প্রশংসা করা হয়।

create table #temp
(id     int primary key)

create table #temp2
(id     int)

select 1/0
from #temp
where id = 1

select 1/0
from #temp2
where id = 1

উত্তর:


39

এক্সিকিউশন পরিকল্পনাগুলির প্রাথমিক পর্যালোচনা দেখায় যে 1/0কম্পিউট স্কেলার অপারেটরগুলিতে এক্সপ্রেশনটি সংজ্ঞায়িত হয়েছে:

গ্রাফিকাল পরিকল্পনা

এখন, যদিও মৃত্যুদন্ড কার্যকর করার পরিকল্পনাগুলি বাম দিক থেকে চালানো শুরু করে, পুনরাবৃত্তভাবে ফোন করা Openএবং GetRowফলাফলগুলি প্রত্যাবর্তনের জন্য শিশু পুনরাবৃত্তির পদ্ধতিগুলি, এসকিউএল সার্ভার 2005 এবং পরে একটি অপ্টিমাইজেশন রয়েছে যার দ্বারা এক্সপ্রেশনগুলি প্রায়শই কেবল একটি কম্পিউট স্কেলারের দ্বারা সংজ্ঞায়িত করা হয়, ততক্ষণ পর্যন্ত মূল্যায়ন স্থগিত করা হয় অপারেশন ফলাফল প্রয়োজন :

সেট স্ট্যাটিসটিক্স এক্সএমএল দ্বারা উত্পাদিত শোপ্ল্যানেগুলিতে উপস্থিত গণনা স্কেলার অপারেটরগুলিতে রানটাইমআইফর্মেন্স উপাদান থাকতে পারে না।  গ্রাফিকাল শো প্ল্যানগুলিতে, এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে অন্তর্ভুক্ত প্রকৃত এক্সিকিউশন প্ল্যান বিকল্পটি নির্বাচিত হলে প্রকৃত সারি, প্রকৃত রিবিন্ডস এবং প্রকৃত রিওয়াইন্ডগুলি সম্পত্তিগুলি উইন্ডো থেকে অনুপস্থিত থাকতে পারে।  এটি যখন ঘটে তখন এর অর্থ হ'ল এই অপারেটরগুলি সংকলিত ক্যোয়ারী পরিকল্পনায় ব্যবহৃত হলেও, তাদের কাজ রান-টাইম ক্যোয়ারী পরিকল্পনায় অন্যান্য অপারেটররা সম্পাদন করেছিলেন।  এছাড়াও নোট করুন যে সেট স্ট্যাটিক্সস প্রোফাইলে উত্পন্ন শোপ্লান আউটপুটে এক্সিকিউটিভের সংখ্যাটি সেট স্ট্যাটিক্স এক্সএমএল দ্বারা উত্পন্ন শোপ্ল্যানেগুলিতে রিবিন্ড এবং রিওয়াইন্ডের যোগফলের সমান।  থেকে: এমএসডিএন বই অনলাইন

এই ক্ষেত্রে, ক্লায়েন্টে ফিরে আসার জন্য সারিটি একত্রিত করার সময় কেবলমাত্র অভিব্যক্তিটির ফলাফল প্রয়োজন (যা আপনি সবুজ SELECTআইকনে ঘটতে ভাবতে পারেন )। এই যুক্তি দ্বারা, স্থগিত মূল্যায়নের অর্থ হল অভিব্যক্তিটি কখনই মূল্যায়ন করা হয় না কারণ কোনও পরিকল্পনাই কোনও রিটার্ন সারি তৈরি করে না। বিন্দুটি সামান্য পরিশ্রম করার জন্য, ক্লাস্টারড ইনডেক্স সিক বা টেবিল স্ক্যান উভয়ই একটি সারি ফেরত দেয় না, তাই ক্লায়েন্টের কাছে ফিরে আসার জন্য আর একত্রিত হওয়ার কোনও সারি নেই।

তবে, একটি পৃথক অপ্টিমাইজেশন রয়েছে যার মাধ্যমে কিছু অভিব্যক্তি রানটাইম ধ্রুবক হিসাবে চিহ্নিত করা যেতে পারে এবং ক্যোয়ারি এক্সিকিউশন শুরু হওয়ার আগে একবার মূল্যায়ন করা যায় । এই ক্ষেত্রে, এটির একটি ইঙ্গিতটি শোপলান এক্সএমএলে পাওয়া যাবে (ক্লাস্টারড ইনডেক্স বামদিকে পরিকল্পনা, ডানদিকে টেবিল স্ক্যান পরিকল্পনা):

শোপ্ল্যান এক্সএমএল

অন্তর্নিহিত পদ্ধতিগুলি এবং তারা এই ব্লগ পোস্টে পারফরম্যান্সকে কীভাবে প্রভাবিত করতে পারে সে সম্পর্কে আমি আরও লিখেছি । সেখানে প্রদত্ত তথ্য ব্যবহার করে, আমরা প্রথম ক্যোয়ারীটি সংশোধন করতে পারি যাতে উভয় এক্সপ্রেশন কার্যকর করা শুরু হওয়ার আগেই মূল্যায়ন ও ক্যাশে করা হয়:

select 1/0 * CONVERT(integer, @@DBTS)
from #temp
where id = 1

select 1/0
from #temp2
where id = 1

এখন, প্রথম পরিকল্পনায় ধ্রুবক প্রকাশের রেফারেন্সও রয়েছে এবং উভয় প্রশ্নের ত্রুটি বার্তা উত্পন্ন করে। প্রথম প্রশ্নের জন্য এক্সএমএল রয়েছে:

কনস্ট্যান্ট এক্সপ্রেশন

আরও তথ্য: গণনা স্কেলারস, এক্সপ্রেশন এবং পারফরম্যান্স


21

আমি বুদ্ধিমানভাবে অনুমান করতে যাচ্ছি (এবং প্রক্রিয়াটিতে সম্ভবত কোনও এসকিউএল সার্ভার গুরু আকৃষ্ট করবেন যিনি সম্ভবত একটি বিস্তারিত উত্তর দিতে পারেন)।

প্রথম ক্যোয়ারী মৃত্যুদন্ড কার্যকর করে:

  1. প্রাথমিক কী সূচকটি স্ক্যান করুন
  2. ক্যোয়ারির জন্য প্রয়োজনীয় ডাটা টেবিলের মানগুলি সন্ধান করুন

এটি এই পাথটিকে বেছে নেয় কারণ আপনার whereপ্রাথমিক কীতে একটি ধারা রয়েছে। এটি কখনই দ্বিতীয় ধাপে পৌঁছে না, সুতরাং কোয়েরিটি ব্যর্থ হয় না।

দ্বিতীয়টিতে চালনার জন্য একটি প্রাথমিক কী নেই, সুতরাং এটি ক্যোয়ারির কাছে পৌঁছেছে:

  1. ডেটার একটি পূর্ণ টেবিল স্ক্যান করুন এবং প্রয়োজনীয় মানগুলি পুনরুদ্ধার করুন

এই মানগুলির মধ্যে 1/0একটি সমস্যা তৈরি করছে।

এটি এসকিউএল সার্ভারের কোয়েরিটি অনুকূল করে তোলার একটি উদাহরণ। বেশিরভাগ অংশে, এটি একটি ভাল জিনিস। এসকিউএল সার্ভার শর্তগুলি selectটেবিল স্ক্যান অপারেশনে স্থানান্তরিত করবে । এটি প্রায়শই ক্যোয়ারির মূল্যায়নের পদক্ষেপগুলি সংরক্ষণ করে।

তবে, এই অপ্টিমাইজেশনটি কোনও সংকীর্ণ ভাল জিনিস নয়। প্রকৃতপক্ষে, এটি নিজেকে এসকিউএল সার্ভারের ডকুমেন্টেশন লঙ্ঘন করেছে বলে মনে হচ্ছে যা whereক্লাসটি এর আগে মূল্যায়ন করা হয়েছিল select। ঠিক আছে, এর অর্থ কী তা নিয়ে তাদের কিছু বুদ্ধিমান ব্যাখ্যা থাকতে পারে। সবচেয়ে মানুষের, যদিও, কথাটি প্রক্রিয়াকরণের whereআগে selectঅর্থ হবে (অন্যান্য বিষয় ছাড়াও) "উৎপন্ন না selectব্যবহারকারীকে ফিরিয়ে দেওয়া না সারি উপর -clause ত্রুটি"।


1
আপনি যদি সঠিক হন তবে +1 এর কোনও ক্লু নেই, তবে একমাত্র পার্থক্য দেওয়া উত্তম উত্তরটি হ'ল প্রাথমিক কী।

1
@ গর্ডনলিনফ পল রান্ডাল কেবলমাত্র টুইটারের মাধ্যমে নিশ্চিত করেছেন যে আপনার উত্তরটি শুরু হয়েছে।
স্মিটিজিআইটি

4
@ স্টিল, মৃত্যুদণ্ডের আসল ক্রম যদিও আলাদা তবে এটির মতো ত্রুটি বার্তাগুলি নিয়ে যাওয়া উচিত নয়।
ypercubeᵀᴹ

7
@ সাইবারকি আর্মল্যান্ড সোমমারস্কোগ আপনার সাথে একমত হবেন (আইটেম সংযুক্ত করুন)
পল হোয়াইট বলেছেন GoFundMonica

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