सबसे बड़ा अंतर नहीं है बनाम में मौजूद नहीं है, यह (जैसा लिखा गया है), है SELECT *
।
पहले उदाहरण पर, आपको दोनों A
और से सभी कॉलम मिलते हैं B
, जबकि दूसरे उदाहरण में, आपको केवल कॉलम मिलते हैं A
।
SQL सर्वर में, दूसरा संस्करण एक बहुत ही सरल आकस्मिक उदाहरण में थोड़ा तेज है:
दो नमूना तालिकाएँ बनाएँ:
CREATE TABLE dbo.A
(
A_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
CREATE TABLE dbo.B
(
B_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
GO
प्रत्येक तालिका में 10,000 पंक्तियाँ डालें:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
हर 5 वीं पंक्ति को दूसरी तालिका से निकालें:
DELETE
FROM dbo.B
WHERE B_ID % 5 = 1;
SELECT COUNT(*) -- shows 10,000
FROM dbo.A;
SELECT COUNT(*) -- shows 8,000
FROM dbo.B;
दो टेस्ट SELECT
स्टेटमेंट वेरिएंट करें:
SELECT *
FROM dbo.A
LEFT JOIN dbo.B ON A.A_ID = B.B_ID
WHERE B.B_ID IS NULL;
SELECT *
FROM dbo.A
WHERE NOT EXISTS (SELECT 1
FROM dbo.B
WHERE b.B_ID = a.A_ID);
निष्पादन योजना:
दूसरे संस्करण को फ़िल्टर ऑपरेशन करने की आवश्यकता नहीं है क्योंकि यह बाएं एंटी-सेमी जॉइन ऑपरेटर का उपयोग कर सकता है।
WHERE A.idx NOT IN (...)
है नहीं समान का त्रिसंयोजक व्यवहार की वजह सेNULL
(यानीNULL
के बराबर नहीं हैNULL
, (और न ही असमान) इसलिए यदि आपके पास किसी भीNULL
मेंtableB
आप अप्रत्याशित परिणाम मिल जाएगा!)