Butuh bantuan dengan kinerja CTE rekursif. Di bawah ini CTE berjalan sangat lambat karena sedang mencoba menarik data heirarkis secara serampangan. Tabel besar dengan setiap id root memiliki hingga 3 itemid rekursif. Mungkin ada sekitar 200000 atau lebih id root. Saya tahu CTE rekursif lambat untuk dataset besar karena untuk setiap rootid di jangkar akan itemid secara rekursif.
Skema:
Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime)
Di atas meja memiliki lebih dari 1 juta baris.
Kueri 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
)
Kami tidak dapat mengubah skema tabel dan menggunakan heirarchyid. Saya mencoba sementara loop juga tetapi itu lambat juga.
Apakah ada cara lain untuk mengoptimalkan kueri ini?
; 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'
Saya juga bekerja dengan grup BI untuk mengubah logika kueri dan memfilter data dalam cte itu sendiri dari memindahkan beberapa gabungan dan kriteria ke cte .. Terima kasih atas semua komentar.