Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

लेफ्ट जॉइन और इनर जॉइन के बीच प्रदर्शन अंतर

कम से कम एक ऐसा मामला है जहां 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 है टेबल।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं एसक्यूएल सर्वर में टेक्स्ट का समूह कैसे जोड़ सकता हूं और बना सकता हूं?

  2. केवल SQL Server 2008 के साथ डेटा पुनर्स्थापित करें

  3. मैं एक प्रकार से अस्थायी तालिका कैसे बना सकता हूं?

  4. वर्तमान अनुक्रमणिका को स्वचालित रूप से छोड़ें और पुन:बनाएँ

  5. एकाधिक तालिकाओं से SQL INSERT INTO