Cần giúp đỡ với hiệu suất CTE đệ quy. Bên dưới CTE đang chạy rất chậm vì nó đang cố gắng kéo dữ liệu theo kiểu bá đạo. Bảng là lớn với mỗi id gốc có tối đa 3 itemid đệ quy. Có thể có khoảng 200000 id gốc trở lên. Tôi biết CTE đệ quy rất chậm đối với tập dữ liệu khổng lồ vì với mỗi rootid trong neo, nó sẽ được đệ quy đệ quy.
Lược đồ :
Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime)
Bảng trên có hơn 1 triệu hàng.
Truy vấn 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
)
Chúng ta không thể sửa đổi lược đồ bảng và sử dụng heirarchyid. Tôi đã thử trong khi loop quá nhưng điều đó cũng chậm.
Có cách nào khác để tôi có thể tối ưu hóa truy vấn này không?
; 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'
Tôi cũng đang làm việc với nhóm BI để thay đổi logic truy vấn và lọc dữ liệu trong chính cte của việc di chuyển vài phép nối và tiêu chí thành cte .. Cảm ơn tất cả các ý kiến.