Besoin d'aide avec les performances CTE récursives. Ci-dessous, CTE fonctionne très lentement car il tente d'extraire les données héréditaires de manière récurrente. La table est grande avec chaque id racine ayant jusqu'à 3 itemid récursifs. Il pourrait y avoir environ 200 000 identifiants racine ou plus. Je sais que les CTE récursifs sont lents pour un énorme ensemble de données car pour chaque rootid dans l'ancre, il serait itemid récursivement.
Schéma:
Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime)
Le tableau ci-dessus contient plus d'un million de lignes.
Requête CTE:
; With rootcte as
( select itemid from RootItem where rootid is null
union all
select r.itemid as RootId , i.itemid from RootItem i join rootcte r
on i.rootid = r.itemid
)
Nous ne pouvons pas modifier le schéma de table et utiliser heirarchyid. J'ai aussi essayé la boucle mais c'est trop lent.
Existe-t-il un autre moyen d'optimiser cette requête?
; With rootcte as
( select itemid from RootItem where rootid is null
union all
select r.itemid as RootId , i.itemid from RootItem i join rootcte r
on i.rootid = r.itemid
)
SELECT
Cust.CustomerID
, Cust.BusinessName
, sCust.RegionCustomerID
, ord.OrderID
, ord.OrderItemID
, prd.ProductCode
, rc.itemid
, rc.rootid
, mf.FileID
FROM
vw_Customer Cust
INNER JOIN SrcCustomer scust ON Cust.CustomerID = sCust.RegionCustomerID
INNER JOIN OrderItem ord ON Cust.MasterCustomerID = ord.MasterCustomerID
INNER JOIN Product ON ord.ProductID = Product.ProductID
INNER JOIN rootcte rc ON ord.RootOrderId = rc.Rootid
INNER JOIN MFolder mf ON mf.mfolderid = rc.itemid
INNER JOIN MVersion mv ON mv.mfolderversionid = mf.mfolderid
WHERE ord.IsActive = 1 and product.IsSelling = 1 and mf.fileid in (23,45,29)
and mv.isdeleted = 'N'
Je travaille également avec BI group pour changer la logique de requête et filtrer les données dans cte lui-même de déplacer quelques jointures et critères vers cte .. Merci pour tous les commentaires.