Команда ALTER DATABASE SET QUERY_STORE заблокирована

Tags: Query Store, database

Если вы пытаетесь выполнить команду ALTER DATABASE, чтобы изменить параметр Query Store (например, его отключение или изменение параметра), и он заблокирован, обратите внимание на блокировку session_id и то, что выполняет этот session_id. Если вы пытаетесь выполнить эту команду ALTER сразу после восстановления после сбоя или перезагрузки, вы, вероятно, заблокированы загрузкой данных в Query Store.

Напомним, что при запуске базы данных с включенным Query Store она загружает данные из внутренних таблиц Query Store в память (это оптимизация для быстрого выполнения определенных возможностей Query Store). В некоторых случаях это небольшой объем данных, в других случаях он больше (возможно, несколько ГБ), и, как таковой, загрузка может занять несколько секунд или минут. Я видел, что для загрузки очень большого магазина запросов (более 50 ГБ) требуется более 30 минут.

В частности, я недавно работал с клиентом с чрезвычайно большим Query Store. Клиент включил Trace Flag 7752 таким образом, что запросы не были заблокированы, а Query Store загружен асинхронно. Трудность в этой нагрузке заключается в том, что нет никакого способа контролировать прогресс. Вы можете отслеживать, когда он начнет загрузку, а затем, когда он закончит использование расширенных событий, но нет индикатора выполнения, чтобы смотреть на экран. При попытке выполнить инструкцию ALTER DATABASE <dbname> SET QUERY_STORE во время загрузки, оператор был заблокирован системным сеансом, который выполнял команду Query Store ASYN. Команда ALTER DATABASE <dbname> SET QUERY_STORE завершилась после загрузки данных в Query Store.

Если вы не используете Trace Flag 7752, то, если вы попытаетесь выполнить ALTER DATABASE <dbname> SET QUERY_STORE после перезагрузки или перехода на другой ресурс, вы можете увидеть QDS_LOADDB wait_type для запросов (это будет зависеть от размера Query Store). Опять же, нет способа отслеживать нагрузку, и вы увидите такое же поведение, если попытаетесь запустить ALTER DATABASE <dbname> SET QUERY_STORE: команда не будет завершена до завершения загрузки хранилища запросов. Таким образом, независимо от того, загружается ли информация в Query Store синхронно или асинхронно, вы не сможете выполнить инструкцию ALTER DATABASE <dbname> SET QUERY_STORE до завершения загрузки.

No Comments

Add a Comment