(Возврат на основную страницу)

 

Содержание номера за Август 2011 год

SQL Server

Август 2011 8 (14)

 

  1. Понимание выделения памяти в SQL Server
    Автор статьи Джей Чо (Jay Cho), Microsoft SQL Server Engine.

  2. Как подключиться к SQL Server 2005 при полном отсутствии доступа
    Руди Панигас

  3. Операторы SQL Server: EXCEPT и INTERSECT
    Роберт Шелдон

  4. Сравнение схемы
    Димон Панстер (Daemon Punster)

  5. Вывод возраста или разницы в датах в текстовом формате
    Ананд Учагаукар (Anand Uchagawkar)

 


Понимание выделения памяти в SQL Server
Автор статьи Джей Чо (Jay Cho), Microsoft SQL Server Engine.


В статье описывается выделение памяти для запроса в Microsoft SQL Server. Для SQL Server 2005 и 2008 она одинакова.
Выделение памяти запросу (так же известное как рабочий буфер запроса) это часть серверной памяти, используемая для временного хранения временной записи с данными данных во время выполнения сортировки и соединения записей. Название «выделение» дано вследствие того, что сервер требует «резервировать» эти запросы память для запроса перед тем, как фактически ее задействовать память. Резервирование повышает надежность запроса при нагрузке на сервер, так как во время выполнения запрос с зарезервированной под него памятью выйдет за ее пределы с меньшей вероятностью, а сервер предотвращает захват всей памяти одним запросом. Далее я дам описание того, как SQL Server рассчитывает требование запроса к памяти и регулирует выделения памяти при одновременном выполнении множества запросов.
При поступлении в SQL Server пользовательского запроса, сервер следует четко заданному алгоритму для получения необходимого пользователю результата. Во-первых, он создает скомпилированный план выполнения. Это план содержит инструкции со всеми логическими ссылками, преобразованными в фактические объекты, и механизм слеживания за выполнением запроса. В завершении сервер начинает выполнение от корня дерева инструкций. Создание скомпилированного плана довольно дорогой процесс, поскольку серверу требуется выбрать оптимальный план из сотен потенциально возможных. Различие между компиляцией и выполнением положительно сказывается на общей производительности, поскольку каждый скомпилированный план можно разместить в кеше и предоставить к нему доступ наряду с множеством других планов выполнения. Расчет выделения памяти выполняется в этой же общей последовательности действий. У него есть параметры, хранимые в скомпилированном плане, и механизм расчета фактического размера выделенной памяти в момент выполнения.
 


Как подключиться к SQL Server 2005 при полном отсутствии доступа
Руди Панигас


Представьте следующее:
• Вы забыли пароль «sa» или не знали его вовсе
• Встроенный/администраторский аккаунт удален по соображениям безопасности
• Вы не можете подключиться к экземпляру SQL Server
Что вы предпримите? Давайте посмотрим, что можно сделать.
 


Операторы SQL Server: EXCEPT и INTERSECT
Роберт Шелдон


Операторы SQL UNION, EXCEPT и INTERSECT позволяют объединять более одной инструкции SELECT для формирования единого результирующего набора. Оператор UNION возвращает все строки. Оператор INTERSECT возвращает все строки, присутствующие в обоих результирующих наборах. Оператор EXCEPT возвращает строки, которые присутствуют в первом результирующем наборе, но отсутствуют во втором. Просто? Роб Шелдон все объясняет и приводит множество примеров.
Довольно часто приходится встречаться с задачами сравнения двух или более таблиц или результатов запросов, чтобы определить какая информация одна и та же, а какая нет. Один из наиболее общих подходов для такого сравнения заключается в использовании операторов UNION или UNION ALL для объединения связанных столбцов в результатах, которые надо сравнить. Пока вы придерживаетесь ограничений, накладываемых этими операторами, можно объединять наборы данных, полученных из различных баз данных или даже серверов. С помощью оператора UNION, в конечном счете, вы получите результат, содержащий различающиеся строки из двух объединенных результирующих наборов. Однако ситуация усложняется, если использовать оператор UNION для возврата только общих данных, содержащихся в обоих результирующих наборах, или различных данных, существующих только в одной из двух (или нескольких) таблиц. Для получения необходимых результатов надо использовать UNION ALL с предложением GROUP BY, хотя логика выполнения этой задачи не всегда очевидна. А использование оператора JOIN для получения желаемого результата нисколько не проще.
Вникните в операторы INTERSECT и EXCEPT. Начиная с SQL Server 2005, стало возможно использовать эти операторы для объединения запросов и получать необходимые результаты. К примеру, можно воспользоваться оператором INTERSECT, чтобы вернуть только те значения, которые совпадают в обоих наборах данных
 


Сравнение схемы
Димон Панстер (Daemon Punster)


Я поддерживаю несколько баз данных, которые время от времени обновляются разработчиком посредством набора защищенных от чтения хранимых процедур. Изменения типов данных и подобное не всегда документированы и трудно понять что же изменилось, так что я написал приведенный ниже скрипт, позволяющий сравнивать структуры двух баз данных (например, тестовая по сравнению с промышленной БД).
Мне эта программа сильно помогает, надеюсь, вам тоже окажется полезной. В коде используется CTE, поэтому код будет работать только на SQL2005 и более старших версиях. Просто измените имя БД в соединении, и вы можете использовать мой код. Можете использовать имя связанного (linked) сервера для сравнения структур на удаленных серверах. Для адаптации к своим условиям, измените критерий WHERE в конце программы.
Есть пара вещей, которые вы можете изменить. Если в целевой БД отсутствует полная таблица, то код выдаст не ее имя, а весь перечень полей как "не найдено". Отличия опознаются в конструкции CASE, и она недостаточно хитра, чтобы выдать информацию о более чем одном отличии по одному полю таблицы. Но для меня это ограничение не имеет большого значения!
 


Вывод возраста или разницы в датах в текстовом формате
Ананд Учагаукар (Anand Uchagawkar)


Существует много примеров кода, выполняющих определение возраста, но то, что я предлагаю в этой статье, позволяет сформировать удобный и хорошо читаемый результат. Если кто-то хочет определить разницу между двумя датами на основе лет, месяцев и дней, прошедших между двумя датами, особенно если нужно определить возраст.
Предлагаемый код возвращает разницу в формате xx year(s), xx month(s), xx day(s)
Так что для использования все очень просто. Передайте в качестве первого аргумента стартовую дату и финальную дату в качестве второго аргумента, программа вернет текст с результатом расчета.
 


(Возврат на основную страницу)

 

Hosted by uCoz