Udostępnij przez


Przykład kwerendy równoległe

Następująca kwerenda zlicza liczbę zamówień umieszczonych w określonym kwartale, począwszy od dnia 1 kwietnia 2000 r. oraz w którym co najmniej jeden element wiersza zamówienia odebrania przez odbiorcę późniejszą niż data zadeklarowanej.Ta kwerenda Wyświetla licznik takiego zamówienia pogrupowane według priorytetu każdego zamówienia i posortowane rosnąco w kolejności priorytetów.

W tym przykładzie użyto tabela teoretycznych i kolumna nazwy.

SELECT o_orderpriority, COUNT(*) AS Order_Count
FROM orders
WHERE o_orderdate >= '2000/04/01'
   AND o_orderdate < DATEADD (mm, 3, '2000/04/01')
   AND EXISTS
         (
          SELECT *
            FROM    lineitem
            WHERE l_orderkey = o_orderkey
               AND l_commitdate < l_receiptdate
         )
   GROUP BY o_orderpriority
   ORDER BY o_orderpriority

Przyjmuje następujące indeksy są definiowane na lineitem i zamówienia tabel:

CREATE INDEX l_order_dates_idx 
   ON lineitem
      (l_orderkey, l_receiptdate, l_commitdate, l_shipdate)

CREATE UNIQUE INDEX o_datkeyopr_idx
   ON ORDERS
      (o_orderdate, o_orderkey, o_custkey, o_orderpriority)

Oto jeden możliwe równolegle wygenerowany plan dla kwerendy wcześniej przedstawione:

|--Stream Aggregate(GROUP BY:([ORDERS].[o_orderpriority])
                  DEFINE:([Expr1005]=COUNT(*)))
    |--Parallelism(Gather Streams, ORDER BY:
                  ([ORDERS].[o_orderpriority] ASC))
         |--Stream Aggregate(GROUP BY:
                  ([ORDERS].[o_orderpriority])
                  DEFINE:([Expr1005]=Count(*)))
              |--Sort(ORDER BY:([ORDERS].[o_orderpriority] ASC))
                   |--Merge Join(Left Semi Join, MERGE:
                  ([ORDERS].[o_orderkey])=
                        ([LINEITEM].[l_orderkey]),
                  RESIDUAL:([ORDERS].[o_orderkey]=
                        [LINEITEM].[l_orderkey]))
                        |--Sort(ORDER BY:([ORDERS].[o_orderkey] ASC))
                        |    |--Parallelism(Repartition Streams,
                           PARTITION COLUMNS:
                           ([ORDERS].[o_orderkey]))
                        |         |--Index Seek(OBJECT:
                     ([tpcd1G].[dbo].[ORDERS].[O_DATKEYOPR_IDX]),
                     SEEK:([ORDERS].[o_orderdate] >=
                           Apr  1 2000 12:00AM AND
                           [ORDERS].[o_orderdate] <
                           Jul  1 2000 12:00AM) ORDERED)
                        |--Parallelism(Repartition Streams,
                     PARTITION COLUMNS:
                     ([LINEITEM].[l_orderkey]),
                     ORDER BY:([LINEITEM].[l_orderkey] ASC))
                             |--Filter(WHERE:
                           ([LINEITEM].[l_commitdate]<
                           [LINEITEM].[l_receiptdate]))
                                  |--Index Scan(OBJECT:
         ([tpcd1G].[dbo].[LINEITEM].[L_ORDER_DATES_IDX]), ORDERED)

Plan zapytania z DOP 4, obejmuje sprzężenie dwóch tabel

Na ilustracji pokazano wykonane z stopień równoległości prostych równa 4 i obejmujących łączyć dwóch tabela plan optymalizator kwerendy.

Równoległe plan zawiera trzy operatorów równoległości prostych.Obie Indeksu wyszukiwania operator o_datkey_ptr indeksu i Skanowanie indeksu operator l_order_dates_idx indeksu są wykonywane równolegle.Daje to kilka wyłącznych strumieni.Można to ustalić z dokładnością powyżej operatorów równoległości prostych Skanowanie indeksu i Indeksu wyszukiwania operatorów, odpowiednio.Obie są ponownego dzielenia partycje typu programu exchange.Oznacza to, że są właśnie reshuffling danych między strumieni i produkujących taką samą liczbę strumieni na ich produkcji mają na swoich nakładów.Ta liczba strumieni jest równa stopień równoległości prostych.

The Parallelism operator above the l_order_dates_idxIndex Scan operator is repartitioning its input streams using the value of L_ORDERKEY as a key.W ten sposób te same wartości L_ORDERKEY trafiają w tym samym strumień wyjściowy.W tym samym czas, strumienie wyjściowe utrzymać w celu spełnienia wymogu wprowadzania kolumna L_ORDERKEY Merge Join operator.

Równoległości prostych operator powyżej Indeksu wyszukiwania operator jest ponownego dzielenia partycje jego strumienie danych wejściowych wartość O_ORDERKEY.Ponieważ jego wprowadzania nie jest sortowana w wartości kolumny O_ORDERKEY i jest to kolumna sprzężenia sprzężenia łączyć w Scalania łączyć operatora, sortowania operatora pomiędzy równoległości prostych i Scalania łączyć operatorów upewnij się, że dane wejściowe są posortowane w Scalania łączyć operator kolumny łączyć.Sortowania operatora, jak Merge Join operator, jest wykonywane równolegle.

Najwyższej paralelizmu operator zbiera wyniki ze strumieni kilka do jednego strumienia.Częściowe skupiska wykonywane przez Agregacji strumienia operator poniżej równoległości prostych operator następnie są kumulowane w pojedynczą wartość sumy dla każdej innej wartości O_ORDERPRIORITY w Agregacji strumienia operator powyżej równoległości prostych operatora.Ponieważ ten plan ma dwa segmenty wymiany stopień równoległości prostych równa 4, używa osiem wątków.

Zobacz także

Koncepcje