Задать вопрос
Casper-SC
@Casper-SC
Программист (.NET)

Правда ли, что в MS SQL Server создавать временные таблицы лучше вне транзакции?

То есть сначала создали, а потом уже используем её в транзакции? Я вычитал, что если создавать временную таблицу в транзакции, то блокируются какие-то системные таблицы на время выполнения этой моей транзакции. Это правда? Где-то есть в источниках Microsoft инфа об этом? Я вычитал тут
  • Вопрос задан
  • 2720 просмотров
Подписаться 3 Оценить 7 комментариев
Пригласить эксперта
Ответы на вопрос 4
@dmitryKovalskiy
программист средней руки
Временные таблицы создают запись в базе tempdb. их надо проверять на существование, не забывать дропать и вообще они порой требовательны к коду, особенно для кода, который может сгенерировать исключение.

Для одиночных инструкций(одного запроса SELECT,INSERT,UPDATE,DELETE) существует альтернатива - Обобщенные табличные выражения(CTE) - link

Разумеется если временная таблица вам нужна больше чем на 1 запрос - такой подход неприменим.
Ответ написан
max-kuznetsov
@max-kuznetsov
Главный IT-архитектор
Есть тонкость - распределённые транзакции. В MS SQL Server происходит эскалация транзакции даже в том случае, если в рамках транзакции идёт обращение к двум разным БД на одном сервере. Поскольку временные таблицы создаются в отдельной БД, при некоторых условиях могут возникать проблемы с MSDTC. Эскалация была значительной проблемой в 2005-й версии, но мы не так давно сталкивались с ней на 2008-й.
Ответ написан
@shagguboy
Нет это не правда, соответствено на сайте майкрософта не найдешь
Ответ написан
Комментировать
@artemt
Full-stack developer
Ни разу не специалист по SQL (потому как fool stack developer), так что воспринимайте моё мнение критично. Но вопрос заинтересовал.

Не вижу причины отказываться от транзакций в C# коде, если это легаси проект. Наверняка там есть ещё чем заняться. Сам старался не использовать, хотя бывало. Зачастую, оборачивал группу хранимых процедур хранимкой с транзакцией, которую и вызывал из C#.

Зачем тащить создание временной таблицы в транзакцию? Из-за боязни, что она не очистится? Можно сделать пару хранимок создания и удаления глобальных временных таблиц с проверкой существования, которые вызывать до и после транзакции. Всегда придерживался точки зрения — чем меньше кода в транзакции, тем лучше.

Временные таблицы стараюсь не использовать. Хотя если объём временных данных большой и нужны индексы, почему нет. Бывало, что злоупотребление ими серьёзно просаживало производительность, бывало и наоборот. Недавно надо было предавать данные между базами одного инстанса. Сначала использовал временные таблицы. Потом, по совету архитектора, переписал и стал пересылать через xml параметр (там это хорошо вписывалось в общую канву).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы