Джойн вьюшек

mucks

В запросе делается джойн нескольких вьюшек. Запрос выполняется 6-7 секунд. Если в том же запросе вьюшки предварительно слить во временные таблицы и потом сделать джойн этих таблиц, то менее секунды.Никаких циклов в запросе нет, только один селект и все.Как это объясняется ?
8 ответов

mucks

Это объясняется разными планами выполнения.


mucks

Как это объясняется ?
А что - вьюшки должны "моментально" откликаться, как и таблицы?они ведь не хранять данные, а "насчитывают" их!!!т.е. время работы вью тоже надо учитывать.


mucks

to paparomeизвлечение из вьюшек в таблицы происходит в ТОМ ЖЕ запросе, то есть вьюшки выполняются в обоих случаяхto gloryможно чуть подробнее, без отсылки к болу :)


mucks

О чем именно поподробнее ?При использовании представлений план составляется с учетом текстов запросов из каждого представления.При использовании временных таблиц в конечном запросе используются уже готовые наборы данных.


mucks

Это нормально :(К сожалению, оптимизатор MS SQL выбирает квазиоптимальный план выполнения запроса. И чем сложнее запрос, тем сильнее можно попасть на это, более того, запрос, нормально работающий у разработчика может вдруг начать выделываться на продакшене и наоборот. Мораль - пишите простые запросы :( С ними, по крайней мере, все четко и понятно.Временные таблицы (как средство хранения Id) или табличные переменные зачастую спасают ситуацию.


mucks

> При использовании временных таблиц в конечном запросе используются уже > готовые наборы данных.Но эти наборы же все равно сначала надо получить выполнением вьюшки. Я посмотрел план выполнения каждого селекта в первом и втором случае. Дерево первого запроса получается в виде подстановки всех составляющих из второго запроса.Еще раз проблема:1-й запрос:select * from view1 left join view2 on ...конец2-й запросselect * into #table1 from view1select * into #table2 from view2select * from #table1 left join table2 on ...конецВ чем принципиальная разница не пойму что-то. Но время выполнения первого раз в 10 больше, чем второго.


mucks

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


mucks

Но эти наборы же все равно сначала надо получить выполнением вьюшки. Я посмотрел план выполнения каждого селекта в первом и втором случае. Дерево первого запроса получается в виде подстановки всех составляющих из второго запроса.Значит вы что-то проглядели. Тем более что "время выполнения первого раз в 10 больше, чем второго."