DBCC FREEPROCCACHE
не работает в Azure SQL DB. Как еще я могу заставить план выкинуть себя из кэша таким образом, чтобы это не повредило производственной системе (то есть я не могу просто изменять таблицы, как бы то ни было)? Это специально для SQL, созданного Entity Framework, так что это не хранимые процессы с самостоятельным управлением - это фактически динамический SQL.
(Источником были плохие показатели -> плохая статистика и т. Д. Все исправлено, но плохой план не исчезнет.)
ОБНОВЛЕНИЕ: я выбрал решение @ mrdenny, поскольку он добрался там сначала. Однако я успешно использую сценарий @Aaron Bertrand для выполнения работы. Спасибо всем за помощь !!
sp_executesql
.Ответы:
Azure SQL теперь напрямую поддерживает это
База данных SQL Azure напрямую поддерживает очистку кеш-памяти текущей базы данных пользователей без каких-либо взломов:
Дополнительная информация
Следующий скрипт ( Шеннон Говен ) может быть использован для пошагового наблюдения за процессом:
источник
Сегодня нет явного способа сделать это, но это не постоянный сценарий (команда DBCC все еще не поддерживается, но читается в Query Store ). Даже если попадание изменения схемы является приемлемым, это может быть не тем, что вы хотите, потому что это сделает недействительными все планы, связанные с базовым объектом, а не только плохой.
Не нужно рассчитывать на это, но построить динамический SQL для выполнения одной и той же операции с несколькими таблицами довольно просто:
(Я написал совет об этой проблеме "длины динамического SQL" ...)
источник
nvarchar(max)
переменная достигает предела после 4000 символов, 8000 символов, если я изменю его наvarchar(max)
. Запуск этого точного сценария. У нас есть ~ 450 таблиц, поэтому мы можем легко их обработать (~ 30/60 таблиц в).varchar(max)
допустимый синтаксис, он просто идентиченvarchar(8000)
иnvarchar(max)
идентиченnvarchar(4000)
.PRINT
команда, он показывает только 8000 байтов. Это ограничениеPRINT
команды, а не Azure. Если вы запустите команду, она будет работать, даже если вы не сможете визуально осмотреть все это.Добавьте обнуляемый столбец в таблицу, затем отбросьте столбец. Это заставит SQL очистить кеш для этого объекта.
Что касается выполнения всех таблиц, курсор должен сделать свое дело. Просто используйте имя столбца, которое никогда не будет существовать ни в одной таблице, например, «zzzzzz_go_away» или что-то в этом роде.
источник
База данных SQL Azure в настоящее время не поддерживается
DBCC FREEPROCCACHE
, поэтому вы не можете вручную удалить план выполнения из кэша. Однако если вы внесете изменения в таблицу или представление, на которое ссылается запрос (ALTER TABLE
/ALTER VIEW
), план будет удален из кэша. ( Ссылка .)источник
Чтобы очистить весь план выполнения, используйте это:
Если вы изменяете таблицу или представление, ссылающиеся на нее, план выполнения очищается.
Немного более объяснено здесь http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-from-the-procedure-cache-in-sql-azure/
источник