Kinerja CTE rekursif


8

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.


2
mengapa Anda membutuhkan semua hierarki? Haruskah tidak ada tempat di mana petunjuk di suatu tempat sehingga Anda hanya menghitung untuk catatan yang ingin Anda gunakan. Tentunya Anda tidak perlu membangun jutaan hierarki setiap kali Anda menjalankan ini.
HLGEM

Ini adalah laporan agunan yang dijalankan sekitar 5-6 kali dalam satu jam kerja dan harus dijalankan pada seluruh dataset. Saya bisa melakukan preload data jika data statis atau tidak sering dimasukkan tetapi dalam kasus ini operasi DML sering berjalan di tabel ini dalam DB.
njvds

Indeks apa yang Anda miliki di tabel ini?
ypercubeᵀᴹ

ItemID adalah kunci utama dan ada juga indeks non clustered pada itemid dan juga rootid.
njvds

1
Anda harus menunjukkan kueri yang sebenarnya Anda gunakan. Seperti sekarang, yang Anda lakukan adalah cara yang rumit untuk mengembalikan semua ItemID dari tabel. CTE rekursif tidak menambah nilai.
Mikael Eriksson

Jawaban:


3

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.


Mengapa operasi DML memblokir SELECT? Apakah SQL Server masih sebatas itu?
a_horse_with_no_name

@a_horse_with_no_name msdn.microsoft.com/en-us/library/ms173763.aspx mungkin saja tetapi pengguna menyebutkan ada aktivitas tinggi, jadi dia perlu mempertimbangkan strateginya
Cade Roux
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.