2010-05-21 5 views
3

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

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

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

Связанные вопросы здесь, но не отвечает на мой конкретный случай с участием временных таблиц: Should I commit or rollback a read transaction?

EDIT (Разъяснение Вопроса):

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

ответ

3

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

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

+0

На самом деле я не спрашиваю об эффективности его обертывания в транзакции. Соединение последовательно передается нескольким функциям API баз данных, и они используют общее имя/соглашение в таблице temp, поэтому необходима транзакция, гарантирующая удаление таблицы temp. Меня интересует эффект совершения этой транзакции или ее возврата. – Triynko

+0

@Triynko - В каком отношении вы интересуетесь эффектом? Доступность таблицы temp из другого кода? – Thomas

+0

@Thomas - Я прошу о выполнении команды против отмены транзакции. Это действительно неинтуитивно, потому что откат, похоже, подразумевает, что работа будет выполнена, но если такая простая незафиксированная транзакция будет откатна ... работа может быть просто удалена из памяти, и никакая работа «применить» изменения не будет записана , например, обновлять статистику базы данных. Трудно сказать, и поэтому я действительно ищу кого-то, кто знает, что может произойти в SQL Server под капотом во время откатов и совершает в этом конкретном случае. – Triynko

0

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

CREATE TABLE #mytable ( RowId ИНТ rowName полукокса (30))

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

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

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

+1

Я сказал, что уже использую таблицы #temp. Но соединение повторно используется, поскольку оно передается нескольким функциям API баз данных в быстрой последовательности, поэтому важно, чтобы была транзакция, которая явно удаляет таблицу по завершении, либо выполнив удаление и фиксацию, либо отбросив транзакцию. Меня особенно интересуют последствия либо совершения транзакции или ее откат (при условии, что таблица окончательно удалена до фиксации и, возможно, удалена до откат). – Triynko

 Смежные вопросы

  • Нет связанных вопросов^_^