না এড়ানো উচিত?


14

কিছু এসকিউএল সার্ভার বিকাশকারীদের মধ্যে এটি একটি ব্যাপকভাবে আস্থাযুক্ত বিশ্বাস যা NOT INমারাত্মকভাবে ধীর , এবং প্রশ্নগুলি আবার লিখতে হবে যাতে তারা একই ফলাফলটি ফিরে আসে তবে "দুষ্টু" কীওয়ার্ড ব্যবহার না করে। ( উদাহরণস্বরূপ )।

এর কোন সত্যতা আছে কি?

উদাহরণস্বরূপ, এসকিউএল সার্ভারে কিছু ज्ञিত বাগ (কোন সংস্করণ?) রয়েছে যা ব্যবহার করে NOT INসমতুল্য ক্যোয়ারির চেয়ে আরও খারাপ এক্সিকিউশন প্ল্যান ব্যবহার করার জন্য কোয়েরি ব্যবহার করে

  • একটি চেক বা LEFT JOINমিলিয়েNULL
  • (SELECT COUNT(*) ...) = 0মধ্যে WHEREদফা?

7
নিবন্ধটি যদিও অত্যন্ত ভুল। "ইন" না "টেবিলঅনে প্রতিটি সারির জন্য একই প্রশ্নটি বারবার চালাতে হবে"। সেখানকার পোস্টারটি বিশ্বাস করে যে IN/ NOT INসর্বদা নেস্টেড লুপগুলি প্রয়োগ করা হবে। এবং stops SQL Server from creating a ‘plan’কী বোঝাতে চাইছে তা আমার কোনও ধারণা নেই ।
মার্টিন স্মিথ

5
@ হেইনজি আপনি যে নিবন্ধটির সাথে লিঙ্ক করেছেন, তা আগুনে মারা উচিত, এটি অসাড়তা পূর্ণ of পছন্দ: "IN প্রতিস্থাপনের জন্য, আমরা একটি অন্তর্ভুক্ত যোগদান করি use তারা কার্যকরভাবে একই জিনিস।" সমস্যা হ'ল, তারা একই জিনিস নয়। আমি এসকিউএল-সার্ভার আচরণ সম্পর্কে কিছু বিশ্লেষণ করতে বেসিক এসকিউএল না জেনে এমন কোনও ব্যক্তিকে বিশ্বাস করব না, যেমন একটি যোগদান এবং একটি আধা-যোগের মধ্যে পার্থক্য।
ypercubeᵀᴹ

উত্তর:


14

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

DECLARE @Customers TABLE(CustomerID INT);

INSERT @Customers VALUES(1),(2);

DECLARE @Orders TABLE(OrderID INT, CustomerID INT, CompanyID INT);

INSERT @Orders VALUES(10,1,NULL),(11,NULL,5);

ধরা যাক যে গ্রাহকরা কখনই অর্ডার দেননি তাদের সকলের সন্ধান করতে চাই। ডেটা দেওয়া হয়েছে, কেবলমাত্র একটি রয়েছে: গ্রাহক # 2। সেই তথ্যটি খুঁজে পেতে আমি কোয়েরি লেখার বিষয়ে যে তিনটি উপায় যেতে পারি তা এখানে (অন্যদের রয়েছে):

SELECT [NOT IN] = CustomerID FROM @Customers 
  WHERE CustomerID NOT IN (SELECT CustomerID FROM @Orders);

SELECT [NOT EXISTS] = CustomerID FROM @Customers AS c 
  WHERE NOT EXISTS (SELECT 1 FROM @Orders AS o
  WHERE o.CustomerID = c.CustomerID);

SELECT [EXCEPT] = CustomerID FROM @Customers
EXCEPT SELECT CustomerID FROM @Orders;

ফলাফল:

NOT IN
------
                 -- <-- no results. Is that what you expected?

NOT EXISTS
----------
2

EXCEPT
------
2

এখন, পাশাপাশি কিছু কার্য সম্পাদনের সমস্যা রয়েছে এবং আমি তাদের সম্পর্কে এই ব্লগ পোস্টে কথা বলি । ডেটা এবং সূচকগুলির উপর নির্ভর করে NOT EXISTSসাধারণত ছাপিয়ে যায় NOT INএবং আমি জানি না যে এটি আরও খারাপ পারফর্ম করতে পারে কিনা। আপনার এটিও লক্ষ্য করা উচিত যা EXCEPTপৃথক বাছাইয়ের অপারেশন প্রবর্তন করতে পারে, যাতে আপনি বিভিন্ন ডেটা (আবার উত্সের উপর নির্ভর করে) দিয়ে শেষ করতে পারেন। এবং যে জনপ্রিয় LEFT OUTER JOIN ... WHERE right.column IS NULLপ্যাটার্ন সর্বদা সবচেয়ে খারাপ অভিনয়।

মার্টিন স্মিথের এসও-তে তার উত্তরে প্রচুর ভাল সহায়ক তথ্য রয়েছে

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