Устранение ошибок tempdb в выделенном пуле SQL

Область применения: Azure Synapse Analytics

В выделенном пуле SQL база данных tempdb используется для временных таблиц и промежуточного пространства для перемещения данных (например, перемещений перетасовки, обрезки), сортировки, загрузки, разлива памяти и других операций. Кроме того, незафиксированная транзакция в одном сеансе, взаимодействующая с базой данных tempdb, не позволит журналу очистить все остальные сеансы, что приведет к заполнению файлов журнала. Так как база данных tempdb является общим ресурсом, большое потребление пространства базы данных tempdb может привести к сбою запросов других пользователей и эскалации, чтобы предотвратить создание новых подключений.

Что делать, если не удается подключиться к выделенному пулу SQL?

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

Примечание: Обязательно предоставьте службе дополнительное время для отмены всех выполняемых транзакций, так как выполнение операций приостановки и масштабирования в этом сценарии может занять больше времени, чем обычно.

Устранение неполадок с полными файлами данных tempdb

Шаг 1. Определение запроса, который заполняет базу данных tempdb

Убедитесь, что вы определили запрос, который заполняет базу данных tempdb во время выполнения запроса, если вы не реализовали компонент ведения журнала в платформе ETL или аудит выделенных инструкций пула SQL. В большинстве случаев, не всегда, самый длительный запрос, выполняемый в течение периода времени, в течение которого возникла проблема, является причиной ошибок, вызванных тем, что база данных tempdb не занимает места. Выполните следующий запрос, чтобы получить список длительных запросов:

SELECT TOP 5 *
FROM sys.dm_pdw_exec_requests
WHERE status = 'running'
ORDER BY total_elapsed_time desc;

Когда у вас есть достаточно подозрительный запрос, попробуйте один из следующих вариантов:

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

Шаг 2. Предотвращение повторения

После определения и выполнения действий с ответственным запросом рассмотрите возможность реализации мер по устранению неполадок, чтобы предотвратить повторение проблемы. В следующей таблице показаны способы устранения наиболее распространенных причин полных ошибок базы данных tempdb:

Причина Описание Устранение рисков
Плохой распределенный план Распределенный план, созданный для данного запроса, может непреднамеренно привести к перемещению данных с высокой частотой в результате плохой статистики таблицы. Обновите статистику для соответствующих таблиц и убедитесь, что она поддерживается по регулярному расписанию.
Плохая работоспособность кластеризованного индекса columnstore (CCI) Он потребляет пространство базы данных tempdb из-за разлива памяти. Перестройте ccis и убедитесь, что они поддерживаются по регулярному расписанию.
Крупные транзакции Большой объем инструкций CREATE TABLE AS SELECT (CTAS) или INSERT SELECT заполняет базу данных tempdb во время операций перемещения данных. Разбейте инструкцию CTAS или INSERT SELECT на несколько небольших транзакций.
Недостаточное выделение памяти Запросы с недостаточным объемом выделенной памяти (через класс ресурсов или группу рабочей нагрузки) могут перетекать в tempdb. Выполняйте запросы с большим классом ресурсов или группой рабочей нагрузки с большим количеством ресурсов.
Запросы к внешней таблице конечных пользователей Запросы к внешним таблицам не являются оптимальными для запросов конечных пользователей, так как подсистеме необходимо считывать весь файл tempdb перед обработкой данных. Загрузите данные в постоянную таблицу, а затем направьте туда запросы пользователей.
Недостаточно общих ресурсов Вы можете обнаружить, что выделенный пул SQL близок к максимальной емкости tempdb во время высокой активности. Рассмотрите возможность масштабирования выделенного пула SQL в сочетании с любой из описанных выше мер.

Устранение неполадок с полными файлами журнала транзакций tempdb

Журнал транзакций tempdb обычно заполняется только в том случае, если клиент или пользователь:

  • Открывает явную транзакцию, но никогда не выдает или COMMITROLLBACK.
  • Наборы IMPLICIT_TRANSACTION = ON (особенно для клиентов И средств JDBC, использующих функции автозавершение).

Шаг 1. Определение открытых транзакций

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

SELECT *
FROM sys.dm_pdw_exec_sessions
WHERE is_transactional = 1
AND status = 'Idle';

Примечание. Не все подключения, возвращаемые в результате этого запроса, обязательно проблематичны. Выполните запрос по крайней мере дважды с более чем 15 минут между выполнением и посмотрите, какие подключения сохраняются в этом состоянии.

Шаг 2. Устранение и предотвращение проблемы

Определив, какие клиенты проводят открытые транзакции, обратитесь к пользователям, чтобы изменить один или оба варианта:

  • Конфигурация драйвера (например, для параметра JDBC AutoCommit значение off, которое задает IMPLICIT_TRANSACTIONS = ON)
  • Поведение нерегламентированных запросов (например, неправильное выполнение BEGIN TRAN без COMMIT/ROLLBACK)

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

Ресурсы

  • Запросите sys.dm_pdw_errors динамического административного представления на наличие ошибок.