Necesita ayuda con el rendimiento recursivo de CTE. Por debajo de CTE se ejecuta muy lentamente, ya que está tratando de extraer datos jerárquicos de manera recusiva. La tabla es grande con cada ID de raíz que tiene hasta 3 itemid recursivos. Podría haber alrededor de 200000 o más ID de raíz. Sé que los CTE recursivos son lentos para un gran conjunto de datos, ya que para cada rootid en el anclaje se recidiría de forma recursiva.
Esquema:
Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime)
La tabla de arriba tiene más de 1 millón de filas.
Consulta 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
)
No podemos modificar el esquema de la tabla y usar heirarchyid. Intenté while loop también pero eso también es lento.
¿Hay alguna otra forma de optimizar esta consulta?
; 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'
También estoy trabajando con el grupo de BI para cambiar la lógica de consulta y filtrar datos en cte de mover un par de uniones y criterios para cte. Gracias por todos los comentarios.