Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор типа параллелизма  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ Структура и тестовые данные
USE tempdb
GO
CREATE TABLE dbo.Dictionary (
	 ID	TinyInt	IDENTITY
	 CONSTRAINT [PK_Dictionary] PRIMARY KEY
	,Data	Int	NOT NULL
)
CREATE TABLE dbo.BigTabe (
	 Dictionary	TinyInt
	,[Date]		Date
	,CONSTRAINT [PK_BigTabe] PRIMARY KEY (
		 Dictionary
		,[Date]
	)
	,Data	Int	NOT NULL
)
GO
INSERT	dbo.Dictionary
SELECT	Top(100) V.number
FROM	master.dbo.spt_values V
WHERE	V.[type] = 'P'

INSERT	dbo.BigTabe
SELECT	 X.ID
	,DateAdd(Year	,Y.number
	,DateAdd(Month	,M.number
	,DateAdd(Day	,D.number,0)))
	,Y.number
	+M.number
	+D.number
FROM	     dbo.Dictionary		X
	JOIN master.dbo.spt_values	Y ON Y.[type] = 'P' AND Y.number < 100
	JOIN master.dbo.spt_values	M ON M.[type] = 'P' AND M.number < 12
	JOIN master.dbo.spt_values	D ON D.[type] = 'P' AND D.number < 28
SELECT	 B.Dictionary -- D.ID
	,Sum(B.Data + D.Data)
FROM	     dbo.BigTabe	B
	JOIN dbo.Dictionary	D ON D.ID = B.Dictionary
GROUP BY B.Dictionary -- D.ID
План:
  |--Parallelism(Gather Streams)
       |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([Expr1004]=SUM([partialagg1005])))
            |--Sort(ORDER BY:([B].[Dictionary] ASC))
                 |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([B].[Dictionary]))
                      |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([partialagg1005]=SUM([B].[Data]+[D].[Data])))
                           |--Nested Loops(Inner Join, OUTER REFERENCES:([D].[ID], [Expr1006]) WITH ORDERED PREFETCH)
                                |--Parallelism(Distribute Streams, RoundRobin Partitioning)
                                |    |--Clustered Index Scan(OBJECT:([D]), ORDERED FORWARD)
                                |--Clustered Index Seek(OBJECT:([B]), SEEK:([B].[Dictionary]=[D].[ID]) ORDERED FORWARD)
Почему сервер выбрал пере-параллелизацию, двойная агрегация?
Почему вместо RoundRobin параллелизации сразу не выбрать параллелизация по B.Dictionary (D.ID)?
15 июн 12, 09:56    [12717469]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Up
15 июн 12, 18:06    [12722400]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
Хм...,
Guest
Mnior
Up



  |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([Expr1004]=SUM([partialagg1005])))
       |--Parallelism(Gather Streams, ORDER BY:([B].[Dictionary] ASC))
            |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([partialagg1005]=SUM([tempdb].[dbo].[BigTabe].[Data] as [B].[Data]+[tempdb].[dbo].[Dictionary].[Data] as [D].[Data])))
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([D].[ID], [Expr1006]) WITH ORDERED PREFETCH)
                      |--Parallelism(Distribute Streams, RoundRobin Partitioning)
                      |    |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[Dictionary].[PK_Dictionary] AS [D]), ORDERED FORWARD)
                      |--Clustered Index Seek(OBJECT:([tempdb].[dbo].[BigTabe].[PK_BigTabe] AS [B]), SEEK:([B].[Dictionary]=[tempdb].[dbo].[Dictionary].[ID] as [D].[ID]) ORDERED FORWARD)
15 июн 12, 20:37    [12722939]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Хм...,, вас удивило почему я удалил из этой простыни названия таблиц и оставил только алиасы?
Или то, что не смогли за пару миллисекунд найти разницу и оценить её важность?

Давайте всётаки вернёмся к теме вопроса.
15 июн 12, 22:29    [12723338]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior,

Хм...лично меня удивил ваш вопрос. Я рестартовал сервер и начал с новой темпдб. Запустил ваш скрипт и запрос.
автор
set showplan_text on
go
SELECT B.Dictionary -- D.ID
,Sum(B.Data + D.Data)
FROM dbo.BigTabe B
JOIN dbo.Dictionary D ON D.ID = B.Dictionary
GROUP BY B.Dictionary -- D.ID
go
set showplan_text off

План:
StmtText
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([Expr1004]=SUM([partialagg1005])))
       |--Parallelism(Gather Streams, ORDER BY:([B].[Dictionary] ASC))
            |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([partialagg1005]=SUM([tempdb].[dbo].[BigTabe].[Data] as [B].[Data]+[tempdb].[dbo].[Dictionary].[Data] as [D].[Data])))
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([D].[ID], [Expr1006]) WITH ORDERED PREFETCH)
                      |--Parallelism(Distribute Streams, RoundRobin Partitioning)
                      |    |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[Dictionary].[PK_Dictionary] AS [D]), ORDERED FORWARD)
                      |--Clustered Index Seek(OBJECT:([tempdb].[dbo].[BigTabe].[PK_BigTabe] AS [B]), SEEK:([B].[Dictionary]=[tempdb].[dbo].[Dictionary].[ID] as [D].[ID]) ORDERED FORWARD)

(строк обработано: 7)

Где Sort, где что? И перепроверял, и статистику обновлял фиг знает зачем...
А может опять какой хинт забыли? =)
И что вы имели ввиду подпере-параллелизация
Гугл пока не знает такого термина, стоит ли спрашивать про него, может стоит переформулировать с намеков на нормальный язык, чтобы не получилось как в другой теме?
Ей богу не обижайтесь, но иный ваши сообщения я вынужден по два раза читать чтоб понять о чем так, видимо, я тупой. А может, просто стоит быть проще.
16 июн 12, 00:23    [12723710]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SomewhereSomehow
Где Sort?
Дошло. Да странно что на моём запросе был. Да возможно скорее не тот.
(скрипт на одном компе делал, пост оформлял на другом)
В понедельник поправлю.
SomewhereSomehow
И что вы имели ввиду под пере-параллелизация
Parallelism(Repartition ...

Вопрос остаётся: почему сразу не делается Parallelism(PARTITION COLUMNS:([B].[Dictionary] [D].[ID]))?
16 июн 12, 04:41    [12723942]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Снёс, скопировал со своего поста и всё равно Sort и повторная параллелизация есть.
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)

  |--Parallelism(Gather Streams)
       |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([Expr1004]=SUM([partialagg1005])))
            |--Sort(ORDER BY:([B].[Dictionary] ASC))
                 |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([B].[Dictionary]))
                      |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([partialagg1005]=SUM([B].[Data]+[D].[Data])))
                           |--Nested Loops(Inner Join, OUTER REFERENCES:([D].[ID], [Expr1006]) WITH ORDERED PREFETCH)
                                |--Parallelism(Distribute Streams, RoundRobin Partitioning)
                                |    |--Clustered Index Scan(OBJECT:([D]), ORDERED FORWARD)
                                |--Clustered Index Seek(OBJECT:([B]), SEEK:([B].[Dictionary]=[D].[ID]) ORDERED FORWARD)
 
       |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([Expr1004]=SUM([partialagg1005])))

                 |--Parallelism(Gather Streams, ORDER BY:([B].[Dictionary] ASC))
                      |--Stream Aggregate(GROUP BY:([B].[Dictionary]) DEFINE:([partialagg1005]=SUM([B].[Data]+[D].[Data])))
                           |--Nested Loops(Inner Join, OUTER REFERENCES:([D].[ID], [Expr1006]) WITH ORDERED PREFETCH)
                                |--Parallelism(Distribute Streams, RoundRobin Partitioning)
                                |    |--Clustered Index Scan(OBJECT:([D]), ORDERED FORWARD)
                                |--Clustered Index Seek(OBJECT:([B]), SEEK:([B].[Dictionary]=[D].[ID]) ORDERED FORWARD)
Возможно у вас новая версия скуля, которая умеет упорядоченно слиять потоки. Это круче, чем я предположил.
Если так (укажите вашу версию), то вопрос конечно снимается.
18 июн 12, 10:07    [12728964]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2806.0 (X64)

К сообщению приложен файл. Размер - 13Kb
18 июн 12, 14:59    [12731943]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа параллелизма  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Crimean
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2806.0 (X64)
Спасиб.
Вопрос закрыт.
18 июн 12, 17:58    [12733870]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить