2017-04-17 46 views
1
SELECT C.CompanyName, 
     B.BranchName, 
     E.EmployerName, 
     FE.EmployeeUniqueID, 
     pcr.EmployerUniqueID, 
     Case when FE.Status_id= 1 then 1 else 0 end IsUnPaid, 
     Case when re.EmployeeUniqueID IS NULL OR re.EmployeeUniqueID= '' then 0 else 1 end AS 'EmployeeRegistration', 
     FE.IncomeFixedComponent, 
     FE.IncomeVariableComponent, 
     Convert(varchar(11), Fe.PayStartDate, 106) as PayStartDate, 
     Convert(varchar(11), Fe.PayEndDate, 106) as PayEndDate, 
     S.StatusDescription, 
     FE.IsRejected, 
     FE.ID 'EdrID', 
     Convert(varchar(20), tr.TransactionDateTime, 113) as TransactionDateTime, 
     tr.BatchNo, 
     tr.IsDIFCreated, 
     Convert(varchar(20),tr.DIFFileCreationDateTime,113) as DiffDateTime 
    From File_EdrEntries FE 
    JOIN PAFFiles pe ON pe.ID = FE.PAFFile_ID 
    inner Join RegisteredEmployees RE 
    ON RE.EmployeeUniqueID= FE.EmployeeUniqueID 
    inner join File_PCREntries pcr on pe.ID=pcr.PAFFile_ID 
    JOIN Employers E ON E.EmployerID = pcr.EmployerUniqueID 
    JOIN Branches B ON B.BranchID = E.Branch_ID 
    JOIN companies C ON C.COMPANYID = B.COMPANY_ID 
    JOIN Statuses S ON S.StatusID = FE.Status_ID 
    JOIN Transactions tr on tr.EDRRecord_ID= fe.ID 
    where E.Branch_id=3 
    AND FE.IsRejected=0 AND FE.Status_id= 3 and tr.BatchNo is not null 
    AND Re.Employer_ID= re.Employer_ID; 

該查詢應該返回1000萬以上的記錄,並且由於大量的記錄通常會導致超時。那麼,我該如何改善其性能,因爲我在哪裏可以做到這一點。如何防止查詢超時?

+0

,請參閱下面的網站https://msdn.microsoft.com/en-us/library/ff650689.aspx – Mansoor

+0

你通常想發佈一個執行計劃與這樣一個問題,你可以[後xml到這個頁面](https://www.brentozar.com/pastetheplan)並共享一個鏈接。 –

+0

'和Re.Employer_ID = re.Employer_ID' - 這是真的。仔細檢查你的加入邏輯,可能是你錯過了一些條件,結果變得非常大。 –

回答

2

首先,你需要

  1. 優化查詢更多
  2. 添加required Indexes參與查詢

然後表,

您可以使用此,增加查詢超時:

SET LOCK_TIMEOUT 1800; 
SELECT @@LOCK_TIMEOUT AS [Lock Timeout]; 

另請參閱This Post

+0

我做了,但沒有效果,花了25分鐘執行,但沒有返回。它需要永遠 – Covert

0

找出哪些表組合過濾最多的數據。例如,如果以下查詢過濾掉大部分數據,則可以考慮使用所需數據創建臨時表,將其索引並在較大的查詢中使用。

SELECT fe.*,re.*  
From File_EdrEntries FE 
    inner Join RegisteredEmployees RE 
    ON RE.EmployeeUniqueID= FE.EmployeeUniqueID 

將查詢分解爲更小的塊可能是最好的方法。另外請確保你有適當的索引