Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Принудительный spool / 25 сообщений из 27, страница 1 из 2
29.08.2018, 11:12
    #39694772
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
Нужно поместить сложный запрос во view. Это ограничение сторонней системы.
1. Можно сделать табличную функцию, где заполняется нескольких табличных переменных и происходит join. Такая функция сначала построит весь набор данных и view будет фильтроваться по нему. Так работает быстро на небольшом числе записей, но их количество скоро вырастет.

2. Можно сделать inline функцию или cte из нескольких частей внутри view. Но select из такого view уже выполняется долго даже на малом числе записей.

Как хинтами или ещё как-то указать оптимизатору, что нужно нечто вроде spool на каждую часть cte для эмуляции варианта №1 внутри варианта №2? Чтобы эту конструкцию поместить во view и фильтры во where могли бы ограничивать хотя бы частично число исходных данных для join, а не готовый результат.
...
Рейтинг: 0 / 0
29.08.2018, 12:13
    #39694857
Rankatan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknownКак хинтами или ещё как-то указать оптимизатору, что нужно нечто вроде spool на каждую часть cte для эмуляции варианта №1 внутри варианта №2? Чтобы эту конструкцию поместить во view и фильтры во where могли бы ограничивать хотя бы частично число исходных данных для join, а не готовый результат.
Рекурсией из одного шага
...
Рейтинг: 0 / 0
29.08.2018, 13:16
    #39694908
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
Правильно написанный вариант 1 будет работать всегда и быстро.

Это следствие тривиального умозаключения.
...
Рейтинг: 0 / 0
29.08.2018, 16:09
    #39695074
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
RankatanРекурсией из одного шагаНе могу догадаться как :-(

aleks222Правильно написанный вариант 1 будет работать всегда и быстро.Если функция собирает миллион записей, хотя нужно всего 10 по условию, то как она будет быстрой? Или оптимизатор умеет пробрасывать внешнее условие в неинлайновую функцию?
...
Рейтинг: 0 / 0
29.08.2018, 16:14
    #39695082
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknown,

умеет
...
Рейтинг: 0 / 0
29.08.2018, 16:31
    #39695092
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
TaPaKумеетГде почитать? У меня не выходит написать неинлайновую функцию, чтобы внешний параметр учитывался внутри неё.

Код: sql
1.
2.
select * from dbo.F() -- возвращает 442 записи
select * from dbo.F() where id=1 -- возвращает 1 запись


Все показатели в профилере различаются не более, чем на 0.03% включая reads.
...
Рейтинг: 0 / 0
29.08.2018, 16:34
    #39695094
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknown,
извинямс, то я неправильно прочтиал :) Так конечно не умеет
...
Рейтинг: 0 / 0
29.08.2018, 16:38
    #39695097
Rankatan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 with x as (
	select 'text' a
 ),
 z as
 (
	 select x.*,null tmp from x
	 union all
	 select * from z where tmp is not null
 )
 select * from z
...
Рейтинг: 0 / 0
29.08.2018, 16:51
    #39695107
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
Rankatan
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 with x as (
	select 'text' a
 ),
 z as
 (
	 select x.*,null tmp from x
	 union all
	 select * from z where tmp is not null
 )
 select * from z

Спасибо, помогло. По крайней мере запрос не обёрнутый во view ускорился существенно. Хотя в документации spool в CTE упоминается только относительно remote server.
...
Рейтинг: 0 / 0
29.08.2018, 17:20
    #39695131
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknown,

Если вам непременно нужна фильтрация до соединения, то это делается гораздо проще и без хинтов и манипуляций с рекурсией:
Код: sql
1.
2.
3.
4.
select
 ...
from
 (select top (9223372036854775807) ... from MyTable where ...) t join ...
...
Рейтинг: 0 / 0
29.08.2018, 17:30
    #39695143
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknownПо крайней мере запрос не обёрнутый во view ускорился существенно. Хотя в документации spool в CTE упоминается только относительно remote server.Обёрнутый во view запрос с CTE тормозит. Все Eager Spool вернулись в Lazy Spool. Однако, обёрнутый в инлайн-функцию сохранил Eager Spool в плане, фильтрует по внешнему условию в самом начале и работает быстро.

Не может ли такое (недокументированное?)поведение измениться в очередном SP/CU? У меня 12.0.5557.0 (X64)
...
Рейтинг: 0 / 0
29.08.2018, 17:33
    #39695146
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
invm
Если вам непременно нужна фильтрация до соединения, то это делается гораздо проще и без хинтов и манипуляций с рекурсиейМне нужна не только фильтрация, но и Eager Spool. Запрос достаточной развестый, работал быстро только в процедуре или в неинлайновой функции с табличными переменными.

top (9223372036854775807) попробую на всякий случай.
...
Рейтинг: 0 / 0
29.08.2018, 17:49
    #39695155
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknownМне нужна не только фильтрация, но и Eager SpoolНе нужен вам Eager Spool. С точки зрения дальнейшего потребления данных другими итераторами, он ничем не отличается от Lazy.
План нужно анализировать и искать причину тормозов.
...
Рейтинг: 0 / 0
29.08.2018, 17:54
    #39695161
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
invmНе нужен вам Eager Spool. С точки зрения дальнейшего потребления данных другими итераторами, он ничем не отличается от Lazy.
План нужно анализировать и искать причину тормозов.В запросе несколько вложенных CTE, join на самих себя, по некоторым делается сложение текста через xml и т.д. Естественно, он тормозит без "материализации".
...
Рейтинг: 0 / 0
29.08.2018, 18:24
    #39695176
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknown,

