Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pertanyaan tentang kinerja SQL Server HierarchyID depth-first

Tidak sepenuhnya jelas apakah Anda mencoba mengoptimalkan penelusuran yang mengutamakan kedalaman atau keluasan terlebih dahulu; pertanyaannya menyarankan yang mendalam terlebih dahulu, tetapi komentar di bagian akhir adalah tentang yang luas terlebih dahulu.

Anda memiliki semua indeks yang Anda butuhkan untuk depth-first (cukup indeks hierarchyid kolom). Untuk keluasan-pertama, tidak cukup hanya dengan membuat level yang dihitung kolom, Anda harus mengindeksnya juga:

ALTER TABLE Message
ADD [Level] AS MessageID.GetLevel()

CREATE INDEX IX_Message_BreadthFirst
ON Message (Level, MessageID)
INCLUDE (...)

(Perhatikan bahwa untuk indeks yang tidak berkerumun kemungkinan besar Anda memerlukan INCLUDE - jika tidak, SQL Server dapat melakukan pemindaian indeks berkerumun sebagai gantinya.)

Sekarang, jika Anda mencoba menemukan semua leluhur dari sebuah node, Anda ingin mengambil taktik yang sedikit berbeda. Anda dapat melakukan penelusuran ini secepat kilat, karena - dan inilah yang keren dari hierarchyid - setiap simpul sudah "berisi" semua leluhurnya.

Saya menggunakan fungsi CLR untuk membuat ini secepat mungkin, tetapi Anda dapat melakukannya dengan CTE rekursif:

CREATE FUNCTION dbo.GetAncestors
(
    @h hierarchyid
)
RETURNS TABLE
AS RETURN
WITH Hierarchy_CTE AS
(
    SELECT @h AS id

    UNION ALL

    SELECT h.id.GetAncestor(1)
    FROM Hierarchy_CTE h
    WHERE h.id <> hierarchyid::GetRoot()
)
SELECT id FROM Hierarchy_CTE

Sekarang, untuk mendapatkan semua leluhur dan keturunan, gunakan seperti ini:

DECLARE @MessageID hierarchyID   /* passed in from application */

SELECT m.MessageID, m.MessageComment 
FROM Message as m
WHERE m.MessageId.IsDescendantOf(@MessageID) = 1
OR m.MessageId IN (SELECT id FROM dbo.GetAncestors(@MessageID.GetAncestor(1)))
ORDER BY m.MessageID

Cobalah - ini akan menyelesaikan masalah kinerja Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hasil SSMS ke Kotak - CRLF tidak disimpan dalam salin/tempel - ada teknik yang lebih baik?

  2. Bagaimana cara menghubungkan Cakephp 1.3 dengan MS SQLServer 2008?

  3. Bagaimana cara menghubungkan aplikasi Android ke SQL Server melalui jbdc?

  4. C# SQLServer mengambil hasil dan menempatkan dalam format .csv

  5. Kelola Konkurensi Transaksi Menggunakan Kunci di SQL Server