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

Откуда:
Сообщений: 44
Подскажите, пожалуйста, есть ли значимые предпочтения между сбором результата промежуточного select во временную таблицу или в табличную переменную? Если безотносительно зоны видимости и времени существования, то есть без учёта этих факторов ...
select (что-то откуда-то как-то) into #temptable

или
select (что-то откуда-то как-то) as temptable

Как лучше?
Или очень ли плохо собирать именно во временную таблицу, хотя использоваться она будет локально в одном скрипте, а по его завершению удаляться? Мне "организационно" удобнее использовать временные таблицы, но если так "невынужденно" дёргать диск это совсем-совсем плохо, то переделаю
1 июн 19, 23:48    [21899654]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
msLex
Member

Откуда:
Сообщений: 7736
rtv
Подскажите, пожалуйста, есть ли значимые предпочтения между сбором результата промежуточного select во временную таблицу или в табличную переменную? Если безотносительно зоны видимости и времени существования, то есть без учёта этих факторов ...
select (что-то откуда-то как-то) into #temptable


или
select (что-то откуда-то как-то) as temptable


Как лучше?
Или очень ли плохо собирать именно во временную таблицу, хотя использоваться она будет локально в одном скрипте, а по его завершению удаляться? Мне "организационно" удобнее использовать временные таблицы, но если так "невынужденно" дёргать диск это совсем-совсем плохо, то переделаю


А что, из вами приведенного, является "табличной переменной"? Уж не "as" ли?
2 июн 19, 00:31    [21899663]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
rtv
Member

Откуда:
Сообщений: 44
msLex
А что, из вами приведенного, является "табличной переменной"? Уж не "as" ли?


Ага, оно - "as" ли :)) Но Вы же догадались о чём я? Не знаю, что это и как называется. Плохо, понимаю. Показалось похоже на переменную, и что "оно" in memory.

Но это не снимает вопрос, а усиливает, подчёркивая уровень вопрошающего.
Чем бы оно ни было, это "as" ли :)) - мне к нему повторно обращаться не нужно. (Хотя если кто-нибудь скажет, что это, будет полезно)
Так вот когда к временной выборке повторно обращаться не нужно, она сразу после отработки скрипта будет удаляться, будет ли при этом сильно плохо использовать select into? Или это ни для чего особо не критично?
2 июн 19, 02:43    [21899687]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
rtv
Member

Откуда:
Сообщений: 44
просто именованная выборка?
2 июн 19, 03:23    [21899690]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
rtv,

В первом случае вы вставляете данные (набор данных) во временную таблицу, во втором вы ничего кроме переименования одной колонки не делаете
2 июн 19, 04:01    [21899693]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
rtv
Member

Откуда:
Сообщений: 44
PizzaPizza
rtv,

В первом случае вы вставляете данные (набор данных) во временную таблицу, во втором вы ничего кроме переименования одной колонки не делаете

Да, только не колонки, а выборки.
И вот вопрос в том, очень ли плохо использовать временные таблицы, в случае когда можно обойтись и без них, а временные таблицы просто удобнее при организации внешнего программного кода.
И конкретно - у меня сейчас в запросе используется условно такая конструкция
select * from 
(select что-то откуда-то как-то) as tt 
where ещё условия

По ряду внешних соображений хочется это переписать с использованием временной таблицы. Переписать можно, но вдруг такое решение будет очевидно хуже по каким-то неизвестным мне соображениям, может заведомо медленнее, может зря диск дёргать плохо, еще чего-то...
2 июн 19, 04:41    [21899695]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
rtv
Да, только не колонки, а выборки.

as = это алиасинг
В блоке SELECT это алиасинг для колонки
В блоке FROM для выборки


rtv
очень ли плохо использовать временные таблицы

Любые вещи нужно использовать по назначению, т.е. если они нужны. Зачем вам временная таблица?

Если вам просто хочется это переписать без цели использования функционала, который предоставляют временные таблицы, то это конечно будет очевидно хуже просто потому, что вы увеличиваете нагрузку на сервер "просто так" и, по видимому, не очень понимаете что делаете и зачем.

Достаточно посмотреть на план выполнения запросов и статистику и сразу увидите разницу, которую надо (обычно причинами помимо "хочется переписать") обосновать.
2 июн 19, 05:22    [21899699]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
rtv,

Опять же,

select into выполняет эту конкретную операцию
select выдает вам результирующую выборку

это две совершенно разные задачи и вы спрашиваете какая из них "лучше"...
Если вам надо таки получить выборку, то вам придется делать select в дополнение к select into.
2 июн 19, 05:29    [21899701]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
rtv,

табличная переменная - это не то, о чем Вы думаете. Выбор того или иного решения зависит от его эффективности. Эффективность проверяется практическим опытом. В вашем случае оба решения равноправны и зависят от конкретной ситуации.
2 июн 19, 12:40    [21899752]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
fkthat
Member

Откуда:
Сообщений: 1951
rtv,

Это называется "derived table" и никакого отношения к временным таблицам или переменным не имеет. Временная таблица или табличная переменная - это вполне реаьная материальная таблица в tempdb, а derived table это просто синтаксическая конструкция в запросе - никаких физических таблиц, как и при использовании CTE, при её использовании не создается. Если есть возможность использовать derived table или CTE, то надо использовать их, т.к. это даст больше простора оптимизатору поработать над твоим запросом.
2 июн 19, 13:08    [21899762]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
rtv
Member

