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

Откуда:
Сообщений: 18
Уважаемые коллеги, добрый день!

Есть Job на сервере выполняется раз в минуту (длительность доли секунд). Поступил "наез" от человека считающим себя "экспертом", а именно:

"использование select * from ... into #temp, а также отсутствие инструкции удаления созданной таблицы создает повышенную нагрузку на сервер и, в том числе, приводят к блокировкам tempDB "

Я хочу со своей стороны заметить, что инструкции drop #temp были, но не смотря на это само это утверждение бред. Ведь данный тип таблицы удаляется автоматически после завершения сессии и не какой нагрузки с блокировками естественно не создается. Или я чего-то не знаю? Прошу проконсультировать по данному вопросу желательно подкрепить ссылками на MSDN. Заранее спасибо!
24 июн 15, 14:37    [17811503]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
В версии 6.5 инструкция "select * into #temp from ..." приводила к блокировке tempdb. Уже в 7.0 это было пофиксено.
Ну и узнайте у "эксперта" подробности - что же он считает повышенной нагрузкой при неудалении временных таблиц?
24 июн 15, 14:57    [17811649]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Владислав Колосов
Member

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

отсутствие инструкции удаления как раз говорит о правильном понимании механизмов работы сервера. Если задается явное удаление в процедуре, то на этом попусту теряется время выполнения процедуры.
24 июн 15, 15:01    [17811676]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
_djХомяГ
Guest
osipen
"использование select * from ... into #temp,

Ну теоретически если подобный оператор "долгоиграющий", то на время его выполнения может быть заблокирована системная таблца (а ля sysobjects) со всеми возможными вытекающими последствиями
24 июн 15, 15:06    [17811709]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
_djХомяГ
Guest
_djХомяГ
osipen
"использование select * from ... into #temp,

Ну теоретически если подобный оператор "долгоиграющий", то на время его выполнения может быть заблокирована системная таблца (а ля sysobjects) со всеми возможными вытекающими последствиями

имелось ввиду select * into #temp from ......
24 июн 15, 15:08    [17811717]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
osipen
Member

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

"что же он считает повышенной нагрузкой" - узнать не получится, остается только догадываться. Как может возникнуть блокировка если из другой сессии к этой таблице не получится достучатся? Плюс использование временных таблиц я считаю удобным и направленным на повышение производительности.
24 июн 15, 15:12    [17811741]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Okmor
Member

Откуда:
Сообщений: 132
конструкция
select * into #temp from ...
есть большой грех, ибо ,блокирует tempDB до определения труктуры #temp, а иногда до выполнения запроса.
Правильно писать
Create table #temp (id int, name varchar(150))
INSERT INTO #temp (id , name)
select id , name from ....

Я тоже грешник, ибо так удобно.
24 июн 15, 15:13    [17811753]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
o-o
Guest
во-первых, нам не сообщили, что селектят.
может, таблицу в гигабайт читают каждую минуту и кладут в темпдб
хотя это вряд ли.

скорее всего, супер-эксперту *делать нечего*.
и с каких это пор надо оправдываться в том, чего не делал?
вам скажут "вы 3 буквы на заборе написали", побежите собирать справки, что это не вы?
нафиг-нафиг.
пусть ОН, обвинитель, предоставит доказатальства супер-загрузки сервера. именно этим джобом.
тогда и обсудим
24 июн 15, 15:15    [17811759]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37198
Okmor
есть большой грех, ибо ,блокирует tempDB до определения труктуры #temp, а иногда до выполнения запроса.
В версиях 2000 и младше.
24 июн 15, 15:19    [17811784]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Okmor
Member

Откуда:
Сообщений: 132
Гавриленко Сергей Алексеевич,
автор
В версиях 2000 и младше.

Я праведник :-)
24 июн 15, 15:23    [17811794]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Владислав Колосов
то на этом попусту теряется время выполнения процедуры.


"время выполнения процедуры" - это странный термин. Где это может сыграть роль (разница между ситуацией " в процедуре присутствует последняя команда - drop table #temp" и "в процедуре отсутствует такая команда")? batch, вызывающий процедуру, будет работать быстрее? Сервер будет тратить меньше ресурсов? C чего бы?

Это не говоря про то что drop table #temp - ээ, не самая ресурсоемкая и длительная операция.
24 июн 15, 15:25    [17811808]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Okmor
конструкция
select * into #temp from ...
есть большой грех.


