У нас есть процесс, который генерирует отчет об инвентаризации. На стороне клиента процесс разбивает настраиваемое количество рабочих потоков для создания порции данных для отчета, которая соответствует одному хранилищу из многих (потенциально тысяч, обычно десятков). Каждый рабочий поток вызывает веб-сервис, который выполняет хранимую процедуру.
Процесс базы данных для обработки каждого чанка собирает кучу данных в таблицу #Teorary. В конце каждого блока обработки данные записываются в постоянную таблицу в базе данных tempdb. Наконец, в конце процесса один поток на стороне клиента запрашивает все данные из постоянной таблицы tempdb.
Чем больше пользователей запустят этот отчет, тем медленнее он будет. Я проанализировал активность в базе данных. В какой-то момент я увидел 35 отдельных запросов, все из которых были заблокированы в одной точке процесса. Все эти SPID имели порядка 50 мс ожидания типа LATCH_EX
на ресурсе METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Один SPID имеет этот ресурс, а все остальные блокируют. Я не нашел ничего об этом ресурсе ожидания в веб-поиске.
Таблица в базе данных tempdb, которую мы используем, имеет IDENTITY(1,1)
столбец. Ожидают ли эти SPID столбца IDENTITY? Какие методы мы могли бы использовать, чтобы уменьшить или устранить блокировку?
Сервер является частью кластера. Сервер работает под управлением 64-разрядной версии SQL Server 2012 Standard Edition с пакетом обновления 1 (SP1) в 64-разрядной версии Windows 2008 R2 Enterprise. Сервер имеет 64 ГБ ОЗУ и 48 процессоров, но база данных может использовать только 16, потому что это стандартная версия.
(Обратите внимание, что я не в восторге от использования постоянной таблицы в базе данных tempdb для хранения всех этих данных. Изменение этого было бы интересной технической и политической задачей, но я открыт для предложений.)
ОБНОВЛЕНИЕ 23.04.2013
Мы открыли дело о поддержке с Microsoft. Я буду держать этот вопрос в курсе, как мы узнаем больше.
ОБНОВЛЕНИЕ 5/10/2013
Инженер службы поддержки SQL Server согласился, что ожидания были вызваны столбцом IDENTITY. Снятие ИДЕНТИЧНОСТИ устранило ожидания. Мы не смогли продублировать проблему в SQL 2008 R2; это произошло только на SQL 2012.