CTE не материализуется в том смысле, который вы вкладываете в это понятие. Сколько раз оно упомянуто в запросе, столько и будет выполнено. Короче, это просто синтаксический сахар.
...
Рейтинг: 0 / 0
30.08.2018, 11:46
    #39695425
Rankatan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
invmtunknown,

CTE не материализуется в том смысле, который вы вкладываете в это понятие. Сколько раз оно упомянуто в запросе, столько и будет выполнено. Короче, это просто синтаксический сахар.
Там можно добиться, чтобы формировался spool через рекурсию и потом в остальных запросах обращение происходило именно к этому сформированному spool, но сейчас сходу не смог сделать пример, надо экспериментировать.
...
Рейтинг: 0 / 0
30.08.2018, 14:00
    #39695543
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknowninvmНе нужен вам Eager Spool. С точки зрения дальнейшего потребления данных другими итераторами, он ничем не отличается от Lazy.
План нужно анализировать и искать причину тормозов.В запросе несколько вложенных CTE, join на самих себя, по некоторым делается сложение текста через xml и т.д. Естественно, он тормозит без "материализации".

И так же естественно, что select into - это не для тредстартера.
Тредстартер мечтает о ms sql c телепатической системой управления...
...
Рейтинг: 0 / 0
30.08.2018, 14:45
    #39695596
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
RankatanТам можно добиться, чтобы формировался spool через рекурсию и потом в остальных запросах обращение происходило именно к этому сформированному spool, но сейчас сходу не смог сделать пример, надо экспериментировать.
это было бы достойно отдельной статьи!
...
Рейтинг: 0 / 0
30.08.2018, 15:14
    #39695631
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
RankatanТам можно добиться, чтобы формировался spool через рекурсию и потом в остальных запросах обращение происходило именно к этому сформированному spool, но сейчас сходу не смог сделать пример, надо экспериментировать.
ни разу такого не видел, очень интересно посмотреть
...
Рейтинг: 0 / 0
31.08.2018, 09:10
    #39695958
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
RankatanТам можно добиться, чтобы формировался spool через рекурсию и потом в остальных запросах обращение происходило именно к этому сформированному spool, но сейчас сходу не смог сделать пример, надо экспериментировать.При внешней фильтрации по такой "материализуемой" функции Eager Spool выживает не всегда. Иногда сваливается в Lazy, видимо, в зависимости от совпадения фильтра с индексами. При этом сваливании производительность хотя и падает, но остаётся приличной.

Кстати, откуда такой метод? Личные эксперименты, документация или чей-то опыт?
...
Рейтинг: 0 / 0
31.08.2018, 12:06
    #39696125
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknown,

Вы добьетесь только того, что при очередном обновлении сервера Ваши конструкции улетят в корзину. Пересмотрите архитектуру данных.
...
Рейтинг: 0 / 0
31.08.2018, 13:11
    #39696210
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknownПри внешней фильтрации по такой "материализуемой" функции Eager Spool выживает не всегда. Иногда сваливается в Lazy, видимо, в зависимости от совпадения фильтра с индексами.Продолжаете упорствовать?

Читайте до полного понимания - Eager Spool и Lazy Spool .
...
Рейтинг: 0 / 0
31.08.2018, 16:22
    #39696331
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
Владислав Колосовtunknown,

Вы добьетесь только того, что при очередном обновлении сервера Ваши конструкции улетят в корзину. Пересмотрите архитектуру данных.Возможность ломающего обновления меня огорчает. Но другого решения мне не видно.

invmПродолжаете упорствовать?

Читайте до полного пониманияПрочитал. Lazy спулит только необходимые записи, Eager весь указанный набор данных, в моём случае- каждую вложенную CTE. Такой костыль в моём случае превращает синтаксический сахар в физическую "материализацию". План+профилер подтверждают многократное ускорение.

Работа с основной таблицей не предусматривает update/delete, только нечастые insert. Предполагаю, что упомянутые по ссылкам проблемы в моём случае имеют низкий приоритет.
...
Рейтинг: 0 / 0
31.08.2018, 17:14
    #39696376
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
tunknownПрочитал. Lazy спулит только необходимые записи, Eager весь указанный набор данныхПлохо прочитали. Спулят они одно и то же, только eager все сразу, а lazy постепенно.
tunknownПлан+профилер подтверждают многократное ускорение.Если план отличается только типом конкретного спула , ни о каком многократном ускорении речи быть не может.
...
Рейтинг: 0 / 0
31.08.2018, 17:53
    #39696405
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный spool
invmПлохо прочитали. Спулят они одно и то же, только eager все сразу , а lazy постепенно.Это и нужно.

invmЕсли план отличается только типом конкретного спула , ни о каком многократном ускорении речи быть не может.План развесистый, он отличается кроме Lazy<->Eager некоторыми перестановками операторов.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Принудительный spool / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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