Obniżenie wydajności programu SQL Server po uruchomieniu GÓRNY, MAX lub MIN agregowania klauzulę dotyczącą kolumn innych niż kolumna partycjonowania

Objawy

Załóżmy, że masz podzielony tabel w programie Microsoft SQL Server. Po uruchomieniu TOP, MAX lub MIN agregowania klauzulę dotyczącą kolumn w tabelach, może wystąpić obniżenie wydajności.

Uwaga Ten problem tylko nie występuje w kolumnie partycjonowania.

Obejście problemu

Aby obejść ten problem, wytwarzanie kwerendę, która zbiera Pierwsze N elementów każdej partycji. Następnie należy znaleźć Pierwsze N elementów z kolekcji elementów.

Na przykład istnieje tabela T1 ma cztery partycje, a funkcja partycji jest PF1. Tabela jest podzielony na partycje kolumna PCOL i ma indeks idx_c1 na T1.c1. Można napotkać problem z wydajnością podczas Uruchom następującą kwerendę:

SELECT TOP 3 T1.c1, T1.c2
FROM dbo.T1

ORDER BY T1.c1


Aby obejść ten problem, wykonaj następujące kroki:

  1. Znajdź elementy 3 pierwszych danej partycji <partition_number>:

    SELECT TOP 3 T1.c1, T1.c2                FROM dbo.T1
    WHERE $PARTITION.PF1(PCOL) = <
    partition_number> AS A(c1, c2) ORDER BY T1.c1;
  2. Znajdź top 3 elementy wszystkich czterech partycji:

    SELECT TOP 3 A.c1, A.c2FROM (VALUES((1),(2),(3),(4)) AS P( partition_number )
    CROSS APPLY ( SELECT TOP 3 (T1.c1, T2.c2)
    FROM dbo.T1
    WHERE $PARTITION.PF1(T1.PCOL) = P.partition_number
    ORDER BY T1.c1 ) AS A
    ORDER BY A.c1
  3. Niestety Jeśli tabela jest ponownie podzielony na partycje, musisz zmodyfikować te kwerendy, aby użyć nowy numer partycji. Jednak liczba partycji można również uzyskać z sys.partitions. W związku z tym zamiast stałej listę partycji, można użyć następujący skrypt SQL:

    SELECT TOP 3 A.c1, A.c2FROM  sys.partitions AS P
    CROSS APPLY ( SELECT TOP 3 T1.c1, T2.c2)
    FROM dbo.T1
    WHERE $PARTITION.PF1(T1.col1) = P.partition_number
    ORDER BY T1.c1 ) AS A
      WHERE P.object_id = OBJECT_ID('dbo.T1')  
      AND P.index_id = INDEXPROPERTY( OBJECTID('dbo.T1'), 'idx_c1', 'INDEXID')
    ORDER BY a;


Uwaga W tym artykule użyto Pierwsze N z zamówieniem przez klauzulę co w przykładzie. Klauzule Maks. i MIN mają podobne problemy. W związku z tym że można obejść zamieniając je w kwerendach TOP 1 z zamówieniem ustawiony na rosnącym lub malejącym.

Więcej informacji

Gdy kwerenda jest wykonywana dla wierszy Pierwsze N kolumny indeksowanej tabeli niepodzielonego na partycje, ogólnie kwerenda ma bardzo dobrą wydajność. Jest tak, ponieważ plan kwerend skanowanie indeksu w celu określenia, jakie są najważniejsze elementy n.

Jednakże dla tabeli podzielonej na partycje, to obecnie nie jest, jak również mogą być podzielone na partycje indeksy. Oznacza to, że nie można zbadać jedynie indeksy, aby określić elementy pierwszych N. Tych elementów może być rozpowszechniany na wszystkich partycjach. Na przykład, rozważmy następujący przypadek, w którym masz tabelę "" z dwoma partycjami P1 i P0 , które są podzielone na partycje wokół 0:

Partycji

Klucz

Wartość

P0

-2

1

P0

-1

1

P0

0

12

P1

1

1

P1

2

1

P1

3

15


Ponieważ każdy indeks jest podzielony na partycje, program SQL Server nie można skanować indeks wszystkich w tym samym czasie, aby określić maksymalną wartość. Zamiast tego program skanuje każdy element tabeli, aby określić wartość maksymalna. W tabeli, która ma milionów wierszy ten proces może być bardzo mało wydajna.

Stan

Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji „Dotyczy”.

Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności
Poznaj szkolenia
Uzyskuj nowe funkcje w pierwszej kolejności
Dołącz do niejawnych testerów firmy Microsoft

Czy te informacje były pomocne?

Dziękujemy za opinię!

Dziękujemy za opinię! Wygląda na to, że połączenie Cię z jednym z naszych agentów pomocy technicznej pakietu Office może być pomocne.

×