Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
osipen Member Откуда: Сообщений: 18 |
Уважаемые коллеги, добрый день! Есть Job на сервере выполняется раз в минуту (длительность доли секунд). Поступил "наез" от человека считающим себя "экспертом", а именно: "использование select * from ... into #temp, а также отсутствие инструкции удаления созданной таблицы создает повышенную нагрузку на сервер и, в том числе, приводят к блокировкам tempDB " Я хочу со своей стороны заметить, что инструкции drop #temp были, но не смотря на это само это утверждение бред. Ведь данный тип таблицы удаляется автоматически после завершения сессии и не какой нагрузки с блокировками естественно не создается. Или я чего-то не знаю? Прошу проконсультировать по данному вопросу желательно подкрепить ссылками на MSDN. Заранее спасибо! |
24 июн 15, 14:37 [17811503] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
В версии 6.5 инструкция "select * into #temp from ..." приводила к блокировке tempdb. Уже в 7.0 это было пофиксено. Ну и узнайте у "эксперта" подробности - что же он считает повышенной нагрузкой при неудалении временных таблиц? |
24 июн 15, 14:57 [17811649] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
osipen, отсутствие инструкции удаления как раз говорит о правильном понимании механизмов работы сервера. Если задается явное удаление в процедуре, то на этом попусту теряется время выполнения процедуры. |
24 июн 15, 15:01 [17811676] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
Ну теоретически если подобный оператор "долгоиграющий", то на время его выполнения может быть заблокирована системная таблца (а ля sysobjects) со всеми возможными вытекающими последствиями |
||
24 июн 15, 15:06 [17811709] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
имелось ввиду select * into #temp from ...... |
||||
24 июн 15, 15:08 [17811717] Ответить | Цитировать Сообщить модератору |
osipen Member Откуда: Сообщений: 18 |
invm, "что же он считает повышенной нагрузкой" - узнать не получится, остается только догадываться. Как может возникнуть блокировка если из другой сессии к этой таблице не получится достучатся? Плюс использование временных таблиц я считаю удобным и направленным на повышение производительности. |
24 июн 15, 15:12 [17811741] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
во-первых, нам не сообщили, что селектят. может, таблицу в гигабайт читают каждую минуту и кладут в темпдб ![]() хотя это вряд ли. скорее всего, супер-эксперту *делать нечего*. и с каких это пор надо оправдываться в том, чего не делал? вам скажут "вы 3 буквы на заборе написали", побежите собирать справки, что это не вы? нафиг-нафиг. пусть ОН, обвинитель, предоставит доказатальства супер-загрузки сервера. именно этим джобом. тогда и обсудим |
24 июн 15, 15:15 [17811759] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37198 |
|
||
24 июн 15, 15:19 [17811784] Ответить | Цитировать Сообщить модератору |
Okmor Member Откуда: Сообщений: 132 |
Гавриленко Сергей Алексеевич,
Я праведник :-) |
||
24 июн 15, 15:23 [17811794] Ответить | Цитировать Сообщить модератору |
Кот Матроскин Member Откуда: Москва Сообщений: 8933 |
"время выполнения процедуры" - это странный термин. Где это может сыграть роль (разница между ситуацией " в процедуре присутствует последняя команда - drop table #temp" и "в процедуре отсутствует такая команда")? batch, вызывающий процедуру, будет работать быстрее? Сервер будет тратить меньше ресурсов? C чего бы? Это не говоря про то что drop table #temp - ээ, не самая ресурсоемкая и длительная операция. |
||
24 июн 15, 15:25 [17811808] Ответить | Цитировать Сообщить модератору |
Кот Матроскин Member Откуда: Москва Сообщений: 8933 |
Я тут недавно как раз навставлял этих конструкций - как средство синхронизации описания #temp. Если таблица создается во многих местах (и должна создаваться одинаковой) - я ведь не могу написать команду create table 1 раз, а потом вызывать ее из разных мест, поэтому приходится делать так. |
||
24 июн 15, 15:34 [17811848] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
1. select drop # select ... 2. mouse click exec wait wait Издержки на удаление, как ни странно, могут быть заметны на глаз пользователю. Это практические наблюдения с секундомером. |
||
24 июн 15, 15:42 [17811886] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Я тоже так считал, однако, издержки доходили до нескольких секунд. Я предпочитаю гарантированный результат :) |
||
24 июн 15, 15:45 [17811897] Ответить | Цитировать Сообщить модератору |
Кот Матроскин Member Откуда: Москва Сообщений: 8933 |
Ну это сравнение теплого с мягким - процедуры и батча. Тту может различаться время на прекомпиляцию, плаын и т.п. Имхо показательным сравнением будет та ситуация, которую предложил я - процедура с drop vs процедура без drop. Провел, кстати, сейчас эксперимент - временная таблица в 22 миллиона записей создавалась Select ... into 148 секунд, дропнулась за <3 миллисекунд. |
||||
24 июн 15, 15:53 [17811936] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
Более того, схема временной таблицы, созданной в процедуре, кешируется вне зависимости от того была она явно удалена или нет. Подробности - Temporary Table Caching Explained |
||
24 июн 15, 16:49 [17812216] Ответить | Цитировать Сообщить модератору |
osipen Member Откуда: Сообщений: 18 |
invm, только в процедуре или в batche тоже? |
24 июн 15, 17:01 [17812273] Ответить | Цитировать Сообщить модератору |
osipen Member Откуда: Сообщений: 18 |
osipen, а содержимое таблицы кэшируется? Почитал, спасибо. |
24 июн 15, 17:13 [17812331] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
|
||
24 июн 15, 17:15 [17812341] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
|
||
24 июн 15, 17:16 [17812345] Ответить | Цитировать Сообщить модератору |
osipen Member Откуда: Сообщений: 18 |
invm, Всем спасибо за помощь! |
24 июн 15, 17:23 [17812383] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Кот Матроскин,
в этом и странность, что у меня не было таких проблем до тех пор, пока с ними не столкнулся. Т.е. практика показала, что прецедент непредсказуемого поведения tempdb (и том числе открытия курсоров по нескольку секунд) при отсутствии видимой нагрузки на базу может быть. В результате я принял решение, что автоматическая уборка мусора - наилучший выход при написании процедуры. Тайминг отслеживался профайлером и было четко видно - на какую операцию при выполнении процедуры сколько требуется времени. Я, конечно, не настаиваю, но стремление делать "для красоты", в данном случае, может обернуться против разработчика. Просто предупреждаю. |
||
24 июн 15, 17:48 [17812478] Ответить | Цитировать Сообщить модератору |
Mind Member Откуда: Лучший город на Земле Сообщений: 2322 |
|
||||
25 июн 15, 03:24 [17813506] Ответить | Цитировать Сообщить модератору |
Мистер Хенки Member Откуда: канализация Сообщений: 6615 |
Для простой модели восстановления и модели с неполным протоколированием select into позволяет использовать операции вставки с минимальным протоколированием, что повышает скорость операции и снижает нагрузку . Для insert into select , чтобы включить минимальное протоколирование, надо выполнить ряд условий. |
||
25 июн 15, 10:42 [17814227] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |