SQL সার্ভার মূল্যায়ন অনুমোদিত হয় A <> B
যেমন A < B OR A > B
, এমনকি যদি এক্সপ্রেশন এক অ নির্ণায়ক হল?
এটি কিছুটা বিতর্কিত বিষয় এবং উত্তরটি একটি যোগ্য "হ্যাঁ"।
আমি যে সর্বোত্তম আলোচনার বিষয়ে অবগত তা ইটজিক বেন- গানের কানেক্ট কানেক্ট বাগ রিপোর্টের সাথে NEWID এবং টেবিল এক্সপ্রেশনগুলির সাথে উত্তর দেওয়া হয়েছিল , যা ঠিক হয়নি বলে বন্ধ হয়ে গিয়েছিল। সংযোগটি তখন থেকে অবসর নিয়েছে, সুতরাং লিঙ্কটি একটি ওয়েব সংরক্ষণাগারে রয়েছে। দুঃখের বিষয়, সংযোগের মৃত্যুর ফলে প্রচুর দরকারী উপাদান হারিয়ে গেছে (বা এটি আরও কঠিন করা হয়েছিল)। যাইহোক, মাইক্রোসফ্টের জিম হগের সবচেয়ে দরকারী উদ্ধৃতিগুলি এখানে রয়েছে:
এটি ইস্যুটির খুব হৃদয়কে আঘাত করে - কোনও প্রোগ্রামের শব্দার্থবিজ্ঞানকে পরিবর্তন করার জন্য কি অপ্টিমাইজেশান অনুমোদিত? উদাহরণস্বরূপ: যদি কোনও প্রোগ্রাম নির্দিষ্ট উত্তর দেয় তবে ধীরে ধীরে চলতে থাকে, তবে ক্যোয়ারী অপটিমাইজারের পক্ষে সেই প্রোগ্রামটি দ্রুত চালানো, তবুও প্রদত্ত ফলাফলগুলি কী পরিবর্তন করা বৈধ?
"না!" বলে চিৎকার করার আগে (আমার নিজের ব্যক্তিগত প্রবণতাটিও :-), বিবেচনা করুন: সুসংবাদটি হ'ল 99% ক্ষেত্রে উত্তরগুলি একই। সুতরাং ক্যোরি অপটিমাইজেশন একটি পরিষ্কার জয়। খারাপ খবরটি হ'ল, যদি ক্যোয়ারিতে পার্শ্ব-প্রভাবকারী কোড থাকে, তবে বিভিন্ন পরিকল্পনা প্রকৃতপক্ষে বিভিন্ন ফলাফল দিতে পারে। এবং NEWID () হ'ল এইরকম একটি পার্শ্ব-প্রতিক্রিয়াশীল (অ-নিরস্তুত্ববাদী) 'ফাংশন' যা পার্থক্যটি প্রকাশ করে। [প্রকৃতপক্ষে, আপনি যদি পরীক্ষা করেন, আপনি অন্যদের তৈরি করতে পারেন - উদাহরণস্বরূপ, শুল্ক-সার্কিট মূল্যায়ন ও শ্লোকগুলির: দ্বিতীয় ধারাটি একটি গাণিতিক বিভাজনকে শূন্যের মধ্য দিয়ে ফেলুন - বিভিন্ন অপ্টিমাইজেশন প্রথম অনুচ্ছেদের আগে দ্বিতীয় ধারাটি কার্যকর করতে পারে] এটি প্রতিফলিত করে ক্রেগের ব্যাখ্যা, এই থ্রেডের অন্য কোথাও, স্কেলার অপারেটরদের মৃত্যুদণ্ড কার্যকর করার সময় স্ক্যালসার্ভার গ্যারান্টি দেয় না।
সুতরাং, আমাদের একটি পছন্দ আছে: যদি আমরা অ-নিরস্তক (পার্শ্ব-প্রতিক্রিয়াশীল) কোডের উপস্থিতিতে একটি নির্দিষ্ট আচরণের গ্যারান্টি দিতে চাই - যাতে জোইনগুলির ফলাফল, উদাহরণস্বরূপ, নেস্টেড-লুপ এক্সিকিউশনটির শব্দার্থকে অনুসরণ করে - তবে আমরা ইউসি যেমন উল্লেখ করেছে - সেই আচরণকে জোর করার জন্য উপযুক্ত বিকল্পগুলি ব্যবহার করতে পারে। তবে ফলস্বরূপ কোডটি ধীর গতিতে চলবে - এটি কার্যকরভাবে কোয়েরি অপটিমাইজারকে টানছে।
যা যা বলেছিল, আমরা NEWID () - এর জন্য "প্রত্যাশিত হিসাবে" আচরণের দিকে "ক্যোরি অপটিমাইজার" - "প্রত্যাশার ফলাফল হিসাবে" ফলাফলের জন্য কার্য সম্পাদন বন্ধ করে দিচ্ছি।
সময়ের সাথে সাথে এই ক্ষেত্রে আচরণের পরিবর্তনের একটি উদাহরণ হ'ল নুলিফ হ'ল আরএএনডি () এর মতো অ-নিরঙ্কুশ ফাংশনগুলির সাথে ভুলভাবে কাজ করে । এছাড়াও অনুরূপ অন্যান্য মামলা রয়েছে যেমন COALESCE
একটি সাবকোয়ারির সাথে ব্যবহার করে যা অপ্রত্যাশিত ফলাফল আনতে পারে এবং ধীরে ধীরে এগুলিও সম্বোধন করা হচ্ছে।
জিম অবিরত:
লুপটি বন্ধ করা হচ্ছে। । । আমি এই প্রশ্নটি দেব দলের সাথে আলোচনা করেছি। এবং অবশেষে আমরা নিম্নলিখিত কারণে, বর্তমান আচরণ পরিবর্তন না করার সিদ্ধান্ত নিয়েছি:
1) অপ্টিমাইজারটি স্কেলার ফাংশনগুলির সময় নির্ধারণের বা মৃত্যুদণ্ডের গ্যারান্টি দেয় না। এটি একটি দীর্ঘ-প্রতিষ্ঠিত টেনেট। এটি মৌলিক 'উদ্রেক' থা অপ্টিমাইজারকে পর্যাপ্ত স্বাধীনতার সাথে ক্যোয়ারী-পরিকল্পনা বাস্তবায়নে উল্লেখযোগ্য উন্নতি করতে সক্ষম করে।
2) এটি "একবারে-প্রতি-সারি আচরণ" কোনও নতুন সমস্যা নয়, যদিও এটি ব্যাপকভাবে আলোচিত নয়। আমরা ইউকন প্রকাশে এর আচরণটি ফিরিয়ে আনতে শুরু করি। তবে সব ক্ষেত্রে ঠিক কী বোঝানো যায় তা অবিকলভাবে পিন করা বেশ শক্ত! উদাহরণস্বরূপ, চূড়ান্ত ফলাফলের 'পথে' গণনা করা অন্তর্বর্তী সারিগুলিতে এটি প্রয়োগ হয়? - কোন ক্ষেত্রে এটি স্পষ্টভাবে নির্বাচিত পরিকল্পনার উপর নির্ভর করে। অথবা এটি কেবল সারিগুলিতে প্রয়োগ হয় যা শেষ পর্যন্ত সম্পূর্ণ ফলাফলে প্রদর্শিত হবে? - এখানে একটি বাজে পুনরাবৃত্তি চলছে, কারণ আমি নিশ্চিত যে আপনি রাজি হবেন!
3) যেমনটি আমি আগে উল্লেখ করেছি, আমরা "পারফরম্যান্স পারফরম্যান্স" করতে ডিফল্ট - যা 99% ক্ষেত্রে ভাল। 1% ক্ষেত্রে যেখানে এটি ফলাফল পরিবর্তন করতে পারে তা স্পষ্ট করা সহজ - পার্শ্ব-প্রতিক্রিয়াযুক্ত 'ফাংশনগুলি' যেমন NEWID - এবং 'ফিক্সিং' সহজ (এর ফলে ট্রেডিং পারফেক্ট)। আবার "পারফরম্যান্স পারফরম্যান্স" করতে এই ডিফল্টটি দীর্ঘ-প্রতিষ্ঠিত, এবং স্বীকৃত। (হ্যাঁ, এটি প্রচলিত প্রোগ্রামিং ভাষার জন্য সংকলকদের দ্বারা নির্বাচিত অবস্থান নয়, তবে তা হয়ে উঠুন)।
সুতরাং, আমাদের সুপারিশগুলি হ'ল:
ক) গ্যারান্টিযুক্ত সময় এবং মৃত্যুদণ্ড কার্যকরকারী শব্দার্থবিজ্ঞানের উপর নির্ভরতা এড়ানো উচিত। খ) টেবিলের অভিব্যক্তিগুলিতে গভীরভাবে NEWID () ব্যবহার করা এড়িয়ে চলুন। গ) নির্দিষ্ট আচরণকে জোর করতে বিকল্প ব্যবহার করুন (ট্রেডিং পারফেক্ট)
আশা করি এই ব্যাখ্যাটি "ঠিক করবে না" হিসাবে এই বাগটি বন্ধ করার জন্য আমাদের কারণগুলি পরিষ্কার করতে সহায়তা করবে।
মজার বিষয় হল, AND NOT (s_guid = NEWID())
একই কার্যকরকরণের ফলন পাওয়া যায়
এটি স্বাভাবিককরণের একটি পরিণতি, যা কোয়েরি সংকলনের সময় খুব তাড়াতাড়ি ঘটে। উভয় এক্সপ্রেশন হুবহু একই সাধারণ আকারে সংকলন করে, তাই একই কার্যকরকরণ পরিকল্পনা তৈরি করা হয়।