এসকিউএল সার্ভার A <> B কে A <বি বা A> বিতে বিভক্ত করে, বি অ-নিরস্তকর হলে বিস্ময়কর ফলাফল দেয়


26

আমরা এসকিউএল সার্ভারের সাথে একটি আকর্ষণীয় সমস্যার মুখোমুখি হয়েছি। নিম্নলিখিত নিন্দিত উদাহরণ বিবেচনা করুন:

CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY);
INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618');

SELECT s_guid FROM #test
WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618'
  AND s_guid <> NEWID();

DROP TABLE #test;

বেহালা

এক মুহুর্তের জন্য ভুলে যান যে s_guid <> NEWID()শর্তটি সম্পূর্ণ অকেজো বলে মনে হচ্ছে - এটি হ'ল একটি ন্যূনতম নিন্দা উদাহরণ। যেহেতু NEWID()কিছু দেওয়া ধ্রুবক মানের সাথে মিলের সম্ভাবনা খুব কম, তাই প্রতিবার এটি সত্যে মূল্যায়ন করা উচিত।

তবে তা হয় না। এই ক্যোয়ারীটি চালানো সাধারণত 1 টি সারি দেয়, তবে কখনও কখনও (বেশিরভাগ ক্ষেত্রে, 10 এর মধ্যে 1 বারের বেশি) 0 টি সারি দেয়। আমি এটি আমার সিস্টেমে এসকিউএল সার্ভার ২০০৮ এর সাথে পুনরুত্পাদন করেছি এবং আপনি উপরের লিঙ্কযুক্ত ফিডাল (এসকিউএল সার্ভার ২০১৪) এর সাথে অন-লাইনে এটি পুনরুত্পাদন করতে পারেন।

সম্পাদন পরিকল্পনার দিকে তাকালে বোঝা যায় যে ক্যোয়ারী বিশ্লেষক স্পষ্টতই শর্তটিকে বিভক্ত করেছেন s_guid < NEWID() OR s_guid > NEWID():

ক্যোয়ারী প্ল্যানের স্ক্রিনশট

... যা পুরোপুরি ব্যাখ্যা করে যে কেন এটি কখনও কখনও ব্যর্থ হয় (যদি প্রথম উত্পন্ন আইডি ছোট এবং প্রদত্ত আইডির চেয়ে দ্বিতীয়টি বড় হয়)।

SQL সার্ভার মূল্যায়ন অনুমোদিত হয় A <> Bযেমন A < B OR A > B, এমনকি যদি এক্সপ্রেশন এক অ নির্ণায়ক হল? যদি হ্যাঁ, এটি ডকুমেন্টেড কোথায়? বা আমরা একটি বাগ খুঁজে পেয়েছি?

মজার বিষয় হল, AND NOT (s_guid = NEWID())একই বাস্তবায়ন পরিকল্পনা (এবং একই এলোমেলো ফলাফল) পাওয়া যায়।

আমরা যখন এই বিকাশকারী একটি নির্দিষ্ট সারি optionচ্ছিকভাবে বাদ দিতে এবং ব্যবহার করতে চেয়েছিলেন তখন আমরা এই সমস্যাটি পেয়েছি:

s_guid <> ISNULL(@someParameter, NEWID())

একটি "শর্টকাট" হিসাবে:

(@someParameter IS NULL OR s_guid <> @someParameter)

আমি ডকুমেন্টেশন এবং / বা বাগের নিশ্চয়তার সন্ধান করছি। কোডটি সমস্ত প্রাসঙ্গিক নয় তাই workarounds প্রয়োজন হয় না।


উত্তর:


22

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())একই কার্যকরকরণের ফলন পাওয়া যায়

এটি স্বাভাবিককরণের একটি পরিণতি, যা কোয়েরি সংকলনের সময় খুব তাড়াতাড়ি ঘটে। উভয় এক্সপ্রেশন হুবহু একই সাধারণ আকারে সংকলন করে, তাই একই কার্যকরকরণ পরিকল্পনা তৈরি করা হয়।


এই ক্ষেত্রে, আমরা যদি কোনও নির্দিষ্ট পরিকল্পনা জোর করতে চাই যা সমস্যাটি এড়াতে পারে বলে মনে হয়, আমরা উইথ (ফরসেকান) ব্যবহার করতে পারি। নিশ্চিত হওয়ার জন্য, ক্যোয়ারি কার্যকর করার আগে আমাদের NEWID () এর ফলাফল সংরক্ষণ করার জন্য একটি পরিবর্তনশীল ব্যবহার করা উচিত।
রাজ্জান সোসোল

11

এটি এখানে দলিলযুক্ত (সাজানো):

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

ব্যবহারকারী-নির্ধারিত কার্যাদি

এটি একমাত্র ক্যোয়ারী ফর্ম নয় যেখানে ক্যোয়ারী প্ল্যানটি একাধিকবার NEWID () কার্যকর করবে এবং ফলাফল পরিবর্তন করবে। এটি বিভ্রান্তিকর, তবে মূল প্রজন্মের এবং এলোমেলো বাছাইয়ের জন্য NEWID () এর পক্ষে দরকারী critical

সবচেয়ে বিভ্রান্তিকর বিষয় হ'ল সমস্ত অ-সংজ্ঞাবহ ফাংশন আসলে এর সাথে আচরণ করে না like উদাহরণস্বরূপ RAND () এবং GETDATE () প্রতি কোয়েরিতে একবার কার্যকর করা হবে।


এমন কোনও ব্লগ পোস্ট বা অনুরূপ রয়েছে যা ব্যাখ্যা করে যে কেন / যখন ইঞ্জিন "সমান নয়" কে একটি পরিসরে রূপান্তর করবে?
মিস্টার মাগু

3
আমি যে জানি না। রুটিন হতে পারে কারণ =, <এবং >কোনও বিটিরির বিরুদ্ধে দক্ষতার সাথে মূল্যায়ন করা যেতে পারে।
ডেভিড ব্রাউন - মাইক্রোসফ্ট

5

এর মূল্য কী, আপনি যদি এই পুরানো এসকিউএল 92 স্ট্যান্ডার্ড ডকুমেন্টটি দেখেন তবে অসমতার আশেপাশের প্রয়োজনীয়তাগুলি " 8.2 <comparison predicate>" বিভাগে বর্ণিত হয়েছে:

1) এক্স এবং ওয়াই যেকোন দুটি << মান নির্মাতা উপাদান> এর হতে দিন। XV এবং YV যথাক্রমে X এবং Y দ্বারা প্রতিনিধিত্ব করা মান হওয়া যাক।

[...]

ii) XV এবং YV সমান না হলে কেবল "X <> Y" সত্য।

[...]

)) আরএক্স এবং আরয়কে <তুলনা প্রিনিকেট> এর দুটি <সারি মান নির্মাতা> এর হতে দিন এবং RXi এবং RYi কে যথাক্রমে Rx এবং Ry এর i-th <সারির মান নির্মাতা উপাদান> এর হতে দিন। "আরএক্স << অপ্ট> রাই" সত্য, মিথ্যা বা অজানা নীচে:

[...]

খ) "x <> আর" যদি সত্য হয় তবেই এবং কেবলমাত্র যদি কিছু এক্স এর জন্য আরএক্সআই <> আরওয়াই থাকে।

[...]

h) "x <> Ry" মিথ্যা এবং যদি কেবল "Rx = Ry" সত্য হয়।

