Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Pytanie o wydajność na pierwszym miejscu w programie SQL Server HierarchyID

Nie jest do końca jasne, czy próbujesz zoptymalizować wyszukiwanie w głąb czy wszerz; pytanie sugeruje najpierw w głąb, ale komentarze na końcu dotyczą przede wszystkim wszerz.

Masz wszystkie indeksy, których potrzebujesz na pierwszym miejscu (po prostu zindeksuj hierarchyid kolumna). Po pierwsze, nie wystarczy tylko tworzyć obliczony level kolumna, musisz ją również zindeksować:

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

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

(Zauważ, że dla indeksów nieklastrowych najprawdopodobniej będziesz potrzebować INCLUDE - w przeciwnym razie SQL Server może zamiast tego użyć skanowania indeksu klastrowego.)

Teraz, jeśli próbujesz znaleźć wszystkich przodków węzła, chcesz przyjąć nieco inną taktykę. Możesz sprawić, że te wyszukiwania będą błyskawiczne, ponieważ - i oto, co jest fajnego w hierarchyid - każdy węzeł już "zawiera" wszystkich swoich przodków.

Używam funkcji CLR, aby zrobić to tak szybko, jak to możliwe, ale możesz to zrobić z rekurencyjnym CTE:

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

Teraz, aby uzyskać wszystkich przodków i potomków, użyj go w ten sposób:

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

Wypróbuj - to powinno rozwiązać Twoje problemy z wydajnością.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Obsługa nieistniejących wartości w wyrażeniu zapytania sql dla wykresu ssrs

  2. Jak utworzyć tabelę na podstawie innej tabeli?

  3. Klasyczny problem ASP z połączeniem ze zdalną bazą danych SQL Server

  4. Przedstawiamy nową funkcję — replikację Spotlight w chmurze

  5. Konwertowanie int klucza podstawowego na bigint w Sql Server