कम से कम एक ऐसा मामला है जहां LEFT [OUTER] JOIN
[INNER] JOIN
. से बेहतर विकल्प है . मैं OUTER
. का उपयोग करके समान परिणाम प्राप्त करने के बारे में बात करता हूं INNER
. के बजाय ।
उदाहरण (मैं AdventureWorks 2008 डेटाबेस का उपयोग कर रहा हूं ):
-- Some metadata infos
SELECT fk.is_not_trusted, fk.name
FROM sys.foreign_keys fk
WHERE fk.parent_object_id=object_id('Sales.SalesOrderDetail');
GO
CREATE VIEW View1
AS
SELECT h.OrderDate, d.SalesOrderDetailID, o.ModifiedDate
FROM Sales.SalesOrderDetail d
INNER JOIN Sales.SalesOrderHeader h ON d.SalesOrderID = h.SalesOrderID
INNER JOIN Sales.SpecialOfferProduct o ON d.SpecialOfferID=o.SpecialOfferID AND d.ProductID=o.ProductID;
GO
CREATE VIEW View2
AS
SELECT h.OrderDate, d.SalesOrderDetailID, o.ModifiedDate
FROM Sales.SalesOrderDetail d
INNER JOIN Sales.SalesOrderHeader h ON d.SalesOrderID = h.SalesOrderID
LEFT JOIN Sales.SpecialOfferProduct o ON d.SpecialOfferID=o.SpecialOfferID AND d.ProductID=o.ProductID;
GO
SELECT SalesOrderDetailID
FROM View1;
SELECT SalesOrderDetailID
FROM View2;
पहली क्वेरी के लिए परिणाम:
is_not_trusted name
-------------- ---------------------------------------------------------------
0 FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID
0 FK_SalesOrderDetail_SpecialOfferProduct_SpecialOfferIDProductID
पिछले दो प्रश्नों के लिए निष्पादन योजना:
नोट 1 / 1 देखें: यदि हम SELECT SalesOrderDetailID FROM View1
. के लिए निष्पादन योजना को देखें हम एक FK उन्मूलन
क्योंकि FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID
बाधा पर भरोसा किया जाता है और इसमें एक ही स्तंभ होता है। लेकिन, सर्वर मजबूर है (INNER JOIN Sales.SpecialOfferProduct
के कारण) ) तीसरी तालिका (SpecialOfferProduct) से डेटा पढ़ने के लिए यहां तक कि SELECT/WHERE
भी खंड में इस तालिका से कोई कॉलम नहीं है और FK बाधा (FK_SalesOrderDetail_SpecialOfferProduct_SpecialOfferIDProductID) (भी) विश्वसनीय है। ऐसा इसलिए होता है क्योंकि यह अंतिम FK बहु-स्तंभ है।
नोट 2 / 2 देखें: क्या होगा अगर हम रीड को हटाना चाहते हैं (Scan
/Seek
) Sales.SpecialOfferProduct
. पर ? यह दूसरा FK बहु-स्तंभ है और ऐसे मामलों के लिए SQL सर्वर FK को समाप्त नहीं कर सकता है (पिछले Conor Cunnigham ब्लॉग पोस्ट देखें)। इस मामले में हमें INNER JOIN Sales.SpecialOfferProduct
को बदलना होगा LEFT OUTER JOIN Sales.SpecialOfferProduct
एफके उन्मूलन प्राप्त करने के लिए। दोनों SpecialOfferID
और ProductID
कॉलम हैं NOT NULL
और हमारे पास SpecialOfferProduct
. के संदर्भ में एक विश्वसनीय FK है टेबल।