Заметки Дмитрия Пилюгина о Microsoft SQL Server 

Twitter RSS
formats

Как отключение FK на момент загрузки, может повлиять на план запроса после загрузки

Если в таблице создано ограничение внешнего ключа (Foreign Key Constraint), то при добвлении данных в эту таблицу будет проверяться наличие/отсутствие соответствующих записей в «родительской» таблице.
Иногда, если загрузка данных идет из, условно говоря, доверенного источника (имеется ввиду нам известно, что все данные из источника отвечают требованиям ссылочной целостности), для ускорения загрузки ограничения внешних ключей отключают, а после загрузки — включают обратно.
Смоделируем такую ситуацию и посмотрим, что будет.

Читать дальше…

 
formats

Достаточно ли обновить статистику после загрузки данных, только по явно используемым индексам

Периодически возникает задача загрузить какую-то порцию данных в уже имеющуюся таблицу, чтобы потом, например, построить по ним отчет или выполнить еще какие-то действия.

Иногда, после загрузки большой (относительно количества уже имеющихся данных в таблице) порции данных, запрос, который используется для построения отчета, может начать «тормозить» при первом выполнении. И хотя потом все начинает работать так же быстро, как и до загрузки, хотелось бы избавиться от этого первоначального «торможения».

Причина в первоначальном торможении заключается в том, что при изменении большого количества данных статистика и план выполнения становятся неактуальными, поэтому оптимизатор вынужден автоматически обновлять статистику (если конечно у вас включена соответствующая опция) и пытаться найти новый план выполнения.
Этого (пересчета при запросе) можно избежать, если после операции загрузки вручную обновить статистику. Как правило, пользователя легче убедить в том, почему он должен ждать когда данные загружаются, чем в том почему он должен ждать когда отчет строится по готовым данным.

При обновлении статистики, может возникнуть соблазн уменьшить время обновления, обновляя только необходимую статистику. Например, если в запросе используется только один индекс, то на первый взгляд было бы логично обновить статистику только по этому индексу, экономя ресурсы сервера. Но на самом деле не все так очевидно. Посмотрим, что делает оптимизатор на примере.

Читать дальше…

 
formats

Вариант использования процедур sp_trace_XXX для долгосрочной трассировки

monitoring with sp_traceНеобходимость трассировки возникла после жалоб пользователей одного из офисов нашей компании на «внезапно появляющиеся» и столь же «внезапно исчезающие тормоза». Были исследованы планы предположительно «тормозящих» запросов, блокировки, счетчики сервера, канал связи, но явных проблем нигде не обнаружилось. По этому возникла резонная мысль посмотреть, а что происходит на сервере в этот момент, и главное когда именно (точное время) этот момент наступает и когда заканчивается. Для этих целей как раз и используется трассировка.

В данной заметке мы рассмотрим какие недостатки есть у стандартной утилиты Profiler, почему она непригодна для долгосрочного мониторинга,  как выполнять трассировку не используя  Profiler, а также как обрабатывать и анализировать полученные результаты.

Читать дальше…

 
formats

Получить в триггере текст запроса

Несколько раз встречал подобные вопросы в форумах. Задача, формулируется примерно так. Получить в триггере текст команды, которая привела к тому, что этот триггер сработал.

Это может быть полезно если мы, например, хотим увидеть/залогировать конкретный запрос, который привел к изменению данных. Сразу скажу, что штатный механизм для обеспечения этого на сегодняшний день, в версиях 2000, 2005, 2008 — не предусмотрен. Но тем не менее, что-то похожее можно реализовать с некоторыми ограничениями.

Читать дальше…

 
Теги:,