Как правильно избавлятся от Table Spool в планах запроса при использовании grouping sets?

NIIIK
Дата: 14.02.2013 13:29:59
Всем доброе время суток!
Интересует "общий вопрос" как правильно избавлятся от Table spool в планах запроса, который по сути "временная таблица в tempdb".
Я собственно и сам эти времянки могу делать.
Появляются они в основном когда я использую группы в grouping set (чем больше наборов, тем больше table spool-ов).
Пытался "шамать с индексами". Создавал индексы и пополям которые в группе/джойнах/выборке полей, даже "тупо со всеми".
Пока НЕ помогло. Я вот только надеюсь что эта "временная таблица" создаётся не для тех данных которые я выбираю "в CTE раньше", а для тех что я агрегирую.

Картинку в этом куске плана запроса я вижу "как прикрепил".

По факту "немалое замедление" даёт выборка полей с использованием
case по grouping_id
потом агрегатная фунция count() внутри котороЙ другой case c дополнительной проверкой.

С этими "полями/фукциями" работает
1246

Без этих полей
773

(это "лучшие результаты")

Не устраивают оба.

Как избавлятся от table spool-ов и правильно писать "дополнительные условния" при группировках?
Нужны общие концепции, какие индексы должны быть "и т. п."

Заранее спасибо.
Kanadec
Дата: 14.02.2013 13:52:04
NIIIK,

А вы в запросе случаем не исползуете, option(force order).
я замечал, такое бывает при использовании этой опции.

Возможно, вам и не удасться избавиться от спулов, так как сикуль считает что это наиболее оптимальный план с использованием спулинга.
NIIIK
Дата: 14.02.2013 15:55:42
Kanadec,

Нет, не использую.
Изначально там "здоровая CTE с кривым union и некоторыми другими моментами из-за криовсти базы".
На основе эти данных надо считать статистику "количество", "количество по такому-то атрибуту" и т. д.
Раньше это вставлялось во временную таблицу (много данных) и потом к ней делалось несколько запросов и возвращалось несколько датасетов, а я как раз старался свести к одному запросу.

Тема начиналась тут Оптимизация CTE, только сейчас вернулся. Но похоже "правы были те кто говорил о том что СКЛ Сервер их сам создаёт".

Запрос конечно работает быстрее, да ещё в профайлере показывает меньше чтений/записей/CPU, но всё равно "не айс".
А мне ещё этот "один большой денормализованный датасет" надо раскидать по "тем маленьким, которые были раньше".

Я на интуитивном уровне не понимаю зачем если есть один grouping sets оператор и "один поток данных" SQL Server сохраняет данные во временной таблицу.
NIIIK
Дата: 15.02.2013 13:33:56
Кто-нить может объяснить основную причину появления table spool и "как с ними бороться" (В целом) ?
Glory
Дата: 15.02.2013 13:37:30
NIIIK
Кто-нить может объяснить основную причину появления table spoo

Спроектированная вами схема данных
Написанный вами запрос

NIIIK
и "как с ними бороться" (В целом) ?

Правильно проектировать схему
Переписывать запорос
NIIIK
Дата: 15.02.2013 13:41:47
Glory
NIIIK
Кто-нить может объяснить основную причину появления table spoo

Спроектированная вами схема данных
Написанный вами запрос

NIIIK
и "как с ними бороться" (В целом) ?

Правильно проектировать схему
Переписывать запорос


Сам люблю так делать :)
NIIIK
Дата: 15.02.2013 13:42:18
Glory,

Для вас поставлю вопрос так "какие ошибки приводят к таким результатам" ?
Glory
Дата: 15.02.2013 13:45:09
NIIIK
Для вас поставлю вопрос так "какие ошибки приводят к таким результатам" ?

Вы серьезно считаете, что в синтаксисе TSQL есть какие то "особые" команды, которые приводят к низкой производительности запроса ?
NIIIK
Дата: 15.02.2013 14:33:44
Glory
NIIIK
Для вас поставлю вопрос так "какие ошибки приводят к таким результатам" ?

Вы серьезно считаете, что в синтаксисе TSQL есть какие то "особые" команды, которые приводят к низкой производительности запроса ?

Я считаю что существуют "стандартные причины для каких=то проблем".
Начиная от where t.filedName like '%string'
Заканчивая кривыми подзапросами (в списке полей, в where), использованием функций в where/join, которые как минимум "забивают" индексы или ещё хуже являются подзапросами, написанием distinct/group by выражений в пользовательских запросах, потому что какая-то сущность не выделена.

В моём случае у меня "здоровенный запрос поиска" и надо выводить статистику по различным категориям.
Надо сказать "производительность его я уже повысил", далее могу сказать что с этими table spool работает не на много долше теперь.
Но хочется "понимания" когда и почему SQL Server решает что "нужна временная таблица".
hpv
Дата: 15.02.2013 16:08:38
NIIIK,

Table Spool

MSDN
The Table Spool operator scans the input and places a copy of each row in a hidden spool table that is stored in the tempdb database and existing only for the lifetime of the query. If the operator is rewound (for example, by a Nested Loops operator) but no rebinding is needed, the spooled data is used instead of rescanning the input.


Не то?

Eager Spool
И в догонку Avoiding Eager Spool ,хоть это и не ваш случай

Как вариант попробовать преписать с помощью ROLLUP/CUBE