Je recherche des astuces/astuces pour améliorer les performances d'une procédure stockée avec plusieurs instructions SELECT insérées dans une table. Tous les objets auxquels je participe sont déjà indexés.Améliorer les performances d'une requête sql
Je crois que la raison de cette procédure stockée prend presque une heure à courir est parce qu'il ya plusieurs instructions SELECT suivantes en utilisant deux vues: rvw_FinancialLineItemValues et rvw_FinancialLineItems
En outre, chaque instruction SELECT utilise des valeurs codées en dur spécifiques pour AccountNumber, LineItemTypeID et quelques autres valeurs de champ provenant de deux vues mentionnées ci-dessus.
Est-ce que cela améliorerait les performances si je crée une table temporaire, qui récupère TOUTES les données nécessaires pour ces instructions SELECT en même temps, puis utilise cette table temporaire dans ma jointure?
Existe-t-il d'autres moyens d'améliorer les performances et la gestion?
SELECT
@scenarioid,
@portfolioid,
pa.Id,
pa.ExternalID,
(select value from fn_split(i.AccountNumber,'.') where id = 1),
ac.[Description],
cl.Name,
NullIf((select value from fn_split(i.AccountNumber,'.') where id = 2),''),
NullIf((select value from fn_split(i.AccountNumber,'.') where id = 3),''),
ty.Name,
v.[Date],
cast(SUM(v.Amount) as decimal(13,2)),
GETDATE()
FROM rvw_FinancialLineItems i
INNER JOIN rvw_Scenarios sc
ON i.ScenarioId = sc.Id
AND sc.Id = @scenarioid
AND sc.PortfolioId = @portfolioid
INNER JOIN #pa AS pa
ON i.PropertyAssetID = pa.Id
INNER JOIN rvw_FinancialLineItemValues v
ON i.ScenarioId = v.ScenarioId
AND i.PropertyAssetID = v.PropertyAssetID
AND i.Id = v.FinancialLineItemId
AND ((i.BusinessEntityTypeId = 11
AND i.LineItemTypeId = 3002)
OR (i.LineItemTypeId IN (2005, 2010, 2003, 2125, 2209, 5012, 6001)
AND i.ModeledEntityKey = 1))
AND i.AccountNumber not in ('401ZZ','403ZZ')
AND i.AccountNumber not in ('401XX')
AND i.AccountNumber not in ('40310','41110','42010','41510','40190','40110') -- exclude lease-level revenues selected below
AND v.[Date] BETWEEN @fromdate AND
CASE
WHEN pa.AnalysisEnd < @todate THEN pa.AnalysisEnd
ELSE @todate
END
AND v.ResultSet IN (0, 4)
INNER JOIN rvw_Portfolios po
ON po.Id = @portfolioid
INNER JOIN Accounts ac
ON po.ChartOfAccountId = ac.ChartOfAccountId
AND i.AccountNumber = ac.AccountNumber
AND ac.HasSubAccounts = 0
INNER JOIN fn_LookupClassTypes() cl
ON ac.ClassTypeId = cl.Id
INNER JOIN LineItemTypes ty
ON ac.LineItemTypeId = ty.Id
LEFT JOIN OtherRevenues r
ON i.PropertyAssetID = r.PropertyAssetID
AND i.AccountNumber = r.AccountID
AND v.[Date] BETWEEN r.[Begin] AND r.[End]
WHERE (r.IsMemo IS NULL
OR r.IsMemo = 0)
GROUP BY pa.AnalysisBegin
,pa.Id
,pa.ExternalID
,i.AccountNumber
,ac.[Description]
,cl.Name
,ty.Name
,v.[Date]
HAVING SUM(v.amount) <> 0
Avez-vous consulté le plan d'exécution de la requête et/ou l'estimation pour voir si un noeud particulier est à l'origine du temps d'exécution? – Anand