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.
Jawaban:
Anda mengatakan bahwa hierarki akan dimodifikasi. Agaknya saat operasi ini berjalan, ada sejumlah pemblokiran yang terjadi kemudian?
Bahkan jika hirarki berubah, apakah akar untuk item berubah?
Sudahkah Anda melihat waktu yang diperlukan untuk hanya membuat tabel pemetaan dari root ke item dan mengindeksnya?
Saya ingin melihat rencana eksekusi untuk melihat apa yang terjadi - CTE harus digulung, tetapi sebagai tabel yang terwujud dan diindeks secara manual, itu mungkin berkinerja lebih baik pada langkah-langkah selanjutnya.
Bahkan dengan aktivitas yang berat, bagi saya tampaknya seseorang harus diblokir jika operasi DML mengubah data yang sedang dibaca proses ini.
Jadi saya sangat mempertimbangkan untuk mengambil snapshot dari hierarki.
Selain itu, Anda memiliki sejumlah GABUNGAN INNER lainnya - Anda harus meninjau apakah CTE sama sekali, dan apakah ada indeks yang hilang untuk membuat penggabungan tersebut efektif. Rencana pelaksanaan harus memberi tahu Anda hal itu.
Anda tampaknya memiliki beberapa hal dalam klausa WHERE yang mungkin membantu mengurangi beberapa operasi (dan menentukan indeks mana yang terbaik)), tetapi sulit untuk mengatakannya tanpa melihat rencana pelaksanaan atau indeks.
sumber