দ্রষ্টব্য: আমি 7b এবং 7h সম্পূর্ণ করার জন্য অন্তর্ভুক্ত করেছি যেহেতু তারা <>তুলনা সম্পর্কে কথা বলে - আমি মনে করি না একাধিক মানের সাথে সারি মান নির্মাতাদের তুলনা টি-এসকিউএল এ প্রয়োগ করা হয়েছে, যদি না আমি কেবলমাত্র এটির কী বোঝায় তবে ভুল বোঝাবুঝি করি - যা বেশ সম্ভব

এটি বিভ্রান্তিকর আবর্জনা তবে আপনি যদি ডাম্পস্টার ডাইভিং রাখতে চান ...

আমি মনে করি যে 1.ii হ'ল এই দৃশ্যে প্রযোজ্য আইটেমটি, যেহেতু আমরা "সারি মান নির্মাতা উপাদানগুলির মান" তুলনা করছি।

ii) XV এবং YV সমান না হলে কেবল "X <> Y" সত্য।

মূলত এটি বলাই X <> Yসত্য যে যদি এক্স এবং ওয়াইয়ের দ্বারা প্রতিনিধিত্ব করা মানগুলি সমান না হয়। যেহেতু X < Y OR X > Yসেই প্রাকটিকের যৌক্তিক সমতুল্য পুনর্লিখন, এটি অপটিমাইজারের পক্ষে এটি সম্পূর্ণরূপে দুর্দান্ত।

<>তুলনা অপারেটরের উভয় পক্ষের সারি মান নির্ধারক উপাদানগুলির ডিটারমিনিস্টিক-নেস (বা যাই হোক না কেন, আপনি এটি পান) সম্পর্কিত সম্পর্কিত সংজ্ঞা সম্পর্কিত কোনও মান স্ট্যান্ডার্ডটি দেয় না । একদিকে যেমন একটি মূল্য প্রকাশ অ-নিরস্ত করতে পারে এই বিষয়টি মোকাবেলা করার জন্য এটি ব্যবহারকারীর কোডের দায়িত্ব।


1
আমি ভোট প্রদান থেকে বিরত থাকব (উপরে বা নিচে) তবে আমি নিশ্চিত নই। আপনার প্রদত্ত উদ্ধৃতিগুলি "মান" উল্লেখ করে । আমার বোধগম্যতা হল তুলনা দুটি মানের মধ্যে, প্রতিটি পক্ষের মধ্যে একটি। প্রতিটি পক্ষের একটি মানের দুটি (বা আরও) তাত্পর্যগুলির মধ্যে নয়। এছাড়াও, মানক (কমপক্ষে 92 টি আপনি উদ্ধৃতি দিয়েছিলেন) সমস্ত অ-নিরোধক কার্যক্রমে উল্লেখ করে না। আপনার মতো অনুরূপ যুক্তি দিয়ে আমরা ধরে নিতে পারি যে স্ট্যান্ডার্ডের সাথে সম্মতিযুক্ত এসকিউএল পণ্যটি কোনও অ-নিষেধাজ্ঞামূলক ক্রিয়াকলাপ সরবরাহ করে না তবে কেবলমাত্র স্ট্যান্ডার্ডে উল্লিখিতগুলি।
ypercubeᵀᴹ

প্রতিক্রিয়াটির জন্য @ টাইপার ধন্যবাদ! আমি মনে করি আপনার ব্যাখ্যাটি অবশ্যই কার্যকর। এই দস্তাবেজটি আমি প্রথমবার পড়েছি। এটি একটি "সারি মান নির্মাতা" দ্বারা প্রতিনিধিত্বকৃত মানের প্রসঙ্গে মানগুলির উল্লেখ করে যা ডক্টের অন্য কোথাও এটি বলে যে এটি একটি স্কেলার সাবকিউরি (অন্যান্য অনেক কিছুর মধ্যে) হতে পারে। বিশেষত স্কেলার সাবকিউরিটি দেখে মনে হচ্ছে এটি অ-সং-বিরোধী হতে পারে। তবে আমি কী সম্পর্কে =) বলছি তা সত্যই আমি জানি না
জোশ ডার্নেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.