Hai bisogno di aiuto con le prestazioni CTE ricorsive. Sotto CTE sta funzionando molto lentamente mentre sta cercando di estrarre i dati gerarchici in modo ricusivo. La tabella è grande con ogni ID root con fino a 3 itemid ricorsivi. Potrebbero esserci circa 200000 o più ID root. So che i CTE ricorsivi sono lenti per enormi set di dati poiché per ogni rootid in anchor sarebbe itemid ricorsivamente.
Schema:
Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime)
La tabella sopra ha più di 1 milione di righe.
Query 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
)
Non possiamo modificare lo schema delle tabelle e usare heirarchyid. Ho provato anche in loop ma anche quello è lento.
Esiste un altro modo per ottimizzare questa query?
; 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'
Sto anche lavorando con il gruppo BI per modificare la logica delle query e filtrare i dati nel cte stesso di spostare un paio di join e criteri in cte .. Grazie per tutti i commenti.