Я тут недавно как раз навставлял этих конструкций - как средство синхронизации описания #temp. Если таблица создается во многих местах (и должна создаваться одинаковой) - я ведь не могу написать команду create table 1 раз, а потом вызывать ее из разных мест, поэтому приходится делать так.
24 июн 15, 15:34    [17811848]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Где это может сыграть роль


1.
select
drop #
select
...

2. mouse click
exec
wait wait

Издержки на удаление, как ни странно, могут быть заметны на глаз пользователю. Это практические наблюдения с секундомером.
24 июн 15, 15:42    [17811886]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Кот Матроскин
не самая ресурсоемкая и длительная операция

Я тоже так считал, однако, издержки доходили до нескольких секунд. Я предпочитаю гарантированный результат :)
24 июн 15, 15:45    [17811897]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Владислав Колосов
Где это может сыграть роль


1.
select
drop #
select
...

2. mouse click
exec
wait wait

Издержки на удаление, как ни странно, могут быть заметны на глаз пользователю. Это практические наблюдения с секундомером.

Ну это сравнение теплого с мягким - процедуры и батча. Тту может различаться время на прекомпиляцию, плаын и т.п. Имхо показательным сравнением будет та ситуация, которую предложил я - процедура с drop vs процедура без drop.

Провел, кстати, сейчас эксперимент - временная таблица в 22 миллиона записей создавалась Select ... into 148 секунд, дропнулась за <3 миллисекунд.
24 июн 15, 15:53    [17811936]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Okmor
Member

Откуда:
Сообщений: 132
Кот Матроскин,
Из практики:
Удаление таблицы - быстро
Очищение таблицы - оооочень долго.

Относительно создания таблиц ,без описания структуры. Можно делать так:
select 
id , name 
into #temp 
from .... where 1=2

INSERT INTO #temp (id , name)
select id , name from ....
24 июн 15, 16:47    [17812207]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
osipen
"что же он считает повышенной нагрузкой" - узнать не получится, остается только догадываться.
Тогда забейте на мнение такого "эксперта".
Более того, схема временной таблицы, созданной в процедуре, кешируется вне зависимости от того была она явно удалена или нет. Подробности - Temporary Table Caching Explained
24 июн 15, 16:49    [17812216]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
osipen
Member

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

только в процедуре или в batche тоже?
24 июн 15, 17:01    [17812273]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
osipen
Member

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

а содержимое таблицы кэшируется? Почитал, спасибо.
24 июн 15, 17:13    [17812331]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
osipen
только в процедуре или в batche тоже?
Только в процедуре.
24 июн 15, 17:15    [17812341]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
osipen
а содержимое таблицы кэшируется?
Нет конечно. Смысл?
24 июн 15, 17:16    [17812345]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
osipen
Member

Откуда:
Сообщений: 18
invm,
Всем спасибо за помощь!
24 июн 15, 17:23    [17812383]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Кот Матроскин,

автор
дропнулась за <3 миллисекунд


в этом и странность, что у меня не было таких проблем до тех пор, пока с ними не столкнулся. Т.е. практика показала, что прецедент непредсказуемого поведения tempdb (и том числе открытия курсоров по нескольку секунд) при отсутствии видимой нагрузки на базу может быть. В результате я принял решение, что автоматическая уборка мусора - наилучший выход при написании процедуры. Тайминг отслеживался профайлером и было четко видно - на какую операцию при выполнении процедуры сколько требуется времени.
Я, конечно, не настаиваю, но стремление делать "для красоты", в данном случае, может обернуться против разработчика. Просто предупреждаю.
24 июн 15, 17:48    [17812478]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
invm
osipen
а содержимое таблицы кэшируется?
Нет конечно. Смысл?
Все таблицы кэшируются. Пока живые конечно.
25 июн 15, 03:24    [17813506]     Ответить | Цитировать Сообщить модератору
 Re: Теоритический вопрос относительно временныех таблиц и tempdb  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Okmor
конструкция
select * into #temp from ...
есть большой грех, ибо ,блокирует tempDB до определения труктуры #temp, а иногда до выполнения запроса.
Правильно писать
Create table #temp (id int, name varchar(150))
INSERT INTO #temp (id , name)
select id , name from ....

Я тоже грешник, ибо так удобно.

Для простой модели восстановления и модели с неполным протоколированием select into позволяет использовать операции вставки с минимальным протоколированием, что повышает скорость операции и снижает нагрузку . Для insert into select , чтобы включить минимальное протоколирование, надо выполнить ряд условий.
25 июн 15, 10:42    [17814227]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить