Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как получить параллельной план / 7 сообщений из 7, страница 1 из 1
04.10.2016, 15:04
    #39320320
acava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить параллельной план
Здравствуйте. Прошу прощения если тема уже обсуждалось, сходу не нашёл. Подскажите в какую сторону смотреть или может какие ссылки по теме есть.
Два запрос, использующие конструкцию cross apply с одной и той же inline функцией с рекурсивным запросом, имеют разные планы выполнения. Хочется получить для второго запроса параллельный план такой же, как и для первого.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
--Запрос1
SELECT t2.*
FROM dbo.PointParams t1
CROSS APPLY dbo.GetPPRelations1 (t1.ID_PP) t2

--Запрос2
SELECT t2.*
FROM dbo.tt1 t1
CROSS APPLY dbo.GetPPRelations1 (t1.ID_PP) 



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
CREATE FUNCTION dbo.GetPPRelations1 (@ID_PP int)
RETURNS TABLE 
AS
RETURN
WITH C0 AS
(
SELECT @ID_PP AS ID_PP_Upper
	  ,CAST(0 AS int) AS NUM
	  ,CAST('19000101' AS datetime) AS DT1
	  ,CAST('22000101' AS datetime) AS DT2
UNION ALL
SELECT t1.ID_PP
	  ,CAST(1 AS int) AS NUM
	  ,(CASE WHEN t1.DT1 > t2.DT1 THEN t1.DT1 ELSE t2.DT1 END) AS DT1
	  ,(CASE WHEN t1.DT2 < t2.DT2 THEN t1.DT2 ELSE t2.DT2 END) AS DT2
	FROM dbo.SchemaRealation t1
	JOIN C0 t2 ON t1.ID_Ref = t2.ID_PP_Upper AND t1.DT1 < t2.DT2 AND t1.DT2 > t2.DT1
)
,CTE AS
(
SELECT ID_PP_Upper, DT1, MAX(DT2) AS DT2
	FROM C0 WHERE NUM = 1
GROUP BY ID_PP_Upper, DT1
)
SELECT ID_PP_Upper, MIN(DT1) AS DT1, DT2
	FROM CTE
GROUP BY ID_PP_Upper, DT2
GO

--Содержит 13 617 записей
CREATE TABLE dbo.tt1 (ID_PP int  NOT NULL PRIMARY KEY)

--Содержит 406 774 записей
CREATE TABLE dbo.PointParams (ID_PP int NOT NULL IDENTITY PRIMARY KEY)

--Содержит 386 058 записей
CREATE TABLE dbo.SchemaRealation
(
 ID_PP int NOT NULL
,ID_Ref int NOT NULL
,DT1 datetime NOT NULL
,DT2 datetime NULL
PRIMARY KEY CLUSTERED (ID_PP, ID_Ref, DT1)
)
GO

CREATE UNIQUE NONCLUSTERED INDEX IX_SchemaRealation ON dbo.SchemaRealation (ID_Ref, ID_PP, DT1) INCLUDE (DT2)
GO






PS: если имеет значения
select @@version

Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)
Jun 17 2016 19:14:09
Copyright (c) Microsoft Corporation
Developer Edition: (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
...
Рейтинг: 0 / 0
04.10.2016, 15:42
    #39320362
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить параллельной план
Ну, всегда есть трейс-флаг QUERYTRACEON 8649 .
...
Рейтинг: 0 / 0
04.10.2016, 16:45
    #39320423
o-o
o-o
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить параллельной план
он же не дурной параллелить 13 617 записей.
дешевле не параллелить.
флагом заставить можно, но еще проще записей подлить, чтобы стало тоже 406 774
...
Рейтинг: 0 / 0
04.10.2016, 16:58
    #39320438
acava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить параллельной план
Спасибо за помощь.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
20.11.2020, 04:12
    #40020661
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить параллельной план
Гавриленко Сергей Алексеевич
Ну, всегда есть трейс-флаг QUERYTRACEON 8649 .
Что-то ни трейс-флаг ни хинт мне не помогли.

Пробовал разные варианты типа
Код: plaintext
1.
2.
option (use hint('ENABLE_PARALLEL_PLAN_PREFERENCE'))
option (querytraceon 8649)
option (recompile, querytraceon 8649)
Применение не выдает никаких ошибок но и не влияет на параллельность.

Если вкратце необходимо выполнить очень прожорливую к CPU обработку строк. Тест кейс
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if object_id('tempdb..#tmp') is not null drop table #tmp

;with r1000(i) as (select 0 union all select r1000.i + 1 from r1000 where r1000.i < 1000-1)
select t1.i + t2.i * 1000 id
  into #tmp
 from r1000 t1, r1000 t2
option (maxrecursion 0)

select *
from #tmp t
where replicate('w',100)+'str'+replicate('w',100)+cast(id as varchar) like '%str%666666%'



Выполняется в параллели если сбросить порог в ноль
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
EXEC sp_configure 'cost threshold for parallelism', 0;
RECONFIGURE;
GO
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;



Либо если применить изысканный трюк
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT       
    x.*        
FROM dbo.make_parallel() AS mp        
CROSS APPLY        
(        
  select *
  from #tmp t
  where replicate('w',100)+'str'+replicate('w',100)+cast(id as varchar) like '%str%666666%'
) AS x



Есть ли какие-то еще способы повлиять на стоимость или игнорировать порог?
Конечная цель - добиться параллельного выполнения без создания объектов и без вызова sp_configure.

PS. Microsoft SQL Server 2017
...
Рейтинг: 0 / 0
20.11.2020, 09:42
    #40020688
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить параллельной план
Кобанчег,

У запроса уровень оптимизации TRIVIAL. Поэтому и не праллелится.
Вот так попробуйте
Код: sql
1.
2.
3.
select *
from #tmp t
where replicate('w',100)+'str'+replicate('w',100)+cast(id as varchar) like (select '%str%666666%')
...
Рейтинг: 0 / 0
22.11.2020, 16:12
    #40021096
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить параллельной план
invm,

Спасибо. А ларчик просто открывался.

Интересно что план считается trivial даже для секционированной (и не временной таблицы) и не параллелится.
А ведь подобные запросы могут быть заметно ускорены параллельностью с минимальным overhead на её организацию.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как получить параллельной план / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]