Kwerendy przetwarzania rozszerzenia na podzielonym na partycje, tabele oraz indeksy

SQL Server 2008 zwiększa wydajność przetwarzania kwerendy na tabelach podzielonym na partycje dla wielu planów równolegle, zmienia sposób planów równoległe i szeregowe są reprezentowane i rozszerza informacje o partycjonowanie, pod warunkiem że w obu planach wykonanie w czasie kompilacji i czas wykonywania.W tym temacie opisano te udoskonalenia zawiera wskazówki dotyczące interpretacji planów wykonywania kwerend podzielonym na partycje tabel i indeksów i zawiera najważniejsze wskazówki dotyczące zwiększania wydajności kwerendy dotyczące obiektów podzielonym na partycje.

Uwaga

Tabele podzielonym na partycje i indeksy są obsługiwane tylko w SQL Server Wersje Enterprise Developer i oceny.

Wyszukiwanie nowych partycji Aware operacji

In SQL Server 2008, the internal representation of a partitioned table is changed so that the table appears to the query processor to be a multicolumn index with PartitionID as the leading column.PartitionID is a hidden computed column used internally to represent the ID of the partition containing a specific row.Załóżmy na przykład, tabela T, zdefiniowana jako T(a, b, c), jest podzielony na partycje kolumna a, a ma indeks klastrowany kolumna b. W SQL Server 2008, w tej tabela partycjonowana jest wewnętrznie traktowana jako nonpartitioned tabeli ze schematem T(PartitionID, a, b, c) i indeksem klastrowanym dla projektu wstępnego (kluczPartitionID, b). Dzięki temu kwerendy optymalizatora do wykonywania wyszukiwania na podstawie operacji PartitionID w tabela partycjonowana lub indeksu.

Usunięcie partycji teraz odbywa się w tym operacji wyszukiwania.

Ponadto optymalizator kwerendy jest rozszerzany, dzięki czemu można wykonać operacji wyszukiwania lub skanowania, z jednym warunkiem na PartitionID (jak logiczne kolumna wiodące) i ewentualnie inne kolumny kluczy indeksu, a następnie drugiego poziom wyszukiwania, inny warunek, można wykonać na jednej lub kilku dodatkowych kolumn, dla każdej różne wartości spełniające kwalifikacji dla pierwszego poziom poszukiwania pracy. To znaczy tę operację, o nazwie Pomiń skanowania umożliwia optymalizator kwerendy do wykonywania wyszukiwania lub skanowania operacji na podstawie jednego warunku w celu określenia partycji można uzyskać dostęp i operacji wyszukiwania indeksu drugiego poziom, w tym operator zwraca wierszy z tych partycji, która spełnia inny warunek.Na przykład rozważmy następującą kwerendę.

SELECT * FROM T WHERE < 10 i b = 2;

W tym przykładzie założono, że tabela T, zdefiniowana jako T(a, b, c), jest podzielony na partycje kolumna a, a ma indeks klastrowany kolumna b. Granice partycji dla tabela T definiuje się za pomocą następujących funkcja partycji:

CREATE PARTITION funkcja myRangePF1 (int) jako zakres LEFT dla VALUES (3, 7, 10);

Aby rozwiązać kwerendę, procesor kwerend dokonuje pierwszego poziom operacji, aby znaleźć wszystkich partycji, która zawiera wiersze spełniające warunek wyszukiwania T.a < 10. Identyfikuje partycje można uzyskać dostęp.W ramach każdej partycji zidentyfikowane procesor wykonuje następnie drugiego poziom dążyć do indeks klastrowany kolumna b Aby znaleźć wiersze spełniające warunek T.b = 2 i T.a < 10.

Na poniższej ilustracji jest logiczną reprezentacją Pomiń operację skanowania.Pokazuje tabela T z danymi w kolumnach a i b. Partycje są ponumerowane 1 do 4 z granicami partycji przez pionowe linie przerywane.Operacji wyszukiwania pierwszego poziom na partycje, (nie pokazano na ilustracji) wykrył, że partycje 1, 2 i 3 spełnia warunek wyszukiwania implikowane przez partycjonowanie zdefiniowanych dla tabela i predykat kolumna a. Oznacza to, T.a < 10. Przedstawia ścieżka przesunięta przez drugiego poziom wyszukiwania część Pomiń operację skanowania przez linii krzywej.W istocie Pomiń operację skanowania dąży do każdej z tych partycji dla wierszy spełniających warunek b = 2. Całkowity koszt Pomiń operację skanowania jest taka sama, jak stara się z trzech oddzielnych indeksu.

Shows the skip scan operation.

Wyświetlane informacje o partycjonowanie wykonanie kwerendy plany

Plany wykonanie kwerendy na podzielonym na partycje tabel i indeksów może być badane przy użyciu Transact-SQL Instrukcje zestaw zestaw SHOWPLAN_XML lub zestaw STATISTICS XML lub poprzez korzystanie z danych wyjściowych planu wykonywania graficznego w SQL Server Management Studio. Na przykład, można wyświetlić kompilacji-czas planów wykonywania przez kliknięcie przycisku Wyświetlanie szacowany wykonanie planu na pasku narzędzi Edytora kwerend oraz uruchomienia-czas plan, klikając przycisk Zawierają rzeczywiste plan wykonanie.

Za pomocą tych narzędzi, użytkownik może ustalić następujące informacje:

  • Operacje takie jak skanowanie, stara wstawia, aktualizacje, wyrażona w dokumentach i usuwa dostępu podzielony na partycje tabel i indeksów.

  • Partycje, dostęp do tej kwerendy.Na przykład, całkowita liczba dostęp do partycji i zakresy ciągłe partycje, które są dostępne są dostępne w wykonywania-czas planów wykonania.

  • Kiedy Pomiń operację skanowania jest używany w operacji wyszukiwania lub skanowania do pobierania danych z jednej lub kilku partycji.

Aby uzyskać więcej informacji na temat wyświetlania planów wykonywania Zobacz Execution Plan How-to Topics.

Ulepszenia informacji o partycji

SQL Server 2008 Zawiera informacje o partycjonowanie rozszerzonych dla obu planów wykonania w czasie kompilacji i czas wykonywania.Plany wykonanie teraz podaj następujące informacje:

  • Opcjonalny Podzielony na partycje atrybut, który wskazuje, że operator, takie jak wyszukiwania, skanowania, wstawiania, aktualizacji, scalanie lub usuwanie, jest wykonywana na podzielonym na partycje tabeli.

  • Nowy SeekPredicateNew elementu o SeekKeys podelement, zawierającej PartitionID jak wiodących indeks klucz kolumna i filtru warunki określone przez zakres stara się na PartitionID. Obecność dwóch SeekKeys podelementy wskazuje, że operacją skanowania Pomiń na PartitionID jest używany.

  • Informacje podsumowujące, które zawiera całkowitą liczbę dostęp do partycji.Ta informacja jest dostępna tylko w procesie-czas planów.

Aby wykazać, w jaki sposób te informacje są wyświetlane zarówno dane wyjściowe planu wykonywania graficznego, jak i dane wyjściowe XML plan wykonania, należy wziąć pod uwagę następujące kwerendy na podzielonym na partycje tabela fact_sales. Ta kwerenda aktualizuje dane w dwie partycje.

UPDATE fact_sales

zestaw Ilość = ilość * 2

WHERE date_id między 20080802 I 20080902;

Na poniższej ilustracji przedstawiono właściwości Szukaj indeks klastrowany operator w plan wykonania w czasie kompilacji dla tej kwerendy.Aby wyświetlić definicję fact_salesTabela i definicji partycji, zobacz sekcję "" example", w tym temacie.

Partition information in the Showplan output.

Atrybut podzielonym na partycje

Gdy operator takie jak Szukaj indeksu jest wykonywane według tabela partycjonowana lub indeksu Podzielony na partycje atrybut pojawia się w czasie kompilacji i czas wykonywania planu i jest ustawiona na True (1). Atrybut nie jest wyświetlany, gdy jest ustawiona na False (0).

The Partitioned atrybut can appear in the following physical and logical operators:

  • Skanowanie tabela

  • Skanowanie indeksu

  • Szukaj indeksu

  • Wstawianie

  • Aktualizacja

  • Usuń

  • Korespondencji seryjnej

Jak pokazano na poprzednim rysunku, ten atrybut jest wyświetlany we właściwościach operator, w którym jest zdefiniowana.W wyniku XML plan wykonania ten atrybut jest wyświetlana jako Podzielony na partycje = "1" in the RelOp węzła operator, w którym jest zdefiniowana.

Nowe wyszukiwanie predykatu

W danych wyjściowych XML plan wykonania SeekPredicateNew element jest wyświetlany w operatorze, w którym jest zdefiniowana.Nazwa może zawierać maksymalnie dwa wystąpienia SeekKeys sub-element.Pierwszy SeekKeys element określa operacji poziom identyfikator partycji logicznych indeksu wyszukiwania pierwszego poziom.Oznacza to, że tego wyszukiwania określa partycje, które muszą być dostępne warunki tej kwerendy.Drugi SeekKeys element określa część wyszukiwania drugiego poziom Pomiń operację skanowania, występujący w wyszukiwania pierwszego poziom na każdej partycji.

Podsumowanie informacji o partycji

W planach wykonanie w czasie wykonywania podsumowanie informacji o partycjach zapewnia liczba partycji, dostęp do i tożsamość partycje rzeczywistym uzyskać dostęp do.Aby zweryfikować, że prawidłowe partycje są dostępne w kwerendzie i że wszystkie partycje są usunięte ze sprawą, można użyć tych informacji.

Podano następujące informacje: Rzeczywista liczba partycji, and Partycje dostępu.

Rzeczywista liczba partycji jest całkowita liczba partycji dostępny przez kwerendę.

Partycje dostępu, w wyprowadzeniu plan wykonania XML jest informacje podsumowujące partycji, która pojawia się w nowym RuntimePartitionSummary elementRelOp węzła operator, w którym jest zdefiniowana.W poniższym przykładzie wyświetlana jest zawartość RuntimePartitionSummary element, wskazujący, że dostępne są dwie partycje całkowita (partycje 2 i 3).

<RunTimePartitionSummary>

    <PartitionsAccessed PartitionCount="2" >

        <PartitionRange Start="2" End="3" />

    </PartitionsAccessed>

</ RunTimePartitionSummary>

Wyświetlanie informacji o partycji przy użyciu innych metod plan wykonania

Metody plan wykonania SHOWPLAN_ALL, SHOWPLAN_TEXT i STATISTICS profilu nie jest zgłaszane opisana w tym temacie, z wyjątkiem następujących informacji o partycji.W ramach WYSZUKIWANIE predykat, partycje z myślą o uzyskiwaniu dostępu do niego są identyfikowane za pomocą predykat zakres kolumna obliczana reprezentującą identyfikator partycji.W poniższym przykładzie WYSZUKIWANIE predykat dla Szukaj indeks klastrowany operator.Partycje, 2 i 3 są dostępne i filtry wiersze spełniające warunek operator wyszukiwania date_id BETWEEN 20080802 AND 20080902.

|--Seek(OBJECT:([db_sales_test].[dbo].[fact_sales].[ci]) indeks klastrowany

POSZUKIWANIE:([PtnId1000>= [2] I [PtnId1000<= (3)

I [db_sales_test]. [dbo]. [fact_sales]. [date_id>= (20080802)

I [db_sales_test]. [dbo]. [fact_sales]. [date_id<= (20080902))

                ZAMÓWIONE DO PRZODU)

Interpretowanie wykonanie plany dla hałd podzielonym na partycje

W SQL Server 2008, sterty podzielonym na partycje jest traktowany jako logiczne indeksu na identyfikator partycji. Usunięcie partycji na podzielonym na partycje stosu jest reprezentowana w plan wykonania jako Skanowanie tabela operator z predykat wyszukiwania na partycji nazwę.W poniższym przykładzie pokazano plan wykonania informacje:

|--tabela skanowania (OBJECT: ([db].[dbo].[T]) wyszukiwania: ([PtnId1001]=[Expr1011]) ZAMÓWIONE FORWARD)

Interpretowanie wykonanie plany dla Collocated sprzężenia

łączyć współwystępowanie może pojawić się wtedy, gdy dwie tabele są na partycje przy użyciu funkcja taki sam lub równoważny partycjonowanie na partycje i partycjonowanie kolumny po obu stronach łączyć są określone w warunek łączyć z kwerendy.optymalizator kwerendy można wygenerować planu, w którym partycje każdej tabela, które mają równe partycji identyfikatory są sprzężone oddzielnie.Sprzężenia collocated może być szybsze niż inne niż collocated sprzężenia, ponieważ może wymagają one mniej pamięci i czas przetwarzania.Optymalizator wybiera planu nie collocated lub plan collocated oparte na szacowane koszty.

W planie collocated Pętle zagnieżdżone łączyć odczytuje jednej lub kilku sprzężonych tabela lub indeksu partycji z wewnętrznej stronie.Numery w obrębie Skanowanie stała operatorów reprezentują numerów partycji.

Podczas generowania równoległych planów collocated łączyć tabel podzielonym na partycje lub indeksy, Proste operator pojawi się między Skanowanie stała and the Pętle zagnieżdżone operatorów łączyć.przypadek wielu threads po stronie zewnętrznej łączyć każdy odczytać i pracować na inną partycję.

Na poniższej ilustracji pokazano planu kwerendy równoległych collocated łączyć.

Co-located Join Execution Plan

Równoległe strategii wykonanie kwerendy dla obiektów podzielonym na partycje

Procesor kwerend używa strategii wykonywanie równoległe kwerendy, które wybierać obiekty podzielonym na partycje.W ramach strategii wykonywania procesor kwerend określa partycji tabela wymagane dla tej kwerendy i część wątków ma być przydzielona dla każdej partycji.W większości przypadków procesor kwerend przydziela równa lub niemal równa Liczba wątków na każdej partycji i wykonuje kwerendę równolegle na partycje.Następuje wyjaśnić alokacji wątek bardziej szczegółowo.

Jeśli liczba wątek jest mniejsza niż liczba partycji, procesor kwerend przypisuje każdego wątek na inną partycję, początkowo pozostawienie jednej lub kilku partycji bez przypisane wątek.Wątek zakończy się wykonywanie na partycji, procesor kwerend przypisuje go do następnego partycji aż każda partycja została zarejestrowana w jednym wątku.przypadek tylko przypadek, w którym procesor kwerend reallocates wątków na partycje.

Shows thread reassigned after it finishes

Jeśli liczba wątków jest równa liczbie partycji, procesor kwerend przypisuje jeden wątek na każdej partycji.Po zakończeniu działania wątek, jest nie odbiorczego na inną partycję.

Shows one thread allocated to each partition

Jeśli liczba wątków jest większa niż liczba partycji, procesor kwerend przydziela równą liczbę wątków dla każdej partycji.Jeśli liczba wątków nie jest wielokrotnością liczby partycji, procesor kwerend przydziela jeden wątek dodatkowe niektóre partycje do używania wszystkich dostępnych wątków.Należy zauważyć, że jeśli istnieje tylko jedna partycja, wszystkie wątki zostaną przypisane do tej partycji.W poniższym diagramie istnieją cztery partycje i 14 wątków.Każda partycja ma 3 wątków przypisanych, a wątek dodatkowe, na dla wszystkich przydziałów 14 wątku ma dwie partycje.Po zakończeniu działania wątek, jest nie przypisane na inną partycję.

Shows multiple threads allocated to the partitions

Mimo że powyższe przykłady sugerują prosty sposób przydzielić wątków, rzeczywiste strategii jest bardziej złożony i kont do innych zmiennych, które występują podczas wykonywania kwerendy.Na przykład jeśli tabela jest podzielony na partycje i indeks klastrowany kolumna i kwerenda ma klauzula predykatu WHERE A IN (13, 17, 25), procesor kwerend przyzna jeden lub więcej wątków do każdego z tych trzech wyszukiwania wartości)A=13, A=17, a A=25) zamiast każdej tabeli partycji. Jest tylko do wykonywania kwerendy w partycjach, które zawierają te wartości, a jeśli wszystkie te poszukiwania predykaty się tak zdarzyć się w tej samej partycji tabela, wszystkie wątki zostaną przypisane do tej samej tabela partycji.

Aby inny przykład, załóżmy że tabela ma cztery partycje kolumna A granicą punktów (10, 20, 30), indeksu kolumna B, a kwerenda zawiera klauzulę predykatu WHERE B IN (50, 100, 150). Ponieważ partycji tabeli są oparte na wartościach a, wartości B może wystąpić w dowolnej tabeli partycji. W ten sposób procesor kwerend będzie wyszukiwania dla każdego z trzech wartości B (50, 100, 150) w każdej z czterech tabela partycji.Procesor kwerend będzie przypisany wątków proporcjonalnie, dzięki czemu możliwe wykonać każdego z tych skanowania 12 kwerendy równolegle.

Tabela partycji oparty na kolumnie A

Stara się dla każdej partycji tabela kolumna B

Tabela partycji 1: A < 10

B = 50, B = 100 B = 150

Tabela partycji 2: A >= 10 AND A < 20

B = 50, B = 100 B = 150

Tabela partycji 3: A >= 20 AND A < 30

B = 50, B = 100 B = 150

Tabela partycji 4: A >= 30

B = 50, B = 100 B = 150

Najważniejsze wskazówki

Aby poprawić wydajność kwerendy korzystanie z dużej ilości danych przy użyciu dużych tabel podzielonym na partycje i indeksów, firma Microsoft zaleca następujące wskazówki:

  • Każda partycja pasek na wielu dyskach.

  • Jeśli jest to możliwe, należy użyć serwera z za mało pamięci głównej do dopasowanie często dostęp do partycji lub wszystkich partycji w pamięci, aby zmniejszyć koszt We/Wy.

  • Jeśli dane kwerendy nie zmieszczą się w pamięci, kompresować tabel i indeksów.Zmniejsza to koszty We/Wy.

  • Użycie serwera z szybkich procesorów i jak wiele procesorów cores, można zapewnić, aby skorzystać z możliwości przetwarzania równoległego kwerendy.

  • Upewnij się, serwer nie ma wystarczających przepustowości kontrolera We/Wy.

  • Tworzenie indeks klastrowany w każdej dużej tabela partycjonowana, aby wykorzystać optymalizacje skanowania B-drzewo.

  • Należy postępować zgodnie z najlepszymi sposobami w oficjalnym dokumencie „Ładowanie danych zbiorcze do tabela partycjonowana, gdy zbiorczego ładowania danych do tabel podzielonym na partycje.

Przykład

Poniższy przykład tworzy testowej bazy danych, zawierający pojedynczą tabela z siedmiu partycji.Użyj narzędzi opisanych wcześniej podczas wykonywania kwerendy w tym przykładzie, aby wyświetlić informacje o partycjonowanie planów zarówno w czasie kompilacji, jak i w czasie wykonywania.

Uwaga

W tym przykładzie wstawia 1 miliona wierszy do tabela.Uruchamianie w tym przykładzie może potrwać kilka minut w zależności od sprzętu.Przed wykonaniem w tym przykładzie, sprawdź, czy masz więcej niż 1,5 GB dostępnego miejsca na dysku.

USE master;
GO
IF DB_ID (N'db_sales_test') IS NOT NULL
    DROP DATABASE db_sales_test;
GO
CREATE DATABASE db_sales_test;
GO
USE db_sales_test;
GO
CREATE PARTITION FUNCTION [pf_range_fact](int) AS RANGE RIGHT FOR VALUES 
(20080801, 20080901, 20081001, 20081101, 20081201, 20090101);
GO
CREATE PARTITION SCHEME [ps_fact_sales] AS PARTITION [pf_range_fact] 
ALL TO ([PRIMARY]);
GO
CREATE TABLE fact_sales(date_id int, product_id int, store_id int, 
    quantity int, unit_price numeric(7,2), other_data char(1000))
ON ps_fact_sales(date_id);
GO
CREATE CLUSTERED INDEX ci ON fact_sales(date_id);
GO
PRINT 'Loading...';
SET NOCOUNT ON;
DECLARE @i int;
SET @i = 1;
WHILE (@i<1000000)
BEGIN
    INSERT INTO fact_sales VALUES(20080800 + (@i%30) + 1, @i%10000, @i%200, RAND() * 25, (@i%3) + 1, '');
    SET @i += 1;
END;
GO
DECLARE @i int;
SET @i = 1;
WHILE (@i<10000)
BEGIN
    INSERT INTO fact_sales VALUES(20080900 + (@i%30) + 1, @i%10000, @i%200, RAND() * 25, (@i%3) + 1, '');
    SET @i += 1;
END;
PRINT 'Done.';
GO
-- Two-partition query.
SET STATISTICS XML ON;
GO
SELECT date_id, SUM(quantity*unit_price) AS total_price
FROM fact_sales
WHERE date_id BETWEEN 20080802 AND 20080902
GROUP BY date_id ;
GO
SET STATISTICS XML OFF;
GO
-- Single-partition query.
SET STATISTICS XML ON;
GO
SELECT date_id, SUM(quantity*unit_price) AS total_price
FROM fact_sales
WHERE date_id BETWEEN 20080801 AND 20080831
GROUP BY date_id;
GO
SET STATISTICS XML OFF;
GO