(Возврат на основную страницу)
Использование команд Optimizer_WhatIF и StatsStream для моделирования рабочей среды
Принудительное завершение пользовательских процессов
Создание файла с разделителями из любой таблицы\представления с возможностью отладки
Удаление всех пользователей, привязанных к определенной учетной записи
Как разобрать XML в таблицу
Использование команд Optimizer_WhatIF и StatsStream для
моделирования рабочей среды
Фабиано Аморим (Fabiano Amorim)
Решая, какой план выполнения запроса считать наилучшим, реализованный в SQL
Server оптимизатор запросов исходит из данных, хранящихся в соответствующих
таблицах, а также учитывает, что собой представляет аппаратура сервера. Как вам,
в таком случае, проанализировать планы выполнения, сгенерированные для запросов,
которые медленно выполняются на рабочем сервере пользователя, если у вас нет ни
доступа к этому серверу, ни возможности воссоздать базу данных из резервной
копии?
Работая консультантом по SQL Server, я неоднократно сталкивался с просьбами
воспроизвести локально конкретный план выполнения запроса, полученный в рабочей
среде заказчика, и затем отладить его. Вы, может быть, думаете, что достаточно
восстановить резервную копию рабочей базы данных на компьютере, используемом для
разработки, и после этого мы должны быть готовы приступить к тестированию
запроса. К сожалению, вы редко можете поступить именно так, потому что:
Рабочая база данных, скорее всего, будет слишком большой: резервная копия этой базы данных также может оказаться слишком большой, чтобы ее можно было восстановить на локальном компьютере или перенести на другой компьютер. Слишком много времени ушло бы на то, чтобы создать резервную копию базы данных размером, скажем, 1 Тб, сжать полученный файл (допустим, используется версия SQL Server 2005 без встроенного сжатия), переслать этот файл на FTP-сервер, скачать его оттуда, разархивировать и, наконец, восстановить базу данных.
Данные могут быть конфиденциальными: заказчик, возможно, не имеет права передавать свои данные, даже если у вас имеется соглашение о неразглашении, поскольку данные включают конфиденциальную информацию.
Почти наверняка ваша аппаратура имеет какие-то отличия: если только господь не послал вам лэптоп с диском SSD размером 1 Тб и оперативной памятью объемом 32 Гб, ваша аппаратура будет очень существенно отличаться от сервера заказчика. Оптимизатор запросов создаст для них разные планы, потому что он учитывает доступную оперативную память и количество доступных процессоров.
Оптимизатор запросов воспользуется несколькими факторами, чтобы предложить
наилучший план выполнения запроса. Если вы измените какой-либо из них, не будет
никакой гарантии, что вам удастся воспроизвести конкретный план выполнения
запроса.
Принудительное завершение пользовательских процессов
Пол Эндрю (Paul Andrew)
Это еще один полезный скрипт, который я часто использую при работе с нашими хранилищами данных.
Назначьте параметру @DatabaseOrServerWide значение D или S в зависимости от желательной области действия.
Назначьте параметру @DatabaseName значение, если ранее указан D для работы с определенной БД.
Выполните скрипт.
Примечание; процессы, исполняемые от имени sa не удаляются.
Создание файла с разделителями из любой таблицы\представления
с возможностью отладки
Пол Эндрю (Paul Andrew)
Стандартное применение:
Создайте процедуру в той БД, где находятся таблицы, для которых нужно создать файл с разделителями.
Выполните процедуру с необходимыми параметрами, укажите также полный путь и имя полученного файла. Необходимо иметь права на запись в указанной папке. Утилита BCP поддерживает работу с локальными дисками и UNC ссылками.
Необязательные параметры:
Если нужно, можете указать ограничитель для текстовых строк (text qualifier). Например: "
Назначение параметру debug значения 1 приведет к тому, что в процессе выполнения будут выводиться сформированные строки и команда BCP.
Примечание; если в таблице используются сложные типы, которые SQL Server не
может преобразовать неявным образом, например sql_variant, создайте
представление, которое будет отображать эти таблицы.
От редакции, при попытке исполнить приведенный
код мы получили несколько ошибок. Не вдаваясь в подробности работы самой BCP, мы
попробовали исправить код, чтобы получить хотя бы корректный вызов. Вроде бы это
удалось. Наш вариант в файле 02_2013_06a.sql, исходный - в 02_2013_06.sql.
Удаление всех пользователей, привязанных к определенной
учетной записи
Хаким Али (Hakim Ali)
Возникала ли когда-нибудь у вас необходимость удаления всех пользователей уровня
базы данных, ассоциированных с определенной учетной записью уровня сервера? И
что, приходилось удалять их вручную? Например, увольняется сотрудник и нужно
убрать его изо всех баз данных. Или вы использовали графический интерфейс
студии, А может быть пытались создать скрипт? А как быть, если имена
пользователя и учетной записи отличаются? Или если пользователи названы по
разному в каждой базе данных, а самих баз несколько сотен? В итоге, несложная
задача вырастает в большую проблему
Но, прочь уныние! Вот скрипт, который удалит всех пользователей в базе данных,
привязанных к определенной учетной записи. Я хочу высказать благодарность
Джейсону Страте (Jason Strate), чья статья
(http://www.jasonstrate.com/2013/07/security-questions-removing-logins-from-databases/)
вдохновила меня на написание приведенного ниже кода. Просто присвойте переменной
@LoginName значение учетной записи и выполните код.
Как разобрать XML в таблицу
Стивен Уиллис (Steven Willis)
Не так
давно мне довелось читать множество запросов в форумах, где были запросы на
средства разбора XML в таблицу. Я написал процедуру, которая принимает в
качестве параметра XML строку, выполняет проверку средствами процедуры
'sp_xml_preparedocument' затем рекурсивно копирует все узлы в табличный формат.
От редакции, мы первым делом решили проверить как процедура
справится с разбором плана SQL запроса в формате XML. Ну, и получили.
Msg 217, Level 16, State 1, Procedure ParseXMLtoTable, Line 62
Maximum stored procedure, function, trigger, or view nesting level exceeded
(limit 32).
Так что сильно сложный XML ей не по силам.