Добрый день. Все вопросы - в контексте использования sql приложением 1С.
1) По рекомендации фирмы 1С https://its.1c.ru/db/metod8dev/content/5837/hdoc надо выполнять DBCC FREEPROCCACHE после обновления статистики, выполненного в плане обслуживания (через мастера):
"MS SQL Server строит план запроса на основании статистической информации о распределении значений в индексах и таблицах. Статистическая информация собирается на основании части (образца) данных и автоматически обновляется при изменении этих данных. Иногда этого оказывается недостаточно для того, что MS SQL Server стабильно строил наиболее оптимальный план выполнения всех запросов. "
Почему "Иногда этого оказывается недостаточно", в каких случаях?
Как я понимаю, DBCC FREEPROCCACHE нужен для удаления из кеша всех планов запроса, чтобы план, построенный на неактуальной статистике более не использовался. Но с другой стороны, оптимизатор перед выполнением запроса проверяет, изменилась ли статистика и если да - создает новый план запроса - или это не так?
2) Если оптимизатору поступает запрос, для которого уже есть план в кеше, но параметры запроса отличаются - будет ли скомпилирован новый план из-за "прослушивания параметров" - или это работает только для хранимых процедур (которые 1С вроде как не использует DBCC FREEPROCCACHE и Дед Мороз)
3) Кроме неактуальной статистики - какие еще могут быть причины построения неоптимального плана запроса? В голову приходит лишь ситуация когда система сильно нагружена, возможных планов для данного запроса множество, при выборе планов сработал таймаут построителя и он выбрал лучший из тех что успел скомпилировать (а успел он 2-3 штуки из-за сильной нагрузки), а не оптимальный.
4) В плане обслуживания из вышеуказанной статьи уже есть дефрагментация индексов - зачем тогда реиндексация?
И если использовать скрипт вида http://www.community.terrasoft.ru/blogs/8318:
надо ли все равно делать "полный" реиндекс всей БД (например создав задание через мастер плана обслуживания как в вышеупомянутой статье 1С)?
1) По рекомендации фирмы 1С https://its.1c.ru/db/metod8dev/content/5837/hdoc надо выполнять DBCC FREEPROCCACHE после обновления статистики, выполненного в плане обслуживания (через мастера):
"MS SQL Server строит план запроса на основании статистической информации о распределении значений в индексах и таблицах. Статистическая информация собирается на основании части (образца) данных и автоматически обновляется при изменении этих данных. Иногда этого оказывается недостаточно для того, что MS SQL Server стабильно строил наиболее оптимальный план выполнения всех запросов. "
Почему "Иногда этого оказывается недостаточно", в каких случаях?
Как я понимаю, DBCC FREEPROCCACHE нужен для удаления из кеша всех планов запроса, чтобы план, построенный на неактуальной статистике более не использовался. Но с другой стороны, оптимизатор перед выполнением запроса проверяет, изменилась ли статистика и если да - создает новый план запроса - или это не так?
2) Если оптимизатору поступает запрос, для которого уже есть план в кеше, но параметры запроса отличаются - будет ли скомпилирован новый план из-за "прослушивания параметров" - или это работает только для хранимых процедур (которые 1С вроде как не использует DBCC FREEPROCCACHE и Дед Мороз)
3) Кроме неактуальной статистики - какие еще могут быть причины построения неоптимального плана запроса? В голову приходит лишь ситуация когда система сильно нагружена, возможных планов для данного запроса множество, при выборе планов сработал таймаут построителя и он выбрал лучший из тех что успел скомпилировать (а успел он 2-3 штуки из-за сильной нагрузки), а не оптимальный.
4) В плане обслуживания из вышеуказанной статьи уже есть дефрагментация индексов - зачем тогда реиндексация?
И если использовать скрипт вида http://www.community.terrasoft.ru/blogs/8318:
-- 30% считаем пределом для определения типа обновления индекса. IF @frag < 30.0 SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; IF @frag >= 30.0 SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
надо ли все равно делать "полный" реиндекс всей БД (например создав задание через мастер плана обслуживания как в вышеупомянутой статье 1С)?