再帰的なCTEパフォーマンスのヘルプが必要です。CTE以下では、階層データを再帰的にプルしようとしているため、実行速度が非常に遅くなっています。テーブルは大きく、すべてのルートIDに最大3つの再帰的なアイテムIDがあります。約200000以上のルートIDが存在する可能性があります。アンカーのすべてのrootidは再帰的にitemidになるため、再帰的なCTEは巨大なデータセットでは遅いことを知っています。
スキーマ:
Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime)上記の表には100万行を超える行があります。
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
)テーブルスキーマを変更してheirarchyidを使用することはできません。whileループも試しましたが、それも遅いです。
このクエリを最適化できる他の方法はありますか?
 ; 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' また、BIグループと連携して、クエリロジックを変更し、結合と条件のカップルの移動のcte自体のデータをフィルター処理します。すべてのコメントに感謝します。