簡體   English   中英

有沒有比用戶“ INNER JOIN”更好的聯接多個表的方法

[英]Is there a better way to join several tables rather than user 'INNER JOIN'

我正在寫一個查詢以從八個表中獲取50列。 只是出於好奇,還有比在inner join Table A on Table B.orderNumber = Table A.OrderNumber使用一系列inner join Table A on Table B.orderNumber = Table A.OrderNumber更好的方法來獲取數據,而不是對表AH inner join Table A on Table B.orderNumber = Table A.OrderNumber

運行該數據庫的是SQL Server 2008。

這是我仍在寫的初始查詢:

SELECT
    /*Buyer and Seller information for order number */
   [QCV_BuyerSellers].[OrderNumber] AS OrderNum
  ,[QCV_BuyerSellers].[OrderGuid] AS Order_GUID
  ,[QCV_BuyerSellers].[Buyer1_EntityTypeId] AS ENT_TYPE
  ,[QCV_BuyerSellers].[Buyer1_EntityTypeName] AS ENT_TYPE_NAME
  ,[QCV_BuyerSellers].[Buyer1_FullName] AS FULL_NAME
  ,[QCV_BuyerSellers].[Buyer1_FirstName] AS BF_Name
  ,[QCV_BuyerSellers].[Buyer1_MiddleName] AS BM_Name
  ,[QCV_BuyerSellers].[Buyer1_LastName] AS BL_Name
  ,[QCV_BuyerSellers].[Buyer1_TIN] AS B_Tin1
  ,[QCV_BuyerSellers].[Buyer1_PhoneHome] AS B_PhoneHome
  ,[QCV_BuyerSellers].[Buyer1_PhoneWork] AS B_PhoneWork

  ,[QCV_BuyerSellers].[Buyer2_FullName] AS FULL_NAME2
  ,[QCV_BuyerSellers].[Buyer2_FirstName] AS BF_Name2
  ,[QCV_BuyerSellers].[Buyer2_MiddleName] AS BM_Name2
  ,[QCV_BuyerSellers].[Buyer2_LastName] AS BL_Name2
  ,[QCV_BuyerSellers].[Buyer2_TIN] AS B_Tin2
  ,[QCV_BuyerSellers].[Buyer2_PhoneHome] AS B_PhoneHome2
  ,[QCV_BuyerSellers].[Buyer2_PhoneWork] AS B_PhoneWork2

  ,[QCV_BuyerSellers].[Seller1_FirstName] AS SF_Name
  ,[QCV_BuyerSellers].[Seller1_MiddleName] AS SM_Name
  ,[QCV_BuyerSellers].[Seller1_LastName] AS SL_Name
  ,[QCV_BuyerSellers].[Seller1_TIN] AS S_Tin
  ,[QCV_BuyerSellers].[Seller1_PhoneHome] AS S_PhoneHome
  ,[QCV_BuyerSellers].[Seller1_PhoneWork] AS S_PhoneWork

  ,[QCV_BuyerSellers].[Seller2_FirstName] AS SF_Name2
  ,[QCV_BuyerSellers].[Seller2_MiddleName] AS SM_Name2
  ,[QCV_BuyerSellers].[Seller2_LastName] AS SL_Name2
  ,[QCV_BuyerSellers].[Seller2_TIN] AS S_Tin2
  ,[QCV_BuyerSellers].[Seller2_PhoneHome] AS S_PhoneHome2
  ,[QCV_BuyerSellers].[Seller2_PhoneWork] AS S_PhoneWork2

  /*OMFILE Property table fields by order number */
  ,[OMFILE_PROPERTY].[PropertyAddress1] AS Prop_Adress
  ,[OMFILE_PROPERTY].[PropertyCity] AS Prop_City
  ,[OMFILE_PROPERTY].PropertyCounty AS Prop_County
  ,[OMFILE_PROPERTY].PropertyState AS Prop_State 
  ,[OMFILE_PROPERTY].PropertyZip AS Prop_Zip
  ,[OMFILE_PROPERTY].PropertyBriefLegal1 AS Prop_Brief1
  ,[OMFILE_PROPERTY].PropertyBriefLegal2 AS Prop_Brief2

  ,[OMEXT2_SUBDIVISION].SubdPUDFlag AS SD_PUD_FLAG
  ,[OMEXT2_SUBDIVISION].SubdCondominiumFlag AS SD_Condo_Flag

   /*OMFILE Payoff Fields for order number */
  ,[OMFILE_PAYOFFS].[Payoff1Name] 
  ,[OMFILE_PAYOFFS].[Payoff1LoanNumber] 
  ,[OMFILE_PAYOFFS].[Payoff1Phone] 

  ,[OMFILE_PAYOFFS].[Payoff2Name] 
  ,[OMFILE_PAYOFFS].[Payoff2LoanNumber] 
  ,[OMFILE_PAYOFFS].[Payoff2Phone]

  /*Loan Number & Amount From  OMFILE_LENDERLOAN table */
  ,[OMFILE_LENDERLOAN].[LoanNumber]  
  ,[OMFILE_LENDERLOAN].[LoanAmount] 

 FROM [REO].[dbo].[V_BuyerSellers] 
  INNER JOIN [REO].[dbo].[OMFILE_PROPERTY] 
  on V_BuyerSellers_Flat.OrderNumber = OMFILE_PROPERTY.OrderNumber
  INNER JOIN 
  [REO].[dbo].[OMEXT2_SUBDIVISION]
  on [REO].[OrderNumber] = [OMEXT2_SUBDIVISION].[OrderNumber]
  INNER JOIN [REO].[dbo].[OMFILE_PAYOFFS] 
  on [OMFILE_PROPERTY].[OrderNumber] = [OMFILE_PAYOFFS].[OrderNumber] 
  INNER JOIN [REO].[dbo].[OMFILE_LENDERLOAN] 
  on [OMFILE_PAYOFFS].[OrderNumber] = [OMFILE_LENDERLOAN].[OrderNumber] 

  WHERE [QCV_BuyerSellers].[OrderNumber] = 'QCT-8735410'

我建議您先使用“包含實際執行計划”(Ctrl-M啟用/禁用此選項)運行查詢,然后尋找可以提高性能的缺失索引。 您的查詢沒有任何明顯的缺陷可以重構。 看起來您已經在使用一個視圖,可以從該查詢中創建一個新視圖並對其進行索引,但是並不能保證索引視圖的性能要優於引用索引表的視圖,通常是引用基礎視圖的索引表仍在使用。

有多種方法可以避免由於聯接多個表而導致性能下降,但是它們也有其缺點。 您可以不使用WHERE而從該查詢創建表並為OrderNumber字段建立索引。 如果您還沒有准備好實現適當的數據倉庫,那將是一條黑暗的道路,因為您最終可能會得到大量的一次性報告表,並且根據環境的不同,可能需要在此更新不合理的間隔。

通常,與使用舊式方法(即:在PK = FK上使用WHERE相比, JOINS具有更好的性能和可讀性。

我會堅持JOINS

如果需要考慮性能,建議您使用SQL Profiler進行完整的分析。

我還建議編寫一個視圖,以便在復雜查詢的SELECT上獲得更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM