У меня есть SQL Server 2005, который стал непредсказуемым в последнее время, и я ломаю голову над тем, почему. Запросы, которые выполняются за считанные секунды, меняют планы и занимают минуты (время, затрачиваемое на полное сканирование таблицы или спулинг индекса). Теперь первая и самая очевидная вещь - статистика устарела, что приводит к замешательству оптимизатора, но я убежден, что это не так - во-первых, потому что базовые данные существенно не меняются (например, добавление данных за день поверх данных за год уже в таблице) и, во-вторых, потому что значения «Автоматическое создание статистики» и «Автоматическое обновление статистики» являются истинными Однако оптимизатор будет путаться; Запуск SQL в Tuning Advisor дает мне много многостолбцовых CREATE STATISTICS
операторов, которые, кажется, это исправляют (до тех пор, пока следующий бит SQL не будет себя вести).
Любые идеи стратегии, которую я могу использовать, чтобы приблизиться к первопричиной этого? Любой, почему «нормальной» статистики недостаточно?
where col=(cast @var...)
) и@var
может быть'%'
. Я унаследовал это неделю или две назад, и мне нужно, чтобы он работал в основном до тех пор, пока он не будет заменен. Спасибо за ссылку, я приведу ее в движение.SOS_SCHEDULER_YIELD
было,CXPACKET
и,sp_configure "max degree of parallelism", 1
похоже, пока что выбило обе проблемы из головы. Благодарность!Из MSDN :
« Операции вставки происходят в восходящих или нисходящих ключевых столбцах Статистика в восходящих или нисходящих ключевых столбцах, таких как столбцы IDENTITY или отметка времени в реальном времени, может потребовать более частых обновлений статистики, чем выполняет оптимизатор запросов. Операции вставки добавляют новые значения в восходящие или нисходящие столбцы Число добавленных строк может быть слишком маленьким, чтобы вызвать обновление статистики. Если статистика не актуальна и запросы выбираются из последних добавленных строк, текущая статистика не будет иметь оценки количества элементов для этих новых значений. приводят к неточным оценкам мощности и снижению производительности запросов.
Например, запрос, который выбирается из самых последних дат заказа на продажу, будет иметь неточные оценки количества элементов, если статистика не будет обновлена, чтобы включить оценки количества элементов для самых последних дат заказа на продажу.
После операций обслуживания Рассмотрите возможность обновления статистики после выполнения процедур обслуживания, которые изменяют распределение данных, таких как усечение таблицы или массовая вставка большого процента строк. Это поможет избежать будущих задержек в обработке запросов, пока запросы ждут автоматических обновлений статистики. "
Вы можете время от времени использовать «EXEC sp_updatestats» в вашей системе (запланировано некоторое время) или использовать функцию STATS_DATE для всех объектов и посмотреть, когда их статистика действительно обновлялась в последний раз, и с тех пор было слишком много времени, используйте UPDATE. СТАТИСТИКА для этого конкретного объекта. По моему опыту, даже при включенной автоматической статистике мы все равно вынуждены время от времени обновлять статистику из-за операций вставки, которые не запускали автоматическое обновление.
Чтобы добавить мой личный код (используется в еженедельной работе, которая создает динамические отчеты для обновления статистики):
Здесь я получаю все объекты, у которых статистика не обновлялась более 3 месяцев или с момента последнего обновления статистики изменилось более 10% строк.
источник
SOS_SCHEDULER_YIELD
но я не могу сказать прямо сейчас, если это из-за плохих планов, или что этот (6-летний, 2-процессорный, 4G RAM) ящик действительно только что перегружен, и я прошли через переломный момент.Я предполагаю, что одна или несколько ваших таблиц становятся достаточно большими, чтобы не превышать 20% изменений, необходимых, чтобы пометить текущую статистику как устаревшую, чтобы сработала статистика автоматического обновления, и при этом было достаточно обновлений (или вставок). ) что обновление статистики очень помогло бы. Недавно я обнаружил то же самое в конкретной среде после обновления с SQL 2000 до SQL 2008.
В дополнение к другим сайтам, упомянутым в ответах выше, я бы предложил посетить следующие онлайн-ресурсы.
1) Red-Gate имеет ряд бесплатных электронных книг, доступных для скачивания, включая «Статистика SQL Server» Хольгера Шмелинга, где вы найдете следующую цитату:
http://www.red-gate.com/our-company/about/book-store/
«Таблицы с более чем 500 строками, по крайней мере, 20% данных столбца должны были быть изменены, чтобы сделать недействительной любую связанную статистику»
2) SQL Sentry имеет бесплатный инструмент Plan Explorer, который помогает отследить проблемы в плане SQL, такие как оценка слишком большого или слишком малого количества строк по сравнению с фактическим количеством строк для данной таблицы в запросе. Просто сохраните фактический план выполнения из SSMS, а затем пройдитесь по различным частям плана с помощью Plan Explorer. Дело не в том, что информация недоступна в SSMS с использованием графического плана выполнения, но инструмент из SQL Sentry делает его намного проще для просмотра.
http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp
3) Проверьте дату обновления статистики для таблиц в запросах, которые вас больше всего интересуют с помощью STATS_DATE (), вы можете найти быстрый запрос, чтобы получить самую старую статистику, используя запрос, найденный в следующем обсуждении.
http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-statistics/
Надеюсь, это поможет!
Я думаю, вам особенно понравится книга от Red-Gate!
-Джефф
источник