Откуда:
Сообщений: 44
fkthat
rtv,
Это называется "derived table" и никакого отношения к временным таблицам или переменным не имеет. Временная таблица или табличная переменная - это вполне реаьная материальная таблица в tempdb, а derived table это просто синтаксическая конструкция в запросе - никаких физических таблиц, как и при использовании CTE, при её использовании не создается.
fkthat, Спасибо!

PizzaPizza
Любые вещи нужно использовать по назначению, т.е. если они нужны. Зачем вам временная таблица?
fkthat
rtv,
Если есть возможность использовать derived table или CTE, то надо использовать их, т.к. это даст больше простора оптимизатору поработать над твоим запросом.

В большом select используется некая промежуточная выборка, организованная как "derived table".
Сейчас нужно, по условиям использовать в этом месте разные выборки. Вроде как напрашивается введение переменной. С точки зрения моего внешнего кода (Delphi) именно так было бы правильно. И вот встал вопрос, насколько это будет хуже относительно уже кода sql. Ну по итогам обсуждения "моё подозрение" подтвердилось - нагрузку на сервер "просто так" - это плохо, у оптимизатора будет меньше свободы, тоже плохо.
А поскольку я пишу в Delphi мне не надо будет усложнять запрос ещё и этим условием на разные выборки. Я без проблем динамически сформирую разные запросы по каждому условию для этих промежуточных выборок. Временные таблицы всего лишь повысили бы мне читабельность моего дельфийского кода, но это не аргумент.
Всем спасибо!
2 июн 19, 14:04    [21899788]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
fkthat
а derived table это просто синтаксическая конструкция в запросе - никаких физических таблиц, как и при использовании CTE
Ну как сказать... Сервер использует tempdb и в этих случаях при необходимости.
Может, таблицей это и назовёшь...
2 июн 19, 17:26    [21899859]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30829
rtv
В большом select используется некая промежуточная выборка, организованная как "derived table".
Сейчас нужно, по условиям использовать в этом месте разные выборки. Вроде как напрашивается введение переменной. С точки зрения моего внешнего кода (Delphi) именно так было бы правильно. И вот встал вопрос, насколько это будет хуже относительно уже кода sql. Ну по итогам обсуждения "моё подозрение" подтвердилось - нагрузку на сервер "просто так" - это плохо, у оптимизатора будет меньше свободы, тоже плохо.
Бывает по разному, нужно принимать решение, смотря на конкретную ситуацию.

Чаще всего не имеет смысла "материализовать" подзапрос, с помощью предварительной выборки во временную таблицу.

Но иногда, если подзапрос выбирает данные по сложным условиям, и в результате выбирает не особенно много данных, а потом из этой выборки джелается много других выборок, так будет эффективнее.
2 июн 19, 17:43    [21899868]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
rtv
Временные таблицы всего лишь повысили бы мне читабельность моего дельфийского кода, но это не аргумент.


Читаемость кода это СТЕ. Прочитайте про них. Они никак не влияют на фактическое выполнение запроса, а только на его отображение - на текст.
2 июн 19, 17:48    [21899871]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
rtv
Member

Откуда:
Сообщений: 44
alexeyvg
Чаще всего не имеет смысла "материализовать" подзапрос, с помощью предварительной выборки во временную таблицу.
Но иногда, если подзапрос выбирает данные по сложным условиям, и в результате выбирает не особенно много данных, а потом из этой выборки делается много других выборок, так будет эффективнее.

Да, вот последнее очень похоже на мой случай...

PizzaPizza
rtv
Временные таблицы всего лишь повысили бы мне читабельность моего дельфийского кода, но это не аргумент.
Читаемость кода это СТЕ. Прочитайте про них. Они никак не влияют на фактическое выполнение запроса, а только на его отображение - на текст.

Спасибо. Читаю. Полезно.
Но я то про другое вообще, про дельфийский код, который к этому разделу отношения не имеет.
2 июн 19, 19:30    [21899896]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
rtv,
в вашем случае читаемость повысила бы "инкапсуляция" кода SQL в процедуру и ее вызов из программы на Delphi.
А в самой процедуре уже хоть временные таблицы, хоть табличные переменные, хоть табличные функции.
3 июн 19, 10:19    [21900166]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
rtv
Member

Откуда:
Сообщений: 44
Руслан Дамирович
rtv,
в вашем случае читаемость повысила бы "инкапсуляция" кода SQL в процедуру и ее вызов из программы на Delphi.
А в самой процедуре уже хоть временные таблицы, хоть табличные переменные, хоть табличные функции.
Процедуру на сервере? Нет, это не "наш случай", к сожалению. У нас код правится постоянно (сверху поступают новые регламенты в режиме потока сознания), такая жизнь ;). А оперативность внесения изменений в приложение выше, чем на сервер.
3 июн 19, 14:05    [21900497]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица или табличная переменная, что предпочтительнее  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30829
rtv
А оперативность внесения изменений в приложение выше, чем на сервер.
Странно.
Обычно главный (да что там, часто едиенственный) мотив переноса запросов в хранимые процедуры - скорость и простота внесения изменений.
3 июн 19, 18:35    [21900808]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить