Должен ли я зафиксировать или откатить транзакцию, которая создает временную таблицу, читает, а затем удаляет ее? - PullRequest
3 голосов
/ 21 мая 2010

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

Я делаю это в транзакции, чтобы гарантировать, что временная таблица будет удалена, когда я закончу. У меня вопрос ... что происходит, когда я совершаю такую ​​транзакцию против того, чтобы она откатилась назад?

С точки зрения производительности ... должен ли механизм БД выполнять больше работы для отката транзакции по сравнению с ее совершением? Есть ли какая-то разница, так как единственные изменения сделаны для временной таблицы?

Смежный вопрос здесь, но он не отвечает на мой конкретный случай с временными таблицами: Стоит ли фиксировать или откатывать транзакцию чтения?

РЕДАКТИРОВАТЬ (разъяснение вопроса):

Не ищите совета до момента фиксации / отката. Сделка абсолютно необходима. Предположим, никаких ошибок не происходит. Предположим, что я создал временную таблицу, предположим, что я знаю, что произошла настоящая «рабочая» запись в базу данных tempdb, предположим, что я выполняю операции «только чтение» (select) в транзакции, и предполагаю, что я выполняю оператор delete для временной таблицы. После всего этого ... что дешевле, коммит или откат, и почему? Какую ДРУГУЮ работу может выполнить механизм db в ТОТ ТОЧКЕ для фиксации или отката на основе этого конкретного сценария, включающего временные таблицы и другие операции, доступные только для чтения?

Ответы [ 2 ]

3 голосов
/ 21 мая 2010

Если мы говорим о локальной временной таблице (т. Е. К имени добавляется один #), то в момент закрытия соединения SQL Server уничтожит таблицу. Таким образом, предполагая, что ваш уровень данных хорошо спроектирован так, чтобы поддерживать соединения как можно более короткими, я не стал бы беспокоиться об обертывании создания временных таблиц в транзакции.

Я полагаю, что может быть небольшая разница в производительности при переносе таблицы в транзакцию, но я бы поспорил, что она настолько мала, что не имеет значения по сравнению с затратами на поддержание транзакции открытой дольше из-за времени на создание и заполнение временная таблица.

0 голосов
/ 21 мая 2010

Более простой способ обеспечить удаление временной таблицы - создать ее с помощью знака #.

CREATE TABLE #mytable ( rowID int, rowName char (30))

# сообщает SQL Server, что эта таблица является локальной временной таблицей. Эта таблица видна только для этого сеанса SQL Server. Когда сессия закрыта, таблица будет автоматически удалена. Вы можете обращаться с этой таблицей так же, как с любой другой таблицей, за некоторыми исключениями. Единственная реальная проблема заключается в том, что вы не можете иметь ограничения внешнего ключа для временной таблицы. Остальные описаны в Книгах Онлайн.

Временные таблицы создаются в базе данных tempdb.

Если вы сделаете это, вам не придется заключать его в транзакцию.

...