Comment empêcher le timeout d'attente dans la requête?

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_EdrEnsortinges FE JOIN PAFFiles pe ON pe.ID = FE.PAFFile_ID inner Join RegisteredEmployees RE ON RE.EmployeeUniqueID= FE.EmployeeUniqueID inner join File_PCREnsortinges 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; 

Cette requête est censée renvoyer 10 millions d'loggings ou plus et entraîne généralement un dépassement de timeout en raison d'un grand nombre d'loggings. Alors, comment puis-je améliorer ses performances parce que je l'ai fait dans un état où je pouvais.

Tout d'abord, vous devez

  1. optimiser la requête plus
  2. Ajouter les index requirejs aux tables impliquées dans la requête

Alors,

Vous pouvez l'utiliser pour augmenter le timeout d'attente de la requête:

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

Aussi, référez-vous à ce message

Découvrez quelle combinaison de tables filter le plus de données. Par exemple, si la requête suivante filter la majorité des données que vous pourriez envisager de créer une table temporaire avec datatables nécessaires, indexez-la et utilisez-la dans votre requête plus grande.

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

Briser la requête en plus petits morceaux est probablement le meilleur moyen d'y aller. Assurez-vous également que vous avez les bons index en place