SQL Server 2008: есть ли способ избежать записи в журнал транзакций? - PullRequest
3 голосов
/ 14 апреля 2011

Хотя мой запрос верный, я периодически получаю эту ошибку. Есть ли способ избежать записи в журнал транзакций?

Когда я проверял указанный столбец, текст каждого столбца гласил: «Ничего» * ​​1003 *

Ошибка:

Журнал транзакций для базы данных 'tempdb' заполнен. Чтобы выяснить, почему пространство в журнале не может быть использовано повторно, см. столбец log_reuse_wait_desc в sys.databases».

Спасибо, очень признателен, несколько срочно.

Ответы [ 4 ]

4 голосов
/ 14 апреля 2011

Вам необходимо использовать журнал транзакций. Это способ возврата SQL-кода в случае ошибки или частичного завершения запроса.

Основной причиной является не журнал транзакций, а запрос. Вы либо:

1 - запрос плохо оптимизирован (это может быть связано с большим количеством сортировок или хеш-соединений)

2 - чрезмерно используются таблицы #temp в вашем запросе

3 - проблема с местом на диске

Можете ли вы опубликовать запрос, который вы выполняете?

EDIT:

Чтобы выяснить, что может быть причиной проблемы ...

Если у вас несколько #temp таблиц, все они занимают место в базе данных tempdb. Любая сортировка, которую должен выполнить механизм запросов
(ORDER BY без индекса, сложные JOIN условия, которые не используют индексы, множество GROUP BY или агрегатные функции и т. Д.)
записывает в журнал транзакций tempdb, потому что вся эта сортировка выполняется там.

Сам запрос может нормально работать , но, вероятно, его необходимо оптимизировать, чтобы избежать этих проблем.

1 голос
/ 14 апреля 2011

Нет, КАЖДАЯ транзакция регистрируется.Однако это не проблема с ведением журнала.

В нем говорится, что база данных tempdb заполнена, а не файл журнала.Вы обрабатываете много записей?Использовать временную таблицу?

Вам необходимо управлять ростом в том смысле, что вам может потребоваться делать пакеты и делать коммиты чаще.

0 голосов
/ 18 ноября 2015

Просто чтобы проверить проблему с tempdb, в ваших JOINS принудительно подключите LOOP, например: выбрать * из теста внутреннее соединение LOOP test2 на х = у

И удалить все предложения ORDER BY.

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

Может потребоваться хороший анализ запросов, чтобы это исправить, но проверьте план выполнения и постарайтесь сделать все возможное, чтобы удалить любые сортировки или хеш-объединения, если это возможно, путем создания индексов или иногда принудительного типа соединения (но обычно, если статистика хорошо, вы должны делать это только в качестве последней возможности).

Удачи

0 голосов
/ 14 апреля 2011

SQL Server использует журналы транзакций для отслеживания того, что он делает, нет способа избежать этого (и вы не захотите, по многим, многим причинам).Проблема заключается в следующем:

  • temdb - это системная БД на сервере SQL, которую сервер SQL использует для записи временных данных, таких как кэшированные данные для действительно длинных запросов и временные таблицы (любыетаблицы, созданные с префиксом #, ##).

  • Когда вы впервые установили сервер SQL, он создал базу данных tempdb на диске со всеми данными.

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

В вашем случае файл журнала БД заполняется, вероятно, из-за того, что слишком много данных кэшируется / записывается в базу данных tempdb, а диск, на котором файл журнала базы данных tempdb, вероятно, заполнен.У вас должна быть опция 'shrink automatic' on 'для вашей базы данных tempdb, и, чтобы легко решить эту проблему, вы можете перезапустить службы sql, и она автоматически удалит лишние данные в файле журнала для базы данных tempdb.

Youможет попытаться немного настроить ваш запрос, чтобы он не записывал слишком много данных в базу данных tempdb (исключите длинные наборы результатов. избегайте #temptables и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...