Paralel sorgu örneği
Aşağıdaki sorgu belirli üç ay, 1 Nisan 2000, başlangıç yerleştirilmiş olan siparişlerin sayısını sayar ve içinde siparişinin en az bir satır öğesi müşteri tarafından kabul edilen tarihten alındı.Bu sorgu, her sipariş önceliğe göre gruplandırılmış ve öncelik artan şekilde sıralanmış, tür siparişlerinin sayısını listeler.
Bu örnek, teorik tablo ve sütun adlarını kullanır.
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
Aşağıdaki dizin üzerinde tanımlanmış varsayalım lineitem and Siparişler tables:
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)
Sorgu için daha önce gösterilen oluşturulan bir olası paralel planı aşağıdadır:
|--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)
Resimde parallelism 4 ve iki tablo birleştirmek ilgili eşit ölçüde yürütülmüş bir sorgu iyileştiricisi planını gösterir.
Paralel planı üç Parallelism işleçleri içerir.Her iki Dizin Ara işleço_datkey_ptr dizin ve Dizin tarama işleçl_order_dates_idx dizini paralel gerçekleştirdi.Bu, birkaç özel akışları oluşturur.En yakın Parallelism işleçlerin yukarıdaki belirlenebilir Dizin tarama and Dizin Ara işletmenleri, sırasıyla.Her tipteki bir alışveriş yeniden bölümlendirmeden.Diğer bir deyişle, bunlar yalnızca veri akışları arasında reshuffling ve girdi kendi sahip oldukları gibi çıkış akışlarında aynı sayıda üretme.Bu akış sayısı için parallelism derecesini eşittir.
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.Bu yolla, L_ORDERKEY aynı değerleri aynı çıkış akışında sona.Aynı zamanda, giriş, gereksinimi karşılamak için sipariş L_ORDERKEY sütunun çıktı akışlarını korumak Birleştirme birleştirmek işleç.
The Parallelism işleç above the Index Seek işleç is repartitioning its input streams using the value of O_ORDERKEY.Üzerindeki O_ORDERKEY sütun değerleri, giriş sıralanır ve bu birleşim sütunu olduğundan Birleştirme birleştirmek işleçSıralama arasında işleçParallelism and Birleştirme birleştirmek giriş sıralanır, için işleçleri sağlayınBirleştirme birleştirmek işleciyle birleştirme sütunları.The Sort işleç, like the Merge birleştirmek işleç, is performed in parallel.
En üstte Parallelism işlecini, tek bir akımına birkaç akışları sonuçlar toplar.Kısmi toplamalardan gerçekleştirdiği Akış topluluğu Aşağıda, işleçParallelism işleç sonra içine, her farklı değeri O_ORDERPRIORITY tek bir toplamak değer kümülatifAkış topluluğu Yukarıdaki işleçParallelism işleç.Iki döviz kesimi parallelism 4'e, eşit ölçüde bu planı olduğu için bu sekiz iş parçacıkları kullanır.