SQL Server 2000

Содержание


Лекция 1. Обзор Microsoft SQL Server

СУБД SQL Server появилась в 1989 году и с тех пор значительно изменилась. Огромные изменения претерпели масштабируемость продукта, его целостность, удобство администрирования, производительность и функциональные возможности. Краткое введение в систему SQL Server 2000. Обзор новых возможностей: новые типы данных, поддержка XML, улучшения репликации, поддержка целостности ссылочных данных, улучшения полнотекстового поиска. Обзор реализаций системы SQL Server: клиент-серверная и автономная системы. Благодаря новым возможностям облегчается применение и администрирование SQL Server, повышается производительность работы SQL Server.

Microsoft SQL Server 2000 – это реляционная система управления базой данных (СУБД). В реляционных базах данных данные хранятся в таблицах. Взаимосвязанные данные могут группироваться в таблицы, кроме того, могут быть установлены также и взаимоотношения между таблицами. Отсюда и произошло название реляционные – от английского слова relational (родственный, связанный отношениями, взаимозависимый). Пользователи получают доступ к данным на сервере через приложения, а администраторы, выполняя задачи конфигурирования, администрирования и поддержки базы данных, производят непосредственный доступ к серверу. SQL Server является масштабируемой базой данных, это значит, что она может хранить значительные объемы данных и поддерживать работу многих пользователей, осуществляющих одновременный доступ к базе данных.

СУБД SQL Server появилась в 1989 году и с тех пор значительно изменилась. Огромные изменения претерпели масштабируемость продукта, его целостность, удобство администрирования, производительность и функциональные возможности. В данной лекции мы рассмотрим два типа окружений, в которых можно использовать SQL Server. Затем мы рассмотрим новые функциональные возможности и улучшения, имеющиеся в SQL Server 2000.

Системы SQL Server

Система SQL Server может быть реализована либо как клиент-серверная система, либо как автономная "настольная" система. Тип проектируемой вами системы зависит от количества пользователей, которые должны одновременно осуществлять доступ к базе данных, и от характера работ, которые должны выполняться. В этом разделе мы рассмотрим оба типа систем SQL Server.

Клиент-серверная система SQL Server

Клиент-серверная система SQL Server может иметь двухзвенную установку (two-tier setup) либо трехзвенную установку (three-tier setup). Независимо от варианта установки, программное обеспечение и базы данных SQL Server размещаются на центральном компьютере, который называется сервер базы данных (database server). Пользователи работают на отдельных компьютерах, которые называются клиенты (clients). Доступ пользователей к серверу базы данных производится при помощи приложений с их компьютеров-клиентов (в двухзвенных системах) либо при помощи приложений, выполняющихся на специально предназначенном для этой цели компьютере, который называется сервер приложений (application server) (в трехзвенных системах).

В частности, в двухзвенных системах клиенты исполняют приложения, осуществляющие доступ к серверу базы данных непосредственно через сеть. Таким образом, компьютеры-клиенты исполняют программный код, соответствующий нуждам предприятия, и код, отображающий для пользователя результаты доступа к базе данных. Такие клиенты называются толстыми (thick client), потому что они выполняют два вида работы (cм. рис. 1.1).Двухзвенная установка полезна при относительно небольшом количестве пользователей, потому что для соединения с каждым из пользователей расходуются системные ресурсы, такие как память и блокировки (locks). Чем больше будет количество соединений с пользователями, тем хуже будет производительность системы, из-за соперничества за ресурсы. В этих условиях вас может заинтересовать применение трехзвенной системы.

Двухзвенная клиент-серверная система


Рис. 1.1.  Двухзвенная клиент-серверная система

Как уже говорилось ранее, в трехзвенной установке имеется третий компьютер, который называется сервер приложений. В системах этого типа в задачи компьютеров-клиентов входит лишь исполнение программного кода по вызову функций с сервера приложений и отображение результатов доступа. Такие клиенты называются тонкими (thin client). Cервер приложений исполняет приложения, которые выполняют задачи, требующиеся для нужд предприятия, эти приложения являются многопотоковыми (multithreaded), благодаря чему с ними могут работать много пользователей одновременно. Cервер приложений соединяется с сервером базы данных, осуществляет доступ к данным и возвращает результаты клиенту (см. рис. 1.2).

Достоинством трехзвенной системы является то, что можно позволить серверу приложений организовывать все клиентские соединения с сервером базы данных, вместо того, чтобы разрешить каждому клиенту самостоятельно устанавливать соединения (такая самостоятельность может привести к нерациональному использованию ресурсов сервера базы данных). Этот подход называется организация пула соединений (connection pooling), при этом предполагается, что запросы клиентов помещаются в пул (или, говоря точно, в очередь, queue), в котором они будут дожидаться ближайшего доступного соединения. Сразу же по освобождении соединения, оно может использоваться для нужд следующего запроса из очереди. Организация пулов соединений позволяет в некоторой степени регулировать объем работы, выполняемой сервером базы данных, конфигурируя количество соединений, имеющихся в пуле и, следовательно, количество соединений, доступных для выполнения задач пользователей. (Количество соединений можно конфигурировать программно.) Так можно избавиться от потребности в большом количестве пользовательских соединений, способных быстро израсходовать ресурсы и замедлить скорость работы. Организация пулов соединений может быть реализована при помощи Internet Information Server (продукта фирмы Microsoft) и программного обеспечения для организации пулов соединений, вроде COM+, являющегося службой компонент, поставляемой вместе с операционной системой Microsoft Windows 2000. Мы не станем углубляться в подробности использования этих продуктов, поскольку программирование приложений выходит за рамки нашего курса.

Для некоторых корпоративных систем и веб-сайтов требуется большая производительность, чем способен обеспечить один сервер. SQL Server 2000 обладает способностью разделять таблицы по нескольким серверам, благодаря чему можно распределить нагрузку по обработке данных. Более подробно об этом написано в разделе "Распределенные расчлененные представления" далее в данной лекции.

 Трехзвенная клиент-серверная система


Рис. 1.2.  Трехзвенная клиент-серверная система

Настольная система

SQL Server может использоваться также и как автономный (stand-alone) сервер базы данных, работающий на настольном или на портативном компьютере. Мы будем называть такие конфигурации настольными системами (desktop system). В них клиентские приложения исполняются на том же компьютере, на котором хранится программное обеспечение, реализующее механизм работы SQL Server и базы данных. В данной системе применяется только один компьютер, поэтому не устанавливаются никакие сетевые соединения от клиента к серверу – клиент устанавливает локальное соединение со своей локальной установкой SQL Server.

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

Новые функциональные возможности и усовершенствования, появившиеся в SQL Server 2000

SQL Server 2000 имеет столько новых функциональных возможностей, что мы сможем рассказать здесь лишь о некоторых новшествах. Благодаря им облегчается применение и администрирование SQL Server, повышается производительность работы SQL Server, так что SQL Server стала прекрасной платформой не только для мелкомасштабных приложений оперативной обработки транзакций (OLTP-приложений, on-line trАnsaction processing applications), но и для крупномасштабных OLTP-приложений, для организации информационных хранилищ (data warehousing) и приложений для электронной коммерции. В данном разделе описаны некоторые из наиболее интересных новых функциональных возможностей SQL Server 2000, рассказано о других улучшениях в SQL Server и даны ссылки на источники дополнительной информации об этом.

Улучшения сервера

В этом разделе рассказано о некоторых новых функциональных возможностях и улучшениях SQL Server 2000 со стороны сервера. Многое из этого будет описано более подробно в последующих лекциях.

Поддержка расширенной памяти

SQL Server 2000 Enterprise Edition может пользоваться API (интерфейсом прикладного программирования, Application Programming Interface) Windows 2000 Address Windowing Extensions (AWE) для поддержки больших адресных пространств. На серверах под управлением Windows 2000 AdvАnced Server SQL Server поддерживает память до 8 Гб, а на серверах под управлением Windows 2000 Datacenter – до 64 Гб. Поддержка AWE имеется только в этих двух операционных системах, ни Windows 2000 Professional, ни Windows 2000 Server не поддерживают AWE. Кроме того, для того, чтобы использовать AWE, применяется новый параметр конфигурации SQL Server – awe enabled.

Дополнительная информация. Для дополнительной информации смотрите "awe enabled Option" в Books Online.
Многократные экземпляры SQL Server

В SQL Server 2000 допускается исполнение нескольких экземпляров SQL Server на одном компьютере. Каждый экземпляр имеет свою собственную системную и пользовательские базы данных. Приложения могут соединяться с экземплярами SQL Server точно так же, как они соединялись бы с экземплярами SQL Server, работающими на другом компьютере. Для создания экземпляров SQL Server вам потребуется инсталляционный компакт-диск SQL Server. Кроме того, в сочетании с одним или несколькими экземплярами SQL Server 2000 может работать один экземпляр SQL Server 6.5 или SQL Server 7, но не оба одновременно.

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

Распределенные расчлененные представления

Распределенные расчлененные представления (distributed partitioned views) – это замечательная новая функциональная возможность SQL Server 2000, очень ценная для систем баз данных и веб-сайтов, требующих вычислительной мощи нескольких серверов, необходимой для поддержки нагрузки интенсивных транзакций. При помощи этой функциональной возможности вы можете осуществлять горизонтальное расчленение таблиц по нескольким компьютерам, на которых работает SQL Server и создавать представления (views, термин views переводится как"представления","виды" и"виртуальные таблицы"), охватывающие все серверы-члены. Благодаря представлениям создается впечатление, как будто бы на каждом сервере имеется полная копия таблицы. Приложения могут ссылаться на представления и не обязаны знать о том, на каком из серверов-членов хранятся данные.

Дополнительная информация. Чтобы ознакомиться с дополнительными подробностями и получить общие рекомендации, смотрите "Creating a Partitioned View" в Books Online.
Кластеризация для обеспечения отказоустойчивости

В SQL Server 2000 были значительно улучшены средства администрирования кластеризацией для обеспечения отказоустойчивости (failover-clustering administration). Начальная установка отказоустойчивости выполняется теперь не в мастере Failover Cluster Wizard, а стала частью процесса начальной установки SQL Server. В SQL Server 2000, по сравнению с предыдущими версиями, кластеризация для обеспечения отказоустойчивости стала проще в инсталляции, конфигурировании и администрировании. Вот перечень некоторых из задач администрирования, которые вы сможете выполнять:

Об использовании служб Microsoft Cluster Services см. лекцию 12. Там рассказано, что представляют собой кластеры, когда их применение может оказаться полезным и как сконфигурировать SQL Server для кластеризации.

Поддержка XML

Язык XML (Extensible Markup LАnguage) – это стандарт Консорциума WWW (W3C, World Wide Web Consortium) для представления информации в форме структурированных документов, пригодной для транспортировки данных между разнородными системами. В SQL Server 2000 имеются новые средства для поддержки функциональности XML. В основном вы можете применять XML для доступа к SQL Server при помощи протокола HTTP через URL. Имеются следующие новые функциональные возможности поддержки XML.

О применении XML для доступа к SQL Server см. лекцию 23. В этой же лекции вы изучите некоторые вопросы программирования, имеющие отношение к Интернету.

Операции по поддержке базы данных

К усовершенствованиям SQL Server 2000 относится то, что для некоторых операций поддержки базы данных, выполняемых администраторами, повысилась скорость их исполнения и улучшилось удобство работы. К этим усовершенствованиям относятся повышение скорости дифференциального (разностного) резервного копирования (differential backup), параллельные проверки согласованности базы данных (DBCC, database consistency checks) и параллельное сканирование с проверкой согласованности базы данных (DBCC). Дифференциальные (разностные) резервные копирования теперь могут производиться за время, пропорциональное объему данных, измененных с момента последнего резервного копирования базы данных. DBCC теперь может пользоваться достоинствами многопроцессорных вычислительных систем, работая параллельно сразу на нескольких процессорах, что повышает производительность (скорость работы) DBCC. DBCC при сканировании таблиц теперь работает без блокировки разделяемых таблиц, благодаря чему обновления могут производиться одновременно с задачами DBCC.

Целостность ссылочных данных

При помощи двух новых предложений – ON UPDATE и ON DELETE – вы можете задать поведение SQL Server при изменении колонки в таблице, на которую ссылается внешний ключ (foreign key) в другой таблице. Предложения ON UPDATE и ON DELETE могут применяться в операторах CREATE TABLE и ALTER TABLE. Эти предложения имеют опции CASCADING и NO ACTION. CASCADING с ON DELETE означает, что если из указываемой (родительской) таблицы удаляется ряд, то это удаление будет "каскадным", окажет также воздействие и на таблицу внешних ключей. Аналогично, CASCADING с ON UPDATE означает, что обновление, применяемое к указываемой колонке данных в родительской таблице, будет применяться "каскадом", так что таблица внешних ключей будет обновляться таким же образом. Если с ON DELETE или с ON UPDATE применяется опция NO ACTION , то, если в родительской таблице указываемая строка удалена или указываемая колонка обновлена, SQL Server вернет сообщение об ошибке, а удаление или обновление "откатится назад".

Дополнительная информация. Описание синтаксиса и другие подробности об этих предложениях имеются в "CREATE TABLE" и "ALTER TABLE" в Books Online.
Полнотекстовый поиск

В SQL Server 2000 появились две новые возможности, улучшающие функциональность полнотекстового поиска: отслеживание изменений (chАnge tracking) и фильтрация изображений (image filtering). Отслеживание изменений сохраняет журнал всех изменений, произведенных с полнотекстовыми индексированными данными, а на основе записи этих изменений можно обновлять индекс. Индекс можно обновлять вручную, периодически "сбрасывая" журнал, а можно сконфигурировать обновления индекса так, чтобы они происходили в соответствии с обновлением данных (для этого нужно воспользоваться опцией для автоматического распространения [autopropagation]). Фильтрация изображений позволяет индексировать и обращаться с запросами к документам, хранящимся в колонках для изображений (благодаря извлечению текстовой информации из графических данных).

Дополнительная информация.Дополнительная информация о полнотекстовом поиске имеется в "Microsoft Search Service" в Books Online.
Новые типы данных

В SQL Server 2000 появились три новых типа данных, повышающие гибкость программирования. Вот эти новые типы данных:

В SQL Server имеется много других типов данных. (См. раздел "Применение системных типов данных" в лекции 10.)

Улучшения для индексирования

В SQL Server 2000 появилось несколько новых улучшений для индексирования. Они обеспечивают большую гибкость при индексировании, потому что теперь можете:

Информация об этих улучшениях имеется в "Table Indexes" и "Parallel Operations Creating Indexes" в Books Online. (Об индексах см. лекцию 17.)

Улучшения для администрирования

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

Пересылка журнала

При помощи пересылки журнала (log shipping) вы можете непрерывно "сбрасывать" и копировать резервные копии журнала транзакций с исходного сервера на целевой сервер (или серверы), а затем автоматически загружать эти журналы на целевом сервере (или серверах). Таким образом, вы получаете "теплый резерв" (warm standby) базы данных и отдельную, предназначенную только для чтения систему для выполнения таких запросов, как деловые отчеты, чтобы убрать подобную деятельность с целевого сервера. Вы можете сконфигурировать расписание для каждого шага, в том числе сконфигурировать задержки между копированием и загрузкой резервных копий журналов.

Дополнительная информация. Для дополнительной информации об этом смотрите "Log Shipping" в Books Online.
PerformАnce Аnalyzer

В Enterprise MАnager появилось новое инструментальное средство – PerformАnce Аnalyzer (Анализатор производительности). PerformАnce Аnalyzer имеется в папке MАnagement каждого из серверов. Это средство служит для сбора данных о производительности для отдельной базы данных или для всех баз данных. Данные трассировки хранятся в таблице, и на их основе строится "куб OLAP" (OLAP – online Аnalytical processing, аналитическая обработка в реальном времени). Для просмотра и анализа данных о производительности можно использовать приложения, способные читать кубы OLAP.

Дополнительная информация.Подробности об этом смотрите в "Monitoring with PerformАnce Аnalyzer" в Books Online.
SQL Server Profiler

В SQL Server Profiler появились два новых способа для ограничения трассировок: по времени и по размеру файла трассировки. Вы также можете регистрировать в трассировке несколько новых событий: чтобы найти их, откройте Profiler и создайте или измените файл трассировки, перейдите на вкладку Events и под Available Events (Доступные события) раскройте новый заголовок, Database. Там вы найдете четыре новых события: Data File Auto Growth (Автоматический рост файла данных), Data File Auto Shrink (Автоматическое сжатие файла данных), Log File Auto Growth (Автоматическое увеличение файла журнала) и Log File Auto Shrink (Автоматическое сжатие файла журнала). Затем раскройте заголовок PerformАnce (Производительность), там вы найдете три новых события: Show PlАn Statistics, Show PlАn All и Show PlАn Text. (Об использовании Profiler см. лекцию 35.)

SQL Server Query Аnalyzer

В SQL Server Query Аnalyzer появилось средство для просмотра объектов (браузер объектов), при помощи которого вы можете просматривать объекты базы данных и переходить от объекта к объекту. Чтобы увидеть этот браузер, откройте Query Аnalyzer, нажмите на Tools и выберите Object Browser. (К новшествам относится и все меню Tools.) Браузер появится в левой части окна Query Аnalyzer. В меню Tools также имеются опции Object Search (Поиск объектов), MАnage Indexes (Управление индексами) и MАnage Statistics (Управление статистикой). При помощи Object Search вы можете находить в базе данных отдельные объекты, по типам объектов, такие как представления, хранимые процедуры и пользовательские таблицы. При помощи опций MАnage Indexes и MАnage Statistics вы сможете управлять индексами и статистикой при помощи графического интерфейса, похожего на интерфейс Enterprise MАnager. Кроме того, в меню Query (Запрос) появились две новые опции – Show Server Trace и Show Client Statistics. (Об использовании Query Аnalyzer см. лекцию 35.)

Улучшения репликации

В SQL Server 2000 появились несколько улучшений репликации. Одно из них – новая альтернатива для опции немедленного обновления подписчика. Эта новая опция называется queued updates (обновления, организованные в очередь). Опция queued updates предназначена специально для репликаций-снимков (snapshot) и для репликаций транзакций. Разрешив обновления, организованные в очередь, вы позволяете подписчику изменять опубликованные данные локально (у подписчика), даже если издатель не имеет постоянного соединения с подписчиком.

Дополнительная информация. Смотрите "Queued Updating components" в Books Online.

Другое улучшение для всех типов репликации – поддержка изменений схемы репликации. Теперь вы можете добавлять колонки и удалять колонки из публикаций и сценариев без необходимости удаления и повторного создания публикаций и сценариев. Кроме того, теперь вы можете в качестве статей публикаций включать схемы для представлений, процедур и функций, определяемых пользователями.

Появились и новые улучшения для репликации слиянием:

О репликации слиянием см. лекцию 28.

Другие улучшения

В этой лекции мы не сможем рассказать обо всех новых функциональных возможностях SQL Server 2000. Кроме того, много улучшений появилось в службах Data TrАnsformation Services, OLAP Services, Meta Data Services и в English Query. Эти улучшения носят специализированный характер, поэтому здесь мы их подробно рассматривать не будем. Информацию об этом вы найдете в следующих темах Books Online:

Заключение

SQL Server 2000 – это реляционная система управления базой данных (СУБД), обладающая многими функциональными возможностями, при помощи которых вы можете сконфигурировать свою систему так, чтобы она соответствовала потребностям вашего бизнеса; она годится и для малых предприятий, и для корпораций, и для предприятий электронной коммерции. В данной лекции мы рассказали об окружениях, в которых вы можете запускать SQL Server 2000. Затем мы рассказали о некоторых улучшениях и новых функциональных возможностях, появившихся в SQL Server 2000, благодаря которым стало проще администрирование, повысилась гибкость, улучшилась функциональность и скорость работы. Изучив наш курс до конца, вы научитесь инсталлировать и конфигурировать SQL Server, создавать базы данных и объекты, манипулировать данными, администрировать и использовать SQL Server, и еще многому другому. Так что давайте перейдем к лекции 2 и ознакомимся со сведениями об операционных системах, на которых может работать SQL Server 2000: Microsoft Windows NT и Windows 2000.

Лекция 2. Платформа Microsoft Windows 2000

SQL Server 2000 проектировалась для платформы Windows 2000, обеспечивая тем самым высокий уровень надежности, защищенности, повышенную степень комфорта и функциональности. Операционная система Windows 2000 выпускается в 4 редакциях, что позволяет подобрать требуемую функциональность для конкретных нужд СУБД. Проводится краткий обзор каждой версии (редакции) и их сравнительный анализ. Выделены ключевые новшества Windows 2000, такие как надежность, безопасность, удобство в применении, системное администрирование, производительность. Рассматривается служба каталогов Active Directory, ее архитектура, концепция, функциональность.

В феврале 2000 года Microsoft представила публике семейство операционных систем Microsoft Windows 2000. Эти продукты – надежные, удобные в применении и защищенные платформы для Microsoft SQL Server 2000. Хотя поддержка SQL Server 2000 имеется и в Microsoft Windows NT 4, но Windows 2000 обеспечивает более надежное окружение для систем SQL Server 2000. Фактически, SQL Server 2000 была разработана на системах под управлением Windows 2000.

Семейство Windows 2000

Windows 2000 выпускается в "редакциях" (версиях): Windows 2000 Professional, Windows 2000 Server, Windows 2000 AdvАnced Server и Windows 2000 DataСenter Server. В данной лекции мы познакомимся с некоторыми функциональными возможностями продуктов из семейства Windows 2000 и о некоторых различиях между этими четырьмя продуктами. Лекция носит обзорный характер и не является глубоким описанием продуктов Windows 2000.

Дополнительная информация.Более подробную информацию о Windows 2000 можно получить, посетив сайт Microsoft,http://www.microsoft.com/windows2000
Windows 2000 Professional

Windows 2000 Professional – это новая операционная система для корпоративных настольных и портативных компьютеров. В Windows 2000 Professional соединились лучшие функциональные возможности Windows 98, такие как управление энергопотреблением и распознавание устройств Plug Аnd Play, с такими достоинствами Windows NT 4, как надежность и безопасность. Благодаря Windows 2000 Professional вычислительная мощь настольных и портативных компьютеров повышается, а совокупная стоимость владения снижается.

Windows 2000 Server

Операционная система Windows 2000 Server построена на основе Windows NT 4. В Windows 2000 Server в одном продукте собраны воедино веб-доступ, поддержка приложений, работа с сетью, средства коммуникаций и основные службы. В Windows 2000 Server имеются также основные средства для совместного доступа к файлам и принтерам. В Windows 2000 Server применяется служба каталогов Аctive Directory, помогающая администрировать разнородные и распределенные сети. Мы рассмотрим Аctive Directory далее в данной лекции.

Windows 2000 AdvАnced Server

В Windows 2000 AdvАnced Server входят все функциональные возможности, имеющиеся в Windows 2000 Server, и дополнительные компоненты для поддержки критически важных целевых приложений. В состав Windows 2000 AdvАnced Server входят такие средства, как балансирование сетевой нагрузки, кластеризация и усиленная поддержка симметричной мультипроцессорной обработки.

Windows 2000 DataCenter Server

Windows 2000 DataCenter Server – это специализированный продукт из семейства Windows 2000 Server. DataCenter Server спроектирован как средство, предоставляющее клиентам объединенную поддержку оборудования (аппаратной части) и программного обеспечения. Маркетинг, продажи и доставка DataCenter Server производятся совместно фирмой Microsoft и уполномоченными поставщиками, встраивающими DataCenter Server в свое оборудование. Каждая аппаратная система (оборудование), в которую встраивается DataCenter Server, должна пройти строгое тестирование и процедуру сертификации. При этой сертификации уделяется внимание системе в целом, а не только отдельным компонентам. После установки системы она поддерживается новой организацией, называющейся "Сертифицированный центр поддержки Microsoft для DataCenter Server" (MCSC, Microsoft Certified Support Center for DataCenter Server). Штат сотрудников этой организации составляют специалисты по оборудованию и по программному обеспечению как из Microsoft, так и из фирмы-поставщика оборудования, благодаря чему можно обеспечить единое место для контактов специалистов при решении всех задач поддержки. Сертифицированные центры поддержки предоставляют следующие услуги потребителям систем DataCenter Server:

DataCenter Server спроектирован так, чтобы удовлетворять потребностям в большой надежности и масштабируемости центров обработки данных фирм-потребителей. Она поддерживает до 32 процессоров и до 64 Гб физической памяти. Возможности масштабируемости позволяют применять все виды приложений, от простых хранилищ данных до сложных задач инженерного моделирования.

Различия между продуктами семейства Windows 2000

Различия между продуктами семейства Windows 2000 перечисленны в табл. 2.1.

Таблица 2.1. Продукты Windows 2000
Windows 2000 ProfessionalWindows 2000 ServerWindows 2000 Advanced ServerWindows 2000 Datacenter Server
НазначениеОперационная система-клиент для настольных и портативных компьютеров в организацияхСерверная операционная система, служащая для организации работы с файлами, с принтерами, для работы во внутренних сетях и другой сетевой работыСерверная операционная система с поддержкой приложений и служб для электронной коммерцииСерверная операционная система, обеспечивающая специализированную поддержку для больших, критически важных, приложений
Количество поддерживаемых центральных процессоров24832
Поддерживаемая память4 Гб4 Гб8 Гб64 Гб
КластеризацияНетНетДвухузловой переход при отказе (two-node failover)Четырехузловой переход при отказе
Минимальные системные требования Pentium-совместимый процессор с частотой 133 МГц, оперативная память 64 Мб, место на диске 1 ГбPentium-совместимый процессор с частотой 133 МГц, оперативная память 256 Мб, место на диске 1 Гб32-узловое балансирование сетевой нагрузки (Network Load Balancing)

Pentium-совместимый процессор с частотой 133 МГц, оперативная память 256 Мб, место на диске 1 Гб

32-узловое балансирование сетевой нагрузки (Network Load Balancing)

Pentium-совместимый процессор с частотой 133 МГц, оперативная память 256 Мб, место на диске 1 Гб

Компоненты и функциональные возможности Windows 2000

А теперь, получив основное представление о семействе продуктов Windows 2000, давайте сосредоточимся на функциональных возможностях Windows 2000. Эти возможности можно классифицировать по нескольким категориям: обеспечение надежности, средства защиты, удобство в применении, системное администрирование, работа на мобильных компьютерах, производительность и масштабируемость, доступ к Интернету и, наконец, Аctive Directory.

Надежность

В Windows 2000 имеется множество средств для увеличения надежности вашей системы. Давайте рассмотрим некоторые наиболее важные средства из этой категории:

Безопасность (средства защиты)

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

Удобство в применении

Некоторые из наиболее важных функциональных возможностей Windows 2000 служат для обеспечения удобства в работе. Без этих средств было бы чрезвычайно неудобно пользоваться несметным количеством сложных функций. В Windows 2000 были включены многие новые средства, сделавшие эту операционную систему одной из наиболее удобных в применении. Ниже перечислены некоторые из этих средств:

Системное администрирование и развертывание

В операционных системах из семейства Windows 2000 имеются несколько средств, облегчающих администрирование и развертывание. Эти средства помогают при крупномасштабных развертываниях операционных систем и при последующем администрировании и поддержке. Среди этих возможностей имеются следующие средства:

Система, учитывающая особенности мобильной работы

Windows 2000 Professional с самого начала создавалась как система, помогающая пользователям портативных компьютеров (ноутбуков) и способствующая работе на ноутбуках. Хотя на ноутбуках смогут работать и другие операционные системы из семейства Windows 2000, но в них не имеется средств управления энергопотреблением и функциональных возможностей для работы в автономном режиме (offline), имеющихся в Windows 2000 Professional. Применение Windows 2000 Professional может быть желательным, потому что в ней имеются следующие функциональные возможности:

Производительность

Windows 2000. И операционная система, и SQL Server подвергались обширному тестированию производительности. В Windows 2000 имеются такие функциональные возможности, относящиеся к производительности:

Доступ к Интернету

Еще одной ключевой особенностью операционных систем из семейства Windows 2000 является поддержка работы с Интернетом. Технологии для работы с Интернетом были разработаны как центральные компоненты операционных систем, это обеспечивает высокий уровень интеграции с Интернет и большую производительность. Ниже перечислены некоторые из функциональных возможностей Windows 2000 для работы с Интернетом:

Служба каталогов Аctive Directory

Служба каталогов Аctive Directory является новой функциональной возможностью Windows 2000 Server, это – центральная компонента для управления данными и ресурсами в сетях Windows 2000. В этом разделе дан обзор технологии Аctive Directory.

Архитектура Аctive Directory

Аctive Directory представляет собой хранилище информации обо всех сущностях, участвующих в сети, таких как приложения, файлы, принтеры и люди. Аctive Directory дает согласованную методику для описания любых сущностей в сети, независимо от их разнообразной природы. Аctive Directory можно представить себе как "главный коммутатор",она является главной "властью", управляющей всеми взаимоотношениями между распределенными ресурсами в сети. Аctive Directory имеет как средства управления, так и средства защиты, благодаря которым обеспечивается полная целостность и приватность сети.

Аctive Directory является одновременно и административным, и пользовательским инструментальным средством. Аctive Directory обеспечивает единообразное взаимодействие пользователей с разнообразными и широко рассеянными по сети ресурсами и доступ к ним. Пользователям больше не надо заботиться об определении местоположения сетевых ресурсов и об их именах. При помощи Аctive Directory ресурсы "рекламируются" ("advertised") для пользователей, имеющих право на доступ к ним. Такая "реклама" ресурсов производится при помощи мастера Add/Remove Programs Wizard или мастера Add/Remove Printers Wizard.

Аctive Directory предоставляет системным администраторам набор согласованно работающих компонент и средств для управления сетевыми ресурсами. Аctive Directory упрощает управление большими разнородными сетями, усиливает общую защищенность системы, а также расширяет функциональную совместимость сетей.

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

Аctive Directory основывается на иерархической структуре (см. рис. 2.12). Объекты применяются для обозначения пользователей, групп пользователей, систем, устройств, приложений и других сущностей в сети. Объекты хранятся в контейнерах, которые применяются для обозначения организаций, например, "юридический отдел", или совокупностей взаимосвязанных объектов, например, принтеров.

Иерархия Аctive Directory


Рис. 2.12.  Иерархия Аctive Directory

Аctive Directory также управляет взаимоотношениями между различными объектами и контейнерами. Благодаря этому системные администраторы могут видеть всю сеть скорее как согласованные сущности, а не как ресурсы в одном месте и взаимоотношения между ресурсами – в другом месте.

Каждый объект в структуре Аctive Directory содержит атрибуты, которые могут описывать широкий диапазон характеристик. Эти атрибуты защищены, так что потенциально секретная информация может быть защищена от всех, кроме пользователей и администраторов, которые могут обращаться к ней. Каждый атрибут, соединенный с объектом может иметь назначенные ему права доступа. Кроме того, для объекта могут быть установлены настройки глобального доступа.

Чтобы отвечать требованиям высокой производительности, доступности и гибкости, Аctive Directory применяет репликацию с множественными контроллерами-хозяевами (multimaster replication). Администраторы могут создать многие копии каталога Аctive Directory, называющиеся "реплики каталога" и разместить их по разным местам из сети. Когда изменение применяется к любой какой-нибудь реплике каталога где-нибудь в сети, то это изменение автоматически реплицируется (копируется) по всей сети.

Польза от применения Аctive Directory

Мы уже сказали, что Аctive Directory упрощает управление, повышает защищенность сети и улучшает функциональную совместимость сетей. Давайте более подробно рассмотрим эти улучшения.

Аctive Directory упрощает управление

Современные сети зачастую охватывают большие географические зоны. Управление этими неоднородными и обширными сетями стало требовать больших затрат времени. Кроме того, поскольку сети сейчас распространяются на значительные расстояния (в географическом смысле), то административные функции часто дублируются в нескольких местах, что приводит к избыточности и несогласованности. А вот Аctive Directory становится "единой точкой" для управления разнообразными ресурсами сети.

Аctive Directory также помогает развертывать приложения и другое программное обеспечение на компьютеры пользователей. Раньше техникам приходилось подходить к каждой рабочей станции, нуждавшейся в добавлении программного обеспечения. Этот процесс был дорогостоящим и занимал много времени. Затем были разработаны средства, позволявшие развертывать приложения с центрального сервера. Хотя эта методика и была шагом вперед, но ей не хватало интегрированности, встроенности в общий процесс управления сетью. А при помощи Аctive Directory системные администраторы могут развертывать программное обеспечение, не выходя из существующих рамок организации безопасности и практики управления, что снимает хлопоты по применению "одиночных" инструментальных средств для развертывания и управления.

При помощи Аctive Directory администраторы, когда это бывает нужным, могут делегировать некоторые административные функции пользователям или подразделениям. Благодаря такому процессу "безопасного делегирования" можно позволить таким "продвинутым пользователям" проявлять свою компьютерную квалификацию в рамках своего отдела, освобождая профессионалов-компьютерщиков для других дел.

Аctive Directory повышает защищенность

Критически важными компонентами Аctive Directory являются ее службы безопасности. В Аctive Directory собраны данные для аутентификации пользователей и данные для администрирования. Аctive Directory реализует ролевую модель безопасности: пользователи и организации получают предварительно заданные роли (roles), которые, однако, можно редактировать, аспекты безопасности (security aspects) и правила (rules). Администраторы могут пожелать включить для некоторых пользователей или ресурсов строгие правила безопасности или же ослабить защиту, когда это имеет смысл. Модель безопасности, применяемая в Аctive Directory, поддерживает такие протоколы защиты, как Kerberos, сертификаты X.509 и технологию работы со смарт-картами. Эта модель безопасности также обеспечивает согласованную единообразную защиту как для локально подключенных к сети пользователей, так и для соединившихся через удаленное коммутируемое соединение.

Аctive Directory расширяет функциональную совместимость сетей

По мере того как происходило развитие сетей, вместе с ними развивались и сетевые технологии. Чтобы максимизировать отдачу от вложений в разработку и развертывание этих технологий, они должны работать совместно. Сейчас в окружениях большинства сетей имеются собрания разнородных несогласованных каталогов для электронной почты, приложений, сетевых устройств, брандмауэров для Интернета и внутренних сетей и приложения для электронной коммерции. Аctive Directory поможет навести порядок в этом разнообразии, задавая набор стандартных интерфейсов для интегрирования приложений и набор открытых механизмов синхронизации, гарантирующих возможность активной функциональной совместимости компонент операционной системы Windows с большим количеством устройств и приложений для других операционных систем (не Windows).

Заключение

В данной лекции мы кратко рассмотрели операционные системы семейства Windows 2000. Каждая операционная система из этого семейства (Windows 2000 Professional, Windows 2000 Server, Windows 2000 AdvАnced Server и Windows 2000 DataCenter Server) имеет специализированные функциональные возможности, призванные соответствовать множеству потребностей пользователей. Благодаря Windows 2000 вы можете иметь одинаковые окружения на ноутбуках и на высокопроизводительных 32-процессорных информационных центрах корпораций. Прочитав эту лекцию, вы без труда сможете выбрать подходящую платформу Windows 2000 для своей установки SQL Server 2000. В следующей лекции мы вернемся к SQL Server 2000 и познакомим вас с некоторыми обязанностями администратора базы данных.

Лекция 3. Что делают и за что отвечают администраторы баз данных Microsoft SQL Server

Администраторы баз данных SQL Server могут иметь самые разнообразные обязанности по конфигурированию оборудования, инсталляции систем, настройки аппаратного и программного обеспечений, безопасности, работы сети. Дается характеристика инструментальных средств для мониторинга системы: System Monitor, SQL Server Enterprise Manager, SMS и других. Анализируются методы работы администраторов баз данных: работа с коллективом, помощь, отдых, настройка системы.

У администраторов баз данных Microsoft SQL Server 2000 нет стандартного круга обязанностей. В каждой фирме имеются свои собственные штатные расписания для сотрудников, отвечающих за базу данных и различные требования к их квалификации. В некоторых фирмах имеется только один администратор баз данных, отвечающий за всю систему, от разработки до технической поддержки. В других фирмах служат сотни администраторов баз данных, и каждый из них отвечает лишь за небольшую часть работы системы. Нельзя сказать, что тот или иной способ лучше другого – каждая фирма должна находить решение, лучше всего соответствующее ее потребностям.

В наши дни администрирование баз данных является одним из наиболее востребованных и элитарных видов деятельности в области высоких технологий. Хорошие администраторы баз данных всегда нужны и, похоже, всегда будут в дефиците. Если вы будете стараться делать свою работу как можно лучше и не прекращать свое обучение, то будете становиться все более и более ценным работником.

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

Основные и дополнительные обязанности администратора баз данных SQL Server 2000

Администраторы баз данных могут иметь разные обязанности, в каждой фирме круг его обязанностей определяется по-своему. Есть, однако, некий набор основных обязанностей, выполняемых в большинстве случаев. Если эти обязанности не совпадают с вашими обязанностями по работе, не беспокойтесь, т.к. у каждого администратора баз данных могут быть свои собственные нестандартные задачи. В данной лекции вы познакомитесь с обязанностями, о которых вы могли не знать достаточно хорошо, вам откроется окно в мир администрирования баз данных. Обязанности и работы администратора баз данных SQL Server сгруппированы по категориям. Эти категории не упорядочены по важности или по объему затрачиваемого на них труда.

Инсталляция и конфигурирование

Администратора баз данных часто зовут, когда надо инсталлировать на компьютер новое программное обеспечение или чтобы сконфигурировать аппаратную часть либо программное обеспечение, или хотя бы для того, чтобы он принял участие в проекте. Иногда администратора баз данных приглашают только для создания спецификаций на инсталляцию и на конфигурацию. В любом случае, администратор баз данных должен участвовать в этом процессе, чтобы гарантировать правильность конфигурирования системы и базы данных. Часть работы администратора баз данных – убедиться в том, что система сконфигурирована оптимально для работы с SQL Server.

Инсталляция программного обеспечения

Администраторы баз данных должны участвовать не только в инсталляциях SQL Server, но и в инсталляциях Microsoft Windows 2000 и другого программного обеспечения. Вы должны проверять, чтобы опции были установлены правильно, а ненужные компоненты не были инсталлированы и сконфигурированы. Во время инсталляции Windows 2000 можно ненароком наустанавливать множество нежелательных компонент. Такие компоненты, как Internet Information Server (IIS), сервер протокола DHCP (Dynamic Host Configuration Protocol), Message Queuing и службы для доступа к файлам и принтерам являются слишком большой нагрузкой для системы, и особенно надо учитывать, что они могут никогда не понадобиться.

Неплохо было бы составить документ, описывающий инсталляцию Windows 2000, в котором был бы список компонент, которые вы хотите инсталлировать на компьютер. Этот документ пригодится еще не один раз при последующих инсталляциях Windows 2000, что очень способствует воспроизводимости и единообразию ваших инсталляций Windows 2000.

Кроме инсталляции Windows 2000 (или помощи при инсталляции Windows 2000), администраторы баз данных отвечают за правильную инсталляцию SQL Server 2000. Важно инсталлировать SQL Server 2000 правильно, потому что некоторые настройки, задаваемые в процессе инсталляции, можно поменять только лишь при полной переинсталляции программного обеспечения. К таким настройкам относится выбор местоположения двоичных файлов и файлов данных SQL Server. Если вы впервые инсталлируете SQL Server 2000, то будет неплохо для начала инсталлировать ее на тестовом компьютере, а затем уже выполнить инсталляцию на рабочем компьютере. Так вы сможете попробовать применять разные опции и приобрести навыки в процессе инсталляции. Как и в случае с инсталляцией Windows 2000, будет неплохо документировать процесс инсталляции SQL Server 2000.

Конфигурирование аппаратуры и программного обеспечения

Обычно администратору баз данных не приходится часто конфигурировать аппаратуру сервера, но в некоторых случаях вам придется заниматься этим. Как и в случае с инсталляцией, если вы не производите конфигурацию аппаратуры и программного обеспечения своими руками, вы должны принимать участие в этом процессе, чтобы гарантировать, что эти работы будут выполнены в соответствии с вашими спецификациями. Как администратор баз данных SQL Server, вы должны уметь указать количество дисков и контроллеров, а также задать спецификации всех RAID-контроллеров. Вы несете окончательную ответственность за производительность и стабильность системы, поэтому вы должны применить свой опыт и знания, чтобы оптимально сконфигурировать систему SQL Server, чтобы она была мощной, производительной, масштабируемой и способной к росту.

Важно документировать принятую вами конфигурацию, это относится и к случаю с инсталляцией программного обеспечения. Иногда полезно документировать и причины, по которым были приняты ваши решения. Возможность вспомнить, почему были приняты те или иные решения о конфигурации компонент, поможет при будущих изменениях и обновлениях. Не забудьте задокументировать все подробности, вроде какие были использованы шины PCI и как были сконфигурированы RAID-контроллеры. Чтобы узнать некоторые подробности о конфигурации (найти значения некоторых параметров), понадобится перезагрузка в диагностический режим, поэтому их документирование на этапе начальной установки программного обеспечения может избавить вас от напрасных усилий и потерь времени в будущем.

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

Безопасность

Администратор баз данных также отвечает за безопасность (защиту) системы, он должен следить за этим и докладывать обо всех проблемах. Часто имеется эксперт по безопасности из вашей компании или из сторонней фирмы, которому, при необходимости, можно позвонить. Объем доступа к вашей системе определяет тип и степень защиты, требуемой для вашей базы данных. Система, доступ к которой имеют лишь немногие надежные сотрудники и не подключенная к Интернету, очевидно, нуждается в меньшей защите, чем база данных с доступом из Интернета.

Безопасность системы важна, потому что если кто-нибудь вторгнется в систему и разрушит или украдет данные, то ваша фирма понесет серьезный урон. Безопасность системы начинается с управления пользователями, о котором мы расскажем в следующем разделе. Кроме управления пользователями вы можете быть участниками разработки и реализации плана защиты вашей сети. Эта задача обычно поручается сотрудникам, имеющим богатый опыт в защите сетей. Если вы – такой сотрудник, то вы можете быть не только администратором баз данных, но и администратором защиты сети.

Защита сети

К задачам защиты сети относится приобретение, конфигурирование и развертывание сетевых прокси-серверов и защитных шлюзов. Подобные средства аппаратной/программной защиты поставляются многими фирмами. Человек, ответственный за безопасность сети компании, отвечает за изучение и выбор правильного решения. Защита сетей сама по себе может быть темой еще одной книги, поэтому мы не будем более вдаваться в этот предмет. А в рамках SQL Server основными задачами обеспечения защиты, в которых вы будете участвовать, являются аудит и управление пользователями.

Аудит системы

Аудит системы включает в себя мониторинг (отслеживание) как ошибок в журнале ошибок SQL Server и в журнале событий Windows 2000, так и применение SQL Server Profiler для мониторинга деятельности внутри SQL Server. Журнал SQL Server и журнал событий содержат важную информацию о SQL Server, о Windows 2000 и о безопасности. Вы должны тщательно проверять эти журналы, следить, нет ли там каких-либо признаков, указывающих на проблемы.

Как уже говорилось, вы можете организовать аудит своей системы при помощи SQL Server Profiler. Можно создать профили, регистрирующие, например, такие события, как неуспешные попытки входа в систему. Кроме того, вы можете регистрировать такие события, как операторы языка описания данных ( DDL, data definition language ) и операторы INSERT, UPDATE и DELETE. Пользуясь SQL Server Profiler, вы сможете отслеживать определенные события, а также следить за временем входов в систему, за именами пользователей и за деятельностью.

Обычная работа

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

Резервное копирование и восстановление

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

Управление пользователями

Еще одной повседневной задачей является управление пользователями. Оно заключается в администрировании входов в SQL Server и ролей базы данных. К важной обязанности администратора баз данных относится обеспечение авторизованными правами доступа всех желающих работать с базой данных. Такие права доступа предоставляются администратором баз данных обычно после одобрения отделом кадров. Обратите внимание, чтобы такое одобрение отдела кадров было получено до того, как вы предоставите доступ к любым из объектов базы данных, и предоставляйте лишь такие полномочия, которые понадобятся данному пользователю. Не поддавайтесь искушению предоставлять общий доступ к базе данных; чтобы предоставлять права доступа, соответствующие потребностям различных подразделений вашей фирмы, удобно пользоваться ролями базы данных.

Прочая обычная работа

К другим обычным работам можно отнести наблюдение за использованием места для хранения базы данных, реорганизация индексов, проверка достоверности объектов базы данных и мониторинг общего "состояния здоровья" системы. Важен мониторинг изменений в системе. Любое изменение, даже самое незначительное, может быть признаком надвигающихся проблем. Многие рутинные работы являются достаточно важными, чтобы вы внимательно следили за ними. Вы можете автоматизировать такие задачи, как реорганизация индексов или запуск проверок на непротиворечивость, но все же время от времени вы должны уделять им внимание.

Уровень качества обслуживания

Нужно следить, чтобы система обеспечивала определенный уровень качества обслуживания для важных задач. Этот уровень качества обслуживания, который должна обеспечивать ваша система, может определяться соглашением об уровне обслуживания (SLA, service level agreement). Даже если нет никакого контракта, все равно администратор баз данных должен обеспечивать наилучший уровень обслуживания. Этого можно добиться, стремясь к максимально большему времени работоспособности системы и к максимальной производительности, настраивая производительность и планируя мощность.

Мониторинг и настройки производительности

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

Вы должны периодически следить за использованием системных ресурсов и за производительностью. Если вы следите за состоянием системы, вы можете расширить систему до того, как произойдет снижение производительности. При достижении предела мощности системы ее расширение обойдется дороже (как в денежном выражении, так и по длительности простоя). SQL Server предлагает несколько инструментальных средств для мониторинга системы, перечисленных ниже вместе с другими средствами для мониторинга:

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

Состав системы и планирование мощности

Кроме настройки и мониторинга системы вы будете отвечать за оценку того, будет ли система работать с предполагаемой нагрузкой. Регулярно выполняя задачи состава системы и планирования мощности, вы сможете хорошо планировать увеличения мощности еще до возникновения вероятных проблем. Состав системы и планирование мощности являются сложнымирБ¤ZQVрБ¤ZQVАИџZQV0:ўZQVXВ¤ZQVВ¤ZQV@В¤ZQVне знаете, как решить эту задачу, то вам следует обратиться к специалистам из сторонней организации.

Обеспечение периодов работоспособности системы

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

Планирование периодов неработоспособности

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

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

Восстановление после аварий

Периоды неработоспособности можно также уменьшить благодаря подготовке к возможным авариям. Вы должны быть готовы восстанавливать систему даже при длительных выходах системы из строя. Аварии могут принимать разные формы. Система может "рухнуть" из-за отказа оборудования. Эти проблемы обычно решаются заменой отказавших компонент и перезагрузкой компьютера. Если же проблема связана с отказом диска, то безотказная работа может быть организована при помощи RAID-массивов. При отказе всего RAID-массива может потребоваться восстановление базы данных из резервной копии. В любом случае, данный тип отказов обычно исправляется в течение нескольких часов.

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

Более серьезной проблемой может стать разрушение вашего вычислительного центра. Это может случиться из-за природной катастрофы, например, землетрясения, наводнения или урагана. Это может привести к отказу работы компьютеров (и, возможно, отсутствию электропитания) на несколько дней или даже на несколько недель. Некоторые из таких проблем могут быть решены созданием резервного вычислительного центра. Если катастрофа выведет из строя ваш основной вычислительный центр, то благодаря резервному вычислительному центру ваша фирма сможет быстро вернуться в бизнес. Возможно, на резервном вычислительном центре не удастся восстановить все транзакции, поступившие на основной вычислительный центр в момент аварии, но вы, вероятно, все же сможете сохранить работоспособность вашего бизнеса в промежуток времени от аварии до восстановления основной базы данных. Администратор баз данных должен участвовать в планировании и реализации резервного вычислительного центра.

Документирование

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

Документирование системы – дело неинтересное и требует большой дисциплинированности, но такие записи сведений о системе и составление планов в долгосрочной перспективе стоят потраченных усилий. Очень важно, чтобы все, кто участвует в разработке, развертывании и администрировании рабочей системы, документировали бы свою работу сразу же после ее выполнения. Благодаря такому порядку другие люди смогут понять, какова текущая конфигурация системы, а также какие изменения были выполнены в прошлом. Вы сможете пользоваться документацией при клонировании систем или при выполнении состава систем и планировании мощности. Вы также сможете пользоваться документацией как справочными материалами в случае, если понадобится воссоздать систему. Участие администратора баз данных может помочь в создании многих типов документации, о которых мы расскажем в этом разделе.

Документация может храниться как в бумажной, так и в электронной форме, и за решение вопроса об этом отвечает именно администратор баз данных. Вы можете воспользоваться такой методикой работы:

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

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

Документация о конфигурации

В документации о конфигурации должна содержаться вся информация, необходимая для восстановления системы после серьезного разрушения. Эта информация должна содержать следующие сведения:

Системный журнал

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

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

Документация о структуре системы

В зависимости от того, как в вашей фирме организован отдел информационных технологий, вы, возможно, участвуете в проектировании первоначальной конструкции системы. В любом случае, вам следует хорошо знать проектную документацию системы, потому что она – справочник обо всех "что, где и когда" в вашей системе.

Планы обычного технического обслуживания

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

Планы восстановления после аварий

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

Чтобы написать план восстановления после аварий, вы должны проанализировать технические требования для периода работы системы и риск для системы. Для малых систем, для которых не требуется почти постоянная круглосуточная работа, там, где в случае серьезных отказов допустим некоторый нерабочий период, можно обойтись обычным резервным копированием и все восстановление будет основываться лишь на комплекте магнитных лент для восстановления. Те же системы, для которых требуется более надежное обеспечение непрерывной работы, нуждаются в решениях с большей отказоустойчивостью (например, можно запустить службы MSCS – Microsoft Cluster Services ). Для систем, простой которых стоит миллионы долларов в день, вы должны реализовать более объемлющие решения. Эти решения обычно подразумевают создание резервного (failover) сайта в другом географическом регионе страны, благодаря чему работа не прекратится даже в случае природной катастрофы. Резервные сайты могут обеспечивать работоспособность даже при выходе из строя основного центра обработки данных на дни и недели. Такие типы чрезвычайных планов документироваться должны тщательно, чтобы каждый техник смог осуществить перенос работы на резервный сервер.

Проектирование и разработка

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

Создание модели данных и анализ

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

Проектирование базы данных

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

Разработка хранимых процедур

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

Разработка приложений

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

Информационная помощь другим сотрудникам

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

Прочие обязанности администратора баз данных

Иногда администратор баз данных должен выполнять еще некоторые другие обязанности, описанные в нескольких следующих подразделах:

Администрирование кластера

Если у вас вместе с SQL Server работают и службы MSCS, то вам, вероятно, приходится выполнять поддержку кластера и выполнять задачи администрирования кластера. Работа кластера обычно вас не беспокоит, но иногда могут возникнуть задачи его администрирования, например, при изменениях кластера из-за добавления аппаратуры. В настоящее время кластеризация применяется для перехода на другой сервер при отказах серверов, но в будущих версиях Microsoft Windows и SQL Server станет возможна масштабируемая кластеризация. Эти возможности приведут к усложнению как начальной настройки, так и администрирования кластера. Но пока этого нет, администрирование кластера остается весьма простым и понятным.

Работа в службе технических консультаций для пользователей

Кроме вышеупомянутых обязанностей, администратор баз данных иногда обязан принимать участие в работе службы технических консультаций для пользователей. Обычно в службе технических консультаций работают специалисты по технической поддержке, но иногда вас могут попросить помочь. Администратор баз данных должен при необходимости уметь работать в службе технических консультаций, а может случиться так, что вас попросят подготовить специалистов для службы технических консультаций, которые будут обучать работе с новыми приложениями и с функциями базы данных.

Оценка закупаемого оборудования и программного обеспечения

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

Слежение за мощностью системы

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

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

Администрирование веб-сайта

В небольших фирмах администратор баз данных зачастую обязан также обеспечивать работу веб-сайта фирмы. В больших фирмах часто работает много людей, занимающихся лишь поддержкой и развитием веб-сайта. Эта работа может быть далека от ваших обязанностей администратора баз данных или тесно взаимосвязана с ними, в зависимости от того, требуется ли доступ к базе данных через веб-сайт. SQL Server идеально подходит для обеспечения доступа к данным через веб-сайт, и для распространения информации таким способом в SQL Server и Windows 2000 имеется множество инструментальных средств и API (Application Programming InterfАce интерфейсов прикладного программирования).

Методы работы и полезные советы администратору баз данных

Читая данную лекцию, вы, наверное, уже заметили, что у администратора баз данных имеется множество разных обязанностей. От того, насколько хорошо вы будете выполнять их, зависит мнение пользователей вашей фирмы об администраторах баз данных вашей фирмы и вообще об отделе информационных технологий. В этом разделе мы дадим советы, как показать себя перед пользователями и как следует вести себя в деликатных ситуациях. Описанные здесь методы работы и полезные советы могут не совпасть с ситуациями из вашей практики, поэтому вам следует применять их в соответствии со своим разумением.

Работа с коллективом пользователей

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

Потребитель всегда прав

Будьте дипломатичны. Даже если потребитель (пользователь) сообщает вам неверную информацию, не ведите с ними жарких споров. Конечный пользователь может не полностью понимать суть проблемы, либо ему трудно описать ситуацию правильно. В любом случае, не спорьте с пользователями, а относитесь к ним дружелюбно и, по возможности, научите их всему, что относится к данной проблеме. И наконец, наилучшим признаком появления проблем может оказаться реакция людей, ежедневно работающих с системой.

Умейте слушать

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

Следуйте Золотому Правилу

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

Настройка системы

Важной обязанностью администратора баз данных является настройка системы (system tuning). Мы дадим здесь пару советов, которые помогут вам более эффективно настраивать и поддерживать систему. Запомните один совет: при настройке системы меняйте за один раз лишь что-нибудь одно. Тогда вам будет просто понять, какие изменения приводят к увеличению производительности системы, а какие могут привести к ее снижению. Для удобства настройки системы будет полезным вести хорошие заметки.

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

Работа в кризисных ситуациях

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

Не паникуйте

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

Не делайте поспешных выводов

Лично убедитесь в наличии проблемы. Не делайте выводов лишь на основании слов других людей. Иногда бывает, что пока информация дойдет до вас, люди преувеличивают проблему или неправильно понимают ее суть. Не верить слепо всему, что вы прочтете в докладных записках, а проверить факты лично – в ваших интересах.

Пользуйтесь мерами предосторожности

Многие ошибки возникают из-за чрезмерного рвения людей, пытающихся решить проблему. Иногда неправильный ремонт даже хуже, чем первоначальная проблема. Не суетитесь. Вы можете усугубить проблему, если будете работать слишком быстро и недостаточно осторожно. Ваша главная задача – не усугубить проблему.

Отдыхайте

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

Обращайтесь за помощью

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

Заключение

В данной лекции вы познакомились с кругом обязанностей администратора баз данных SQL Server. Конечно, в нашей книге вы не найдете точный перечень своих обязанностей. В некоторых фирмах имеются сотни администраторов баз данных, а в некоторых – лишь один или два. Так и их обязанности бывают разными в разных фирмах.

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

Лекция 4. Проектирование системы Microsoft SQL Server

Прежде чем начинать установку операционной системы и СУБД, требуется провести тщательный анализ и продумать архитектуру системы. С помощью данной лекции вы научитесь определять, какие функции будет выполнять система: OLTP, DSS или же системы пакетной обработки данных, определять требования к уровню обслуживания, мощности, обеспечения работоспособности. Обзор службы Microsoft Cluster Services позволяет более эффективное ее использование в будущем. Подробно рассматриваются архитектуры системы баз данных: однозвенная архитектура, двухзвенная и трехзвенная. Вы сможете без труда оценивать производительность и масштабируемость будущей системы.

Прежде чем начать устанавливать операционную систему и Microsoft SQL Server, вам нужно как следует продумать конструкцию своей системы SQL Server. Тщательное проектирование системы SQL Server позволит вам избежать дорогостоящих простоев, вызванных как реорганизацией системы, так и переинсталляцией SQL Server с другими настройками. Прочитав эту лекцию, вы узнаете, как производится проектирование системы SQL Server. В нашей книге термин система SQL Server обозначает аппаратуру и программное обеспечение, образующие компьютер, фактически осуществляющий работу с базой данных SQL Server. А под общим термином система мы будем иметь в виду аппаратуру и программное обеспечение, образующие все компьютеры, при помощи которых пользователи осуществляют доступ к данным, находящимся в одной или нескольких базах данных.

В этой лекции будет дана краткая вводная информация о версиях Microsoft Windows 2000 и SQL Server, которые вы можете выбрать для инсталляции. И наконец, вы получите сведения о типах внешних, интерфейсных (front-end) приложений для доступа к SQL Server, которые ваша фирма может приобрести или создать, а также о том, как архитектура приложений может влиять на перспективы масштабирования и производительности вашей системы.

Системные требования

Чтобы понять требования, предъявляемые ко всей системе, нужно выяснить функции системы. Когда вы имеете представление о назначении системы, то можно начать с поиска решения, как можно было бы добиться реализации системных требований при помощи одного или нескольких компьютеров. Вы можете решить, что одного компьютера будет достаточно, а можете посчитать, что для достижения ваших целей понадобится много компьютеров. В данной лекции мы дадим общий обзор этих вопросов. В лекциях 5 и 6 будут даны более подробные рекомендации по проектированию и конфигурированию аппаратуры.

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

Системное приложение

Что хорошего в базе данных SQL Server без приложения? Если не рассматривать случай, когда каждый работник в вашей фирме является специалистом в SQL и наслаждается составлением сложных запросов и просмотром данных в табличной форме, то пользы от нее немного. Приложение облегчает применение SQL Server. Некоторые приложения явно показывают, что вы работаете с базой данных, а некоторые – полностью скрывают это. В любом случае, важно спроектировать приложение так, чтобы пользователи могли получать необходимое им обслуживание с комфортом и своевременно. Во многих случаях пользователи бывают рБ¤ZQVрБ¤ZQVАИџZQV0:ўZQVXВ¤ZQVВ¤ZQV@В¤ZQVрять требованиям потребителей, они могут найти себе другую фирму, обеспечивающую более качественное обслуживание.

Приложения могут быть весьма разнообразными по выполняемым функциям. Можно обобщенно считать, что имеются три основные функции приложений: системы оперативной обработки транзакций ( OLTP, on-line transaction processing ), системы поддержки принятия решений ( DSS, decision support system ) и системы пакетной обработки данных ( batch processing ). Эти функции имеют различные требования и могут применять совершенно разные типы приложений.

OLTP (системы оперативной обработки транзакций)

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

Все системы OLTP обладают одной общей особенностью – пользователь должен ждать от них ответа. Ваша задача – спроектировать систему, которая будет адекватно обслуживать запросы пользователей за предусмотренное время ответа.

DSS (системы поддержки принятия решений)

Системы поддержки принятия решений (DSS) помогают пользователям принимать важные решения, касающиеся их бизнеса, они выдают специфические результаты, относящиеся к бизнесу. Вот некоторые примеры вопросов про бизнес, на которые могут отвечать системы поддержки принятия решений:

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

Системы пакетной обработки данных

Системы пакетной обработки данных обрабатывают неоперативные (offline) задания обработки данных, не имеющие никаких компонент для работы с конечными пользователями. Вот типичные примеры таких систем:

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

Требования

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

Требования к уровню обслуживания

К наиболее важным факторам, влияющим на проектирование вашей системы, относятся требования к уровню обслуживания. Эти требования к уровню обслуживания обычно формулируются в соглашении об уровне обслуживания (SLA, service level agreement). Соглашения об уровне обслуживания заключаются между поставщиками обслуживания (CIO, chief information officer, руководителями, отвечающими за информационные технологии) и потребителями (пользователями). Будет ли заключено формальное соглашение об уровне обслуживания или нет, зависит от того, кто является потребителем и каким образом осуществляется обслуживание.

Например, если вы заключили с другой фирмой контракт о предоставлении услуг доступа к базам данных, то, скорее всего, у вас будет иметься соглашение об уровне обслуживания. Фактически, чаще всего такие соглашения об уровне обслуживания являются контрактами, исполнение которых обязательно по закону. В любом случае, в соглашении об уровне обслуживания будет дано описание уровня обслуживания, гарантируемого потребителям. Там также могут быть определены санкции за несоответствие требованиям к уровню обслуживания. Более подробно про соглашения об уровне обслуживания будет рассказано в лекции 6.

Если имеются гарантии на уровень обслуживания, то вы должны спроектировать систему таким образом, чтобы обеспечивать этот уровень производительности. Мы обсудим здесь некоторые моменты, влияющие на проектирование системы: производительность, мощность и обеспечение работоспособности в течение суток.

Производительность

Одним из наиболее важных условий, включаемых в соглашения об уровне обслуживания, является спецификация минимально допустимой производительности системы. Типичное соглашение об уровне обслуживания содержит схему различных транзакций, поддерживаемых приложением, значение допустимого наихудшего времени обслуживания для 100 процентов транзакций и, необязательно, более строгие требования к допустимому наихудшему времени обслуживания для 95 или 90 процентов транзакций. Например, в соглашении об уровне обслуживания может быть сказано, что 90 процентов транзакций "добавить нового потребителя" должно завершаться за время не более двух секунд, и что любые такие транзакции должны завершаться не более чем за три секунды.

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

Мощность

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

Чтобы поддерживать мощность системы, вы должны непрерывно следить за ней и предпринимать действия, когда есть признаки, что мощность подходит к своему пределу. Как вы увидите в лекции 6, некоторый объем места на дисках должен оставаться всегда, чтобы обеспечить пиковые нагрузки при работе. Если этот резервный буфер начинает использоваться часто, то нужно добавить в систему дополнительные ресурсы. Это верно и в отношении использования центрального процессора.

Обеспечение работоспособности

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

Системные компоненты и настройки

Теперь, когда вы имеете краткое представление о типах доступных приложений и требований к уровню обслуживания, вы можете принять решение о том, какое программное обеспечение следует установить на вашей системе. Вы можете выбрать одну из четырех версий Windows 2000 и одну из трех версий SQL Server 2000. В данном разделе мы рассмотрим различия между этими версиями и причины, по которым вы можете предпочесть одни версии другим.

Версии Windows 2000

Для того чтобы вы могли выбрать программное обеспечение, соответствующее требующимся для вас приложениям, имеются четыре версии Windows 2000. Возможности операционных систем Windows 2000 растут при переходе от Windows 2000 Professional к Windows 2000 Server, затем к Windows 2000 Advanced Server и, наконец, к Windows 2000 Datacenter. Ниже будут даны описания возможностей каждой из версий Windows 2000. Следует выбирать ту версию Windows 2000, которая обеспечивает возможности, соответствующие вашим потребностям, а не просто покупать самую дорогую версию с наибольшими возможностями.

Windows 2000 Professional

Windows 2000 Professional является, по существу, версией Windows 2000 для настольных компьютеров. Как правило, компьютер под управлением Windows 2000 Professional сможет воспользоваться возможностями лишь клиентских компонент SQL Server 2000. Однако если вам понадобится запустить на этом компьютере SQL Server, то вы сможете инсталлировать SQL Server 2000 Personal Edition. Версия Personal Edition позволяет только локальный доступ к базе данных. Доступ с других компьютеров не разрешается.

Примечание. В Windows 2000 Professional можно инсталлировать SQL Server Personal Edition и клиентские компоненты SQL Server.
Windows 2000 Server

Windows 2000 Server спроектирована как серверная операционная система. Это значит, что инсталлировав на компьютер Windows 2000 Server, вы позволите другим компьютерам осуществлять доступ к ресурсам этого компьютера. Windows 2000 Server поддерживает SQL Server 2000 Standard Edition. Windows 2000 Server не поддерживает компьютеры с более чем четырьмя центральными процессорами и более чем с 4 Гб оперативной памяти. SQL Server 2000 также позволяет удаленным клиентам осуществлять доступ к базе данных.

Примечание. На компьютеры под управлением Windows 2000 Server можно инсталлировать только SQL Server Standard Edition, SQL Server Personal  Edition и клиентские компоненты SQL Server.
Windows 2000 Advanced Server

Windows 2000 Advanced Server также является серверной операционной системой. Как и для компьютеров под управлением Windows 2000 Server, компьютеры под управлением Windows 2000 Advanced Server позволяют другим компьютерам осуществлять доступ к их системным ресурсам, а также к SQL Server. В дополнение к возможностям Windows 2000 Server, Windows 2000 Advanced Server поддерживает до восьми центральных процессоров и до 8 Гб оперативной памяти. Если вы хотите пользоваться службами MSCS (Microsoft Cluster Services) для поддержки перехода к другому узлу кластера при отказах, то вам следует применять Windows 2000 Advanced Server. Кроме поддержки MSCS, Windows 2000 Advanced Server вместе с SQL Server 2000 поддерживает новую технологию кластеризации SQL Server – "обновляемые распределенные представления" (updatable distributed views).

Примечание.Чтобы иметь возможность применять SQL Server 2000 с восемью центральными процессорами и 8 гигабайтами памяти, вы должны запускать SQL Server Enterprise Edition. Кроме того, на компьютерах под управлением Windows 2000 Advanced Server можно инсталлировать SQL Server Standard Edition, SQL Server Personal Edition и клиентские компоненты SQL Server.
Windows 2000 Datacenter

Windows 2000 Datacenter – это "флагман" семейства операционных систем Windows 2000. Данная версия Windows 2000 поддерживает все компоненты, что и другие версии, а также может поддерживать до 64 центральных процессоров и до 64 Гб памяти. Поставки Windows 2000 Datacenter осуществляются только через поставщиков оборудования. Поставщики оборудования не только встраивают (интегрируют) Windows 2000 Datacenter в свое оборудование, но и обеспечивают наивысший уровень поддержки, доступный для операционных систем Windows 2000. Благодаря такой интеграции программного обеспечения и аппаратуры вы можете обращаться с вопросами технической поддержки аппаратуры и Windows 2000 в единую службу.

Примечание.Чтобы иметь возможность применять SQL Server 2000 с 64 центральными процессорами и 64 Гб памяти, вы должны запускать SQL Server Enterprise Edition. Кроме того, на компьютерах под управлением Windows 2000 Datacenter Server можно инсталлировать SQL Server Standard Edition, SQL Server Personal Edition и клиентские компоненты SQL Server.
Версии SQL Server

Вы можете выбирать не только среди версий Windows 2000, но и среди нескольких версий (редакций, editions) SQL Server. Выбор версии SQL Server очень прост и зависит от необходимого для вас объема оперативной памяти и количества центральных процессоров. Ниже даны описания версий SQL Server.

Клиентское программное обеспечение

Клиентские компоненты SQL Server 2000 состоят из сетевых библиотек и утилит, необходимых для доступа к удаленной или локальной системе SQL Server. Эти компоненты необходимы любой системе для доступа к SQL Server, и они одинаковые (не зависят от того, какая версия SQL Server инсталлирована).

Версия Personal Edition

Версия Personal Edition спроектирована для реализации небольших баз данных, доступных локально на компьютере-клиенте. SQL Server 2000 Personal Edition вполне может использоваться в качестве сервера для небольшой рабочей группы и допускает ограниченное (до 5) число клиентских подключений по сети.

Версия Standard Edition

Standard Edition является одной из двух серверных версий ("редакций") SQL Server 2000. Standard Edition обладает такими же функциональными возможностями, как и SQL Server Enterprise Edition, но не может работать более чем с четырьмя центральными процессорами и более чем с 4 Гб оперативной памяти.

Версия Enterprise Edition

Версия Enterprise Edition поддерживает все средства и функциональные возможности всех версий Windows 2000. Для работы SQL Server 2000 Enterprise Edition требуется Windows 2000 Advanced Server или Windows 2000 Datacenter. Кроме прочего, SQL Server 2000 Enterprise Edition поддерживает двухузловую кластеризацию с переходом к другому узлу кластера при отказах и обновляемые распределенные представления (updatable distributed views).

Сравнительная таблица версий

Возможности различных версий Windows 2000 и SQL Server 2000 перечислены в табл. 4.1.

Таблица 4.1. Сравнение различных версий Windows 2000 и SQL Server 2000
SQL Server 2000 Personal Edition SQL Server 2000 Standard EditionSQL Server 2000 Enterprise Edition
Windows 2000 ProfessionalОграниченные возможностиНевозможное сочетание версийНевозможное сочетание версий
Windows 2000 ServerОграниченные возможностиВозможности сервера.

Поддержка до 4 центральных процессоров и до 2 Гб памяти

Возможности сервера.

Поддержка до 4 центральных процессоров и до 4 Гб памяти

Windows 2000 Advanced ServerОграниченные возможностиВозможности сервера.

Поддержка до 4 центральных процессоров и до 2 Гб памяти

Возможности сервера.

Кластеризация MSCS. Поддержка до 8 центральных процессоров и до 8 Гб памяти

Windows 2000 DatacenterОграниченные возможностиВозможности сервера.

Поддержка до 4 центральных процессоров и до 2 Гб памяти

Возможности сервера.

Кластеризация MSCS. Поддержка до 64 центральных процессоров и до 64 Гб памяти

Как видите, у вас есть из чего выбрать. Следует тщательно обдумать выбор приобретаемых продуктов. Если вы поменяете свое решение уже после того, как инсталлируете систему, то вам придется начинать всю работу с самого начала.

Системные настройки

Кроме выбора версий SQL Server 2000 и Windows 2000 вы также можете воспользоваться еще некоторыми другими настройками. Эти настройки (опции) описаны ниже, они определяют применение кластеризации MSCS, репликацию SQL Server 2000 и обновляемые распределенные представления (эта новая возможность, появившаяся в SQL Server 2000 Enterprise Edition). Каждая из этих настроек имеет свои собственные возможности и требования и, следовательно, могут оказаться в вашей конфигурации полезными либо бесполезными. Мы расскажем об этом в нескольких абзацах ниже.

MSCS

Сокращение MSCS расшифровывается как Microsoft Cluster Services – "службы кластеризации Microsoft". Службы MSCS являются настройкой Windows 2000, работающей в сочетании с SQL Server. Благодаря MSCS компьютер может работать как резервный сервер (standby, failover server) для другого компьютера (сервер для перехода при отказе). Благодаря этому можно начинать процесс восстановления почти сразу же после случившегося аппаратного или даже программного отказа. Для MSCS требуется разделяемая дисковая подсистема, подключенная к обоим компьютерам кластера. Журнал транзакций SQL Server и файлы данных, а также исполняемые файлы должны размещаться на этой разделяемой дисковой подсистеме. В случае отказа, определяемого по отсутствию "сигнала пульса", резервный компьютер берет на себя функции SQL Server. Так как резервный компьютер захватывает себе IP-адрес и имя системы, то для внешнего мира он воспринимается просто как перезагрузившийся основной сервер базы данных.

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

Репликация SQL Server

Репликация SQL Server позволяет копировать данные из одной базы данных SQL Server на другие системы баз данных. Имеются разные схемы репликации –моментальная (snapshot replication), транзакционная (transactional replication) и репликация слиянием (merge replication), они будут описаны в нескольких абзацах ниже. Какая из схем репликации лучше всего подойдет вам – зависит от ваших предпочтений и от ваших потребностей. Репликация SQL Server работает по модели "опубликовать-подписаться" (publish-and-subscribe model), в которой издатель (publisher) публикует данные, а один или несколько подписчиков (subscribers) получают копии этих данных.

Моментальная репликация

При моментальной репликации периодически создается "картинка", "снимок" (snapshot) данных и предоставление этих данных в пользование другим системам. Моментальная репликации выполняется только во время создания и применения "снимков", поэтому при обычной работе она не затруднит вас дополнительными заботами. Недостатком моментальной репликации является то, что "свежесть" данных определяется последним "снимком", а он может быть довольно старым.

Транзакционная репликация

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

Репликация слиянием

Репликация слиянием отличается от транзакционной репликации и моментальной репликации тем, что обновления происходят и на компьютере-издателе, и на компьютерах-подписчиках. SQL Server применяет триггеры и метки времени (timestamps) для координации изменений между разными компьютерами, участвующими в репликации. Репликация слиянием полезна, когда требуется многонаправленная репликация, но по сравнению с транзакционной или моментальной репликацией она вызывает гораздо большую нагрузку.

Обновляемые распределенные представления

В SQL Server появились обновляемые распределенные представления (updatable distributed views). Благодаря этой возможности системы SQL Server могут разделять (использовать совместно) логическую базу данных, что повышает масштабируемость. Логическая база данных может стать большой, и вы можете разместить ее на многих компьютерах, это позволяет повысить ее мощность. (Об обновляемых распределенных представлениях см. лекцию 18.)

Размещение базы данных

Важной частью проектирования системы SQL Server является проектирование размещения базы данных (database layout). Под этим надо понимать физическое размещение журналов транзакций, файлов данных и т.д. Эта задача – одна из самых важных при проектировании системы, потому что изменить принятые ранее решения, относящиеся к размещению, будет очень сложно. В лекциях 5 и 6 будут даны советы о физическом размещении журнала транзакций и файлов данных.

Журнал транзакций

Журнал транзакций критически важен для работы, для стабильности и производительности сервера базы данных. У каждой базы данных имеется свой собственный журнал транзакций, поэтому каждый журнал транзакций должен быть правильно размещен. Журнал транзакций используется для записи изменений в базу данных, что позволяет восстановить систему в случае отказа. Так как восстановление опирается на журнал транзакций, важно, чтобы эта компонента базы данных была защищена от возможных сбоев при помощи RAID-устройств. Журнал транзакций должен оставаться доступным даже при выходе диска из строя.

В дополнение к защите журнала транзакций от отказов дисков вам следует обеспечить размещение журнала транзакций на высокоскоростном устройстве. Если журнал транзакций будет размещен на слишком медленном устройстве, то транзакциям придется ждать, что сильно повлияет на производительность системы. Журнал транзакций должен быть также сконфигурирован так, чтобы обеспечивалась отказоустойчивость. Требования к размещению журнала транзакций рассмотрены подробно в следующей лекции.

И наконец, нужно обеспечить достаточно места в журнале транзакций, чтобы система длительное время могла работать безостановочно. Когда журнал транзакций заполнится, обработка транзакций приостановится до тех пор, пока в журнале транзакций не появится свободное место. Место в журнале транзакций освобождается при резервном копировании журнала транзакций. Однако резервное копирование журнала транзакций может негативно повлиять на производительность. Некоторые администраторы баз данных предпочитают создавать достаточно большие журналы транзакций, чтобы было достаточно лишь одного резервного копирования в час или в день. Следует увеличивать размер журнала транзакций до такой степени, чтобы он мог применяться без резервного копирования не менее восьми часов.

Файлы данных

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

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

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

Приложение

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

Архитектура

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

Сравнение архитектур

Каждое приложение базы данных состоит из трех отдельных компонент:

Различие между однозвенной, двухзвенной и трехзвенной архитектурами зависит от того, каким образом разделяются на части эти компоненты. В однозвенной архитектуре они все являются частями одной программы. В двухзвенной архитектуре эти компоненты разделены на две отдельные части. В трехзвенной архитектуре компоненты разделены на три отдельные части (см. рис. 4.1). В последующих разделах даны более подробные объяснения.

Различия между однозвенной, двухзвенной и трехзвенной архитектурами


Рис. 4.1.  Различия между однозвенной, двухзвенной и трехзвенной архитектурами

Однозвенная архитектура

Однозвенная (one-tier, single-tier) архитектура – это система, в которой все службы базы данных, приложения и представления (пользовательский интерфейс) размещены на одной системе. Системы такого типа не производят обработку вне тех компьютеров, на которых они исполняются. Примером однозвенной архитектуры может служить база данных Microsoft Аccess с локальными службами представления.

В наше время трудно встретить действительно однозвенную архитектуру, особенно на платформе Windows 2000. Тем не менее многие небольшие однопользовательские приложения являются однозвенными. Примером этому могут служить Microsoft Money, Quicken и TurboTax. Такие приложения обычно размещаются на том же компьютере, на котором они и исполняются. Пример однозвенной архитектуры с SQL Server найти гораздо труднее. Фактически, даже если вы можете исполнять Enterprise Manager на той же системе, где размещена и база данных, но на самом деле такое приложение не является однозвенным, потому что данное приложение пользуется сетевыми компонентами SQL Server. Тот факт, что вы вот взяли и запустили его на той же системе, является несущественным.

Двухзвенная архитектура

В двухзвенных приложениях службы представления и база данных размещаются на разных системах (компьютерах). Уровень служб представления (пользовательский интерфейс) обычно включает в себя логику работы приложения. Хорошим примером двухуровневого приложения является приложение, использующее SQL Server Enterprise Manager. У таких приложений пользовательский интерфейс и логика работы приложения размещаются в Enterprise Manager, но все данные, необходимые для функционирования приложения, находятся в базе данных SQL Server на другом компьютере.

Двухзвенные приложения встречаются чаще всего. Вы, наверное, уже работали со многими такими приложениями. Эти приложения обычно написаны на языках, поддерживающих API (интерфейсы прикладного программирования) для Windows, таких, как Microsoft Visual C++ или Visual Basic. При помощи двухзвенных приложений каждый пользователь может иметь одно или несколько соединений с базой данных SQL Server. Данная архитектура может стать неэффективной из-за того, что большинство этих соединений будут простаивать большую часть времени.

Трехзвенная архитектура

В трехзвенных приложениях уровень базы данных, уровень приложения и уровень служб представления выделены в три разные компоненты. В типичных трехзвенных приложениях используется промежуточный уровень для обслуживания многочисленных соединений от уровня служб представления, благодаря чему уменьшается количество соединений с SQL Server. Кроме того, этот промежуточный уровень может выполнять значительный объем работы, связанной с реализацией специфики целевых задач (логики предметной области), освобождая базу данных для решения тех задач, которые она выполняет лучше всего, – для доставки требуемых данных.

На вопрос, к какой категории – с двухзвенной или с трехзвенной архитектурой – можно отнести веб-приложение, ответить сразу бывает трудно. Можно воспользоваться простой проверкой: если данные, отображаемые уровнем служб представления, могут с той же легкостью применять и терминал или веб-браузер, то данное приложение, скорее всего, является двухзвенным.

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

Производительность и масштабируемость

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

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

Заключение

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

В данной лекции мы показали несколько ключевых моментов. Вы должны узнать требования вашей фирмы относительно расписания периодов работоспособности системы. Может быть, ваша система будет состоять из многих вычислительных центров, будет применять кластеризацию, подсистемы ввода-вывода с RAID-массивами или репликацию. Кроме того, на всю конструкцию системы окажут влияние требования, относящиеся к масштабируемости и производительности. Как вы поняли из данной лекции, здесь имеется множество вариантов настроек. Наконец, вы должны проектировать приложение, постоянно помня о производительности. Если вы сможете предвидеть вопросы, касающиеся производительности, то система не затормозится при росте объема данных и увеличении числа пользователей.

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

Лекция 5. Конфигурирование и планирование подсистемы ввода-вывода

Подсистема ввода-вывода – одна из главных составляющих при проектировании системы. Рассматриваются принципы работы жестких дисков, показатели производительности: задержка вращения, время поиска дорожки диска, максимальное время поиска и другие. Проводится очень подробный анализ и сравнительная характеристика массивов RAID: RAID 0, RAID 1, RAID 5, RAID 10. Обзор внутренних и внешних массивов RAID. Различные таблицы, схемы, графики позволяют более наглядно и качественно представить информацию для принятия нужного решения. Первое знакомство с языком запросов T-SQL проводится именно в этой лекции!

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

В данной лекции мы изучим подсистему ввода-вывода. Мы начнем с описания работы устройств жестких дисков и расскажем, почему диски имеют фундаментальные ограничения производительности. Затем мы расскажем о разнообразных решениях при помощи доступных вам систем RAID и о характеристиках их производительности. Кроме того, вы научитесь идентифицировать и решать проблемы с производительностью ввода-вывода. В данной лекции также будет дано множество полезных советов и рекомендаций, относящихся к подсистеме ввода-вывода. И наконец, вы научитесь правильно конфигурировать Microsoft SQL Server 2000 так, чтобы вы смогли задействовать потенциал производительности вашей подсистемы ввода-вывода.

Характеристики производительности дисков

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

Конструкция накопителя на жестких дисках

В качестве компонент для хранения данных в накопителях на жестких дисках применяются одна или нескольких пластин (disk platters). Эти пластины покрыты веществом, способным хранить данные благодаря своим магнитным свойствам. Данные хранятся на дорожках (tracks), похожих на дорожки грампластинки (или компакт-диска – для тех, кто забыл, как выглядят грампластинки). Каждая дорожка, в свою очередь, состоит из нескольких секторов. Чем дальше от центра диска, тем больше секторов будет на каждой из дорожек. Типичная пластина жесткого диска показана на рис. 5.1.

Накопители на жестких дисках часто состоят не из одной, а из многих пластин, расположенных одна над другой (рис. 5.2). Данные считываются при помощи магнитных головок. Магнитные головки используются как для чтения, так и для записи данных на диск. Так как пластин несколько, то и головок должно быть несколько. Эти головки крепятся на коромыслах (armature), двигающихся внутрь пакета пластин и обратно из него, подобно тонарму с иглой у граммофона. Все головки и коромысла жестко соединены друг с другом, поэтому все головки в каждый из моментов времени находятся в одинаковых местах каждой из пластин. Из-за такой конструкции диска становится целесообразным одновременное чтение или запись сразу всеми его головками. Таким образом, данные записываются и считываются с диска одновременно всеми головками. Поскольку набор дорожек, охватываемых головками в любой из моментов времени, похож на цилиндр, мы говорим, что данные хранятся в цилиндрах (рис. 5.2).

Пластина жесткого диска


Рис. 5.1.  Пластина жесткого диска

 Цилиндры жесткого диска


Рис. 5.2.  Цилиндры жесткого диска

Накопители на жестких дисках могут иметь только одну пластину, а могут – и более шести пластин. Плотность хранения данных на пластинах и количество пластин определяют максимальную емкость (вместимость) накопителя. Некоторые модели накопителей не отличаются почти ничем, кроме количества пластин. Распространенная модель накопителей имеет емкость 9 Гб и три пластины, а накопители модели, не отличающейся ничем, кроме емкости 18 Гб, имеют шесть пластин.

Показатели производительности накопителей на жестких дисках

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

Задержка вращения

Многие высокопроизводительные жесткие диски вращаются со скоростью 10000 об/мин. Если для доступа к запрошенным данным потребуется полный оборот диска, то этот оборот диска займет приблизительно 6 мс, т.е. 0,006 секунд. Скорость вращения 10000 об/мин соответствует 166,7 оборотам в секунду, поэтому на один оборот требуется 1/166,7 секунды, т.е. около 6 мс.

Чтобы головки накопителя могли прочитать сектор данных, этот сектор должен находиться под головками. Поскольку диск всегда вращается, головка просто должна подождать, пока сектор не подойдет в позицию под нее. Время, необходимое для поворота диска в нужную позицию, когда нужный сектор подойдет под головку, называется задержкой вращения (rotational latency). Задержка вращения может достигать 6 мс (если необходим полный оборот диска), но в среднем она составляет 3 мс.

Задержка вращения добавляется к времени отклика доступа к диску. Поэтому, когда вы выбираете дисковые накопители для своей системы, с точки зрения производительности, длительность задержки вращения чрезвычайно важна. Как вы только что видели, для дисков со скоростью вращения 10000 об/мин, задержка вращения составляет около 3 мс. Диски предыдущего поколения вращались со скоростью 7200 об/мин, у них оборот совершался за 8,3 мс, а средняя задержка вращения составляет около 4,15 мс. Это увеличение средней задержки вращения кажется небольшим, но оно на 38% больше, чем у диска со скоростью вращения 10000 об/мин. Как вы узнаете далее в данной лекции, длительность времени отклика может значительно увеличить время доступа для ввода-вывода.

Время поиска дорожки диска

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

 Задержка вращения и время поиска


Рис. 5.3.  Задержка вращения и время поиска

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

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

Время перехода головки на соседнюю дорожку (track-to-track seek time) определяет время перехода на другую дорожку при осуществлении операций последовательного ввода-вывода. У типичных 9 Гб дисков со скоростью вращения 10000 об/мин время перехода головки с дорожки на дорожку составляет около 0,8 мс. Как видите, для дисков со временем перехода головок на соседнюю дорожку 0,8 мс, задержка вращения составляет около 3 мс и является более существенным фактором, оказывающим влияние на производительность дискового накопителя. Если операции ввода-вывода применяются к дисковому накопителю достаточно быстро, то накопитель сможет прочитывать за один раз соседние дорожки или даже прочитывать или записывать дорожку целиком за один раз. Однако так бывает не всегда. В некоторых ситуациях операции ввода-вывода запрашиваются недостаточно быстро, и на каждый запрос из серии последовательных запросов приходится по обороту диска. То, что будет происходить на самом деле, зависит от конструкции и от скорости контроллера дискового накопителя.

Среднее время поиска дорожки диска (average seek time) – это усредненное время, необходимое для перехода головок между двумя произвольно выбранными (random) дорожками диска. Исходя из таблиц с техническими характеристиками типичных дисков со скоростью вращения 10000 об/мин, их время поиска составляет около 6 мс. Поскольку почти все операции ввода-вывода, генерируемые SQL Server, будут относиться к произвольным участкам диска, то ваши дисковые накопители будут выполнять множество операций произвольного ввода-вывода.

Максимальное время поиска для дисков данного типа может достигать 13 мс. Поиск дорожки имеет максимальную длительность при переходе от самой внутренней дорожки пластины к самой внешней дорожке или наоборот. Такая ситуация называется поиск по всему диску (full-disk seek). Но при обычной работе поиск нужной дорожки не будет поиском по всему диску, особенно когда диск не заполнен до конца.

Технические характеристики накопителей на жестких дисках

В данном разделе вы узнаете, насколько быстро дисковые накопители могут выполнять различные виды операций ввода-вывода. Чтобы оценить скорость выполнения операций ввода-вывода, необходимо знать некоторые сведения о дисковом накопителе. Большинство этих сведений можно найти в технических описаниях дисков, сообщаемых их производителями. В данной лекции в качестве примера будут взяты технические характеристики накопителя с емкостью 9,1 Гб и скоростью вращения 10000 об/мин. Другие технические характеристики этого типичного дискового накопителя перечислены в табл. 5.1.

Таблица 5.1. Технические характеристики дискового накопителя (пример)
Техническая характеристикаЗначениеОписание
Емкость диска9.1 ГбЕмкость неформатированного диска
Скорость вращения10000 об/минСкорость, с которой вращается диск
Скорость передачи данных40 Мб/сСкорость шины SCSI
Среднее время поиска5,2 мс (для чтения), 6 мс (для записи)Средняя продолжительность времени, необходимого для поиска нужной дорожки (при операциях произвольного ввода-вывода)
Время перехода головки на соседнюю дорожку0,6 мс (для чтения), 0,9 мс (для записи)Продолжительность времени, необходимого для перехода на соседнюю дорожку (при операциях последовательного ввода-вывода)
Время поиска по всему диску12 мс (для чтения), 13 мс (для записи)Продолжительность времени, необходимого для перехода от самого внутреннего сектора диска к самому внешнему сектору, или наоборот
Средняя задержка2,99 мсСредняя задержка вращения
Средняя длительность работы до отказа1 000 000 часовСредний срок службы дискового накопителя

А теперь мы расскажем, как при помощи подобных технических характеристик вы сможете оценить производительность накопителя на жестких дисках.

Производительность накопителя на жестких дисках

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

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

Последовательный ввод-вывод

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

Как мы уже упоминали, типичному дисковому накопителю для выполнения перехода головок к соседней дорожке потребуется около 0,9 мс. Прибавив это время к величине задержки вращения (2,99 мс), вы можете сделать вывод, что каждая операция ввода-вывода займет приблизительно 3,89 мс. Такая длительность теоретически позволяет выполнять 264 операции последовательного ввода-вывода в секунду, т.к. одна секунда содержит 264 интервала времени по 3,89 мс. Но на производительность последовательного ввода-вывода влияют и другие факторы, такие как ограничение пропускной способности интерфейса SCSI 40 Мб/с и компоненты операционной системы: файловая система и драйвер устройства. Эта дополнительная нагрузка определяет максимальную производительность последовательного ввода-вывода, допустимую для данного дискового накопителя, составляющую около 250 операций в секунду (это число зависит от размера передаваемых данных). Как вы узнаете в лекции 6, если ваш диск передает данные со скоростью, превышающей 85% от его производительности, то будут образовываться очереди, поэтому максимальная рекомендуемая производительность ввода-вывода составит 225 операций в секунду.

Произвольный ввод-вывод

При произвольном вводе-выводе головки дискового накопителя должны считывать данные с произвольных участков диска. Из-за этих произвольных перемещений головок происходит снижение производительности. Давайте снова вернемся к нашему примеру дискового накопителя. Пусть теперь головки затрачивают не по 0,8 мс, переходя на соседние дорожки, а перемещаются произвольным образом по всему диску. Для поиска произвольной дорожки потребуется в среднем около 6 мс, что в 7,5 раза длительней перехода к соседней дорожке. Для типичной операции произвольного ввода-вывода понадобится примерно 6 мс (в среднем) на перемещение головок к дорожке с данными и еще 2,99 мс на задержку вращения, что составит в сумме 8,99 мс, т.е. теоретически максимально может производиться 111 операций ввода-вывода в секунду (т.к. в одной секунде содержится 111 интервалов времени по 8,99 мс). Далее, мы уже говорили, что если возможности ввода-вывода для диска задействуются более чем на 85%, то образуются очереди. Поэтому максимальная рекомендуемая производительность ввода-вывода составит 94 операции в секунду. А если согласиться с эмпирическим правилом для учета нагрузки на контроллер, то следует ограничить ввод-вывод для данного дискового накопителя 85 операциями ввода-вывода в секунду.

Когда дисковый накопитель выполняет произвольный ввод-вывод, нормальная задержка (время, необходимое для выполнения одной операции ввода-вывода) составит 8,99 мс. Если обращения к диску станут производиться чаще, чем он сможет их обрабатывать, то начнут образовываться очереди и задержка вырастет (см. рис. 5.4). Как видите, чем ближе количество операций в секунду к рекомендованной максимальной производительности накопителя, тем длительней будет задержка.

Количество операций ввода-вывода в секунду как функция задержки


Рис. 5.4.  Количество операций ввода-вывода в секунду как функция задержки

На самом деле, если вы достигните 100-процентного задействования возможностей диска, то очереди возникнут обязательно, а общая производительность резко снизится. Как вы прочтете в нашей книге позднее, SQL Server, как и любая другая система управления реляционными базами данных, очень сильно зависит от задержек ввода-вывода. Если для выполнения операций ввода-вывода требуется чрезмерно много времени, то производительность SQL Server сильно снизится (деградирует) и могут возникнуть такие проблемы, как блокировка (blocking) и зависание (deadlock). Когда поток ждет исполнения операции ввода-вывода, он может удерживать блокировки. До тех пор, пока операция ввода-вывода не будет исполнена, блокировка будет сохраняться, что и является причиной данных проблем.

Способы преодоления ограниченных возможностей дисков

Как же можно преодолеть ограничения, связанные с производительностью дисковых накопителей? На самом деле, здесь нет ничего хитрого. Следуйте советам, приведенным ниже, и вы сможете создать подсистему ввода-вывода с оптимальной производительностью:

Массивы RAID

Как вы понимаете, если просто добавлять в систему новые и новые дисковые накопители, то с нею будет очень сложно работать. Поэтому, вместо того, чтобы добавлять десятки или сотни отдельных дисковых накопителей, многие пользователи предпочитают применять массивы RAID (Redundant Array of Independent Disks, массивы независимых дисковых накопителей с избыточностью). Массивы RAID могут быть реализованы с использованием программных средств и имеющихся у вас устройств ввода-вывода, либо могут быть приобретены как аппаратные устройства RAID. В этом разделе мы познакомим вас с массивами RAID и расскажем о том, как они работают.

Как ясно из самого их названия, массивы RAID содержат в себе два или несколько дисковых накопителей, образуя тем самым массив дисковых накопителей. Операционная система воспринимает весь этот массив как один логический диск. Этот логический диск называют также дисковый том, потому что он является набором дисков, кажущихся одним диском. Для пользователей, для приложения и даже (если применяется аппаратный массив RAID) для Microsoft Windows 2000 массив RAID воспринимается как один диск. Во многих случаях, однако, этот один диск будет иметь гораздо больший объем, чем любой из дисков, имеющихся в продаже. Но благодаря массивам RAID можно создавать не только большие логические диски, но также, во многих из конфигураций RAID (уровнях RAID), обеспечивать также и отказоустойчивость логического диска. Эта отказоустойчивость позволяет диску RAID сохранять работоспособность даже при отказе одного или нескольких из отдельных дисковых накопителей, составляющих массив RAID. В следующих разделах мы покажем, как достигаются такие возможности, и расскажем о характеристиках различных уровней RAID.

Мы уже сказали, что массивы RAID могут быть реализованы программно; фактически, Windows 2000 поставляется вместе с программным обеспечением для RAID. Но в данной лекции мы в основном будем рассказывать об аппаратных реализациях RAID, потому что они обладают дополнительными функциональными возможностями. Мы расскажем об этих возможностях в следующих двух разделах и познакомим вас с функциональными возможностями и характеристиками различных уровней RAID.

Понятия, относящиеся к подсистеме ввода-вывода

Аппаратные контроллеры RAID обеспечивают не только основные функциональные возможности RAID, но и некоторые дополнительные средства. Среди этих дополнительных возможностей аппаратных реализаций RAID чаще всего встречается кэш контроллера. В этом разделе вы узнаете о кэше контроллера, кэшах дисковых накопителей и о разнице между внутренними и внешними массивами RAID. Кроме того, вы узнаете о новой технологии ввода-вывода – сетях хранения данных SAN (Storage Area Network). В данном разделе мы также рассмотрим некоторые разнообразные вопросы, имеющие отношение к контроллерам RAID, к дисковым накопителям и к пропускной способности устройств ввода-вывода.

Способы преодоления ограниченных возможностей дисков

Чтобы улучшить производительность ввода-вывода, многие производители поставляют контроллеры, имеющие кэши. Кэш контроллера – это оперативная память, установленная в контроллере дисковых накопителей. Этот кэш применяется для выполнения двух задач:

Как вы узнаете позднее в данной лекции, производительность записи может оказаться критически важной, особенно, когда вы применяете массивы RAID уровня 5. В большинстве случаев контроллер кэша является большим достоинством. Но есть два момента, о которых мы должны вас предостеречь:

Кэши дисковых накопителей

Большинство дисковых накопителей тоже содержит кэш с оперативной памятью. Этот кэш имеет меньший объем, чем кэш контроллера. Он может хранить одновременно немного запросов, благодаря чему дисковый накопитель может самостоятельно выполнить лифтовую сортировку (elevator sorting). Но так как этот кэш совсем маленький (обычно – только несколько килобайт), то он не может применяться для значительного упреждающего чтения или для кэширования значительных объемов данных. Многие поставщики контроллеров RAID и контроллеров SCSI не разрешают изменять состояние этого кэша, но, однако, некоторые производители массивов RAID все же разрешают пользователям включать либо выключать этот кэш.

Внутренние и внешние массивы RAID

Имеется два основных типа систем RAID: внутренние и внешние. Эти термины описывают, где находятся алгоритмы работы массивов RAID. В большинстве систем алгоритмы работы RAID находятся на контроллере, который установлен в стойке корпуса компьютера. Такие системы RAID называются внутренними. А у внешней RAID-системы алгоритмы работы находятся в запоминающем устройстве или в запоминающих устройствах, в которых размещены дисковые накопители. Это различие показано на рис. 5-5. Каждый тип систем имеет свои особенности и характеристики. Однако различия между внутренними и внешними системами RAID не будут играть значительную роль в материале данной лекции. Мы рассказали об этих двух разновидностях контроллеров RAID только для полноты изложения. В следующем разделе вы узнаете о различных уровнях RAID. Эти уровни значительно важнее в классификации контроллеров RAID.

Внутренние и внешние системы RAID


Рис. 5.5.  Внутренние и внешние системы RAID

Сети хранения данных (SAN)

Одной из новейших технологий, появившихся на рынке, является SAN (storage area network, сеть хранения данных). Основой SAN является большая внешняя система RAID, которой могут пользоваться совместно несколько компьютеров. Из-за этого в названии технологии появилось слово network – сеть. Благодаря SAN вы можете консолидировать (собрать воедино) все запоминающие устройства и снизить расходы, осуществляя работу с системой и поддержку системы в одном месте.

Технология SAN имеет довольно простую концепцию. Внешняя система RAID соединяет адаптер главной шины (HBA, host bus adapter) непосредственно с подсистемой RAID (см. рис. 5.6). В сети SAN происходит соединение нескольких адаптеров главной шины через коммутатор, по крайней мере, с одной внешней системой RAID. В такой конфигурации все компьютеры, входящие в сеть SAN, могут осуществлять доступ к подсистеме RAID.

 Система SAN


Рис. 5.6.  Система SAN

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

Пропускная способность контроллера и шины

Вы должны оценить не только ограничения, связанные с дисковым накопителем, но и ограничения пропускной способности шины ввода-вывода (обычно это SCSI или Fibre Channel). Так как шины работают с заданной тактовой частотой и имеют определенное количество разрядов данных (32 бита, 64 бита и т.д.), то максимальная пропускная способность ограничена некоторым фиксированным значением. Ваши потребности могут достичь до пропускных способностей контроллера, шины PCI или шины ввода-вывода контроллера или превысить их. Вы можете избежать этого, распределив контроллеры по нескольким шинам PCI вашего компьютера. Большинство компьютеров сейчас выпускается с тремя и более шинами PCI.

Подсистемы ввода-вывода высшего класса

Компании, которым необходимо обеспечивать доступность в течение 99,99% времени и более в сочетании с максимальной производительностью, часто обращаются к поставщикам вроде фирмы EMC. Такие поставщики предлагают сложные подсистемы ввода-вывода, содержащие кэши объемами в несколько Гб и множественные каналы для передачи данных от компьютеров к дисковым накопителям. Множественные каналы обеспечивают избыточность. Если какая-либо компонента системы откажет (например, откажет канал ввода-вывода, контроллер или кэш), то подсистема ввода-вывода не прекратит свое функционирование. При тщательном планировании состава таких подсистем ввода-вывода, они могут обеспечить высочайший уровень производительности и надежности.

Лифтовая сортировка

Лифтовая сортировка (elevator sorting) – это метод для обеспечения большей эффективности операций произвольного ввода-вывода. Когда диск получает произвольные запросы ввода-вывода, головки должны перемещаться произвольным образом по дорожкам диска, внутрь и наружу. Из-за этих операций произвольного ввода-вывода возникают задержки, мы уже рассказывали вам об этом. Многие из RAID-контроллеров поддерживают лифтовую сортировку, благодаря которой поиск произвольных дорожек становится более эффективным. Когда на контроллере, поддерживающем лифтовую сортировку, собрались в очереди несколько запросов ввода-вывода, то операции ввода-вывода могут быть отсортированы таким образом, чтобы избавиться от лишних перемещений головок. Движения головок, оптимизированные при помощи лифтовой сортировки, напоминают движения лифта, забирающего попутных пассажиров при перемещении между этажами в нужном направлении.

Представьте, что было бы, если бы лифт обслуживал пассажиров строго в том порядке, в котором они нажимали бы на кнопки. Тогда лифт проезжал бы мимо нужных этажей, вместо того, чтобы остановиться и дать людям войти или выйти. Настоящий лифт работает более эффективно, потому что он делает остановки на нужных этажах. Алгоритмы лифтовой сортировки работают примерно так же. Если в очереди имеется более одной операции ввода-вывода, то контроллер найдет наиболее эффективный путь движения головок, который очистит очередь (рис. 5.7).

 Лифтовая сортировка


Рис. 5.7.  Лифтовая сортировка

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

Надежность дисков

Дисковые накопители являются одними из немногих компонент компьютера, имеющими подвижные детали. Диск вращается с большой скоростью и работает нагретым до высокой температуры. Среди деталей накопителя имеются несколько двигателей и подшипников, которые рано или поздно, но обязательно износятся. Среди технических характеристик дискового накопителя имеется средняя продолжительность наработки на отказ (MTBF, mean time between failures). Данная техническая характеристика показывает, сколько в среднем прослужит этот накопитель. Однако это число показывает лишь среднее время. При одинаковой средней продолжительности наработки на отказ срок службы у разных дисков будет неодинаковым. Типичные современные диски могут иметь среднюю продолжительности наработки на отказ равную миллиону часов, т.е. 114 годам. Это долгий срок, но некоторые диски с таким показателем MTBF прослужат гораздо дольше, а некоторые – сломаются очень быстро. Дело в том, что диски содержат подвижные детали, и поэтому они подвержены износу и могут ломаться.

Обзор типовых уровней RAID

Главной особенностью массивов RAID является то, что логический диск формируется из двух или нескольких физических дисковых накопителей и воспринимается Windows 2000 (и Performance Monitor) как один физический дисковый накопитель. Логический дисковый накопитель может содержать многие сотни Гб данных, хотя изготовлять дисковые накопители емкостью в 100 Гб не удается (пока что!).

Большинство уровней RAID, о которых мы вам расскажем, применяют расслоение данных (data striping), при помощи которого данные с двух или нескольких дисков объединяются в один большой логический RAID-диск. Это делается так: первый фрагмент данных берется с первого диска, второй кусок данных – со второго диска, и так далее. Эти фрагменты данных называются слои (stripes) или куски (chunks). Размер слоев данных задается контроллером. Некоторые контроллеры разрешают вам конфигурировать размеры слоев, а некоторые применяют слои фиксированного размера.

Название "слой" ("кусок") применяется как к фрагментам данных на каждом из отдельных дисков, так и к набору слоев (кусков) для всей совокупности дисков (рис. 5.8).

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

  Слои RAID


Рис. 5.8.  Слои RAID

Уровень RAID – это обозначение типа конфигурации массива RAID, поэтому он определяет характеристики массива RAID, не описываемые алгоритмами, содержащимися во внутренних или внешних логических компонентах. Одной из наиболее важных характеристик, определяемых уровнем RAID, является отказоустойчивость. Отказоустойчивость – это способность системы RAID продолжать работать даже после отказов дисковых накопителей, входящих в ее состав. Отказоустойчивость является основной целью, ради которой создаются контроллеры RAID. Так как ваши данные представляют ценность, то вам следует защищать их от возможных отказов дисков. В данном разделе мы изучим наиболее широко применяемые уровни RAID: как они работают, какая у них отказоустойчивость и насколько быстро происходит ввод-вывод данных. Помимо этих уровней RAID, есть и другие, но они применяются редко и мы не будем их рассматривать. Мы расскажем лишь о наиболее широко применяемых уровнях RAID.

RAID 0

RAID 0 являются самым "фундаментальным" из уровней RAID, он обеспечивает только расслоение дисков. Куски данных создаются на каждом из дисковых накопителей, а размер кусков задается контроллером. Для составления большого логического диска применяется метод кругового распределения кусков данных по отдельным дискам массива RAID 0 (рис. 5.9).

 RAID 0


Рис. 5.8.  RAID 0

Хотя RAID 0 и причисляется к массивам RAID, однако данный уровень RAID не обеспечивает избыточности (redundancy, вспомните расшифровку аббревиатуры RAID: Redundant Array of Independent Disks ). Раз избыточности нет, то и отказоустойчивость тоже отсутствует. Если в массиве RAID 0 откажет хотя бы один диск, то все данные будут потеряны. Отказ одного из дисков будет сравним с уничтожением каждого четвертого слова в книге. Если произойдет такая потеря данных, то массив RAID станет бесполезным.

Рекомендации по применению RAID 0

Как правило, нельзя рекомендовать применять RAID 0 для хранения файлов данных SQL Server. Так как данные в базе данных очень важны для вашего бизнеса, то их потеря может погубить вашу фирму. Массивы RAID 0 не защищают от отказов дисков, поэтому вам не следует применять их ни для каких критически важных компонент, таких как операционная система, журнал транзакций или файлы базы данных.

Примечание.Диски вращаются с большими скоростями и работают в условиях высоких температур. Так как они содержат подвижные детали, то когда-нибудь они обязательно сломаются. Поэтому важно, чтобы файлы данных SQL Server были бы защищены от отказов дисков при помощи отказоустойчивой системы.
RAID 1

RAID 1 являются "фундаментальным" уровнем RAID, обеспечивающим отказоустойчивость. В алгоритме RAID 1, называющемся также "зеркальное отражение", предусмотрено изготовление дублирующей копии вашего диска с данными. Дублирующая копия содержит ту же самую информацию, что имеется и на первоначальном диске (рис. 5.10). При отказе диска в строй вступит диск-дубль, и вы не потеряете данные. Так как на каждом диске (и на первоначальном, и на зеркале) хранятся все данные, то расслоение данных отсутствует. В RAID 1 второй диск применяется для дублирования первого, поэтому общий объем логического тома RAID 1 совпадает с объемом одного дискового накопителя. RAID 1 является дорогостоящим решением: при удвоении количества применяемых дисков вы взамен не получаете никакого увеличения объема дисковой памяти, но зато он обеспечивает высокий уровень отказоустойчивости.

 RAID 1


Рис. 5.10.  RAID 1

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

Запись данных на оба диска также снижает производительность логического дискового накопителя. При подсчете количества операций ввода-вывода, производимых на всех дисках массива, нужно умножать количество записей на 2. Чтение данных производится только с одного из дисков. Скорости работы дисков могут отличаться, потому что головки одного из дисков могут оказаться в другом положении, чем головки другого диска, и из-за этого время поиска нужной дорожки может оказаться более длительным. Положение головок может быть разным из-за функции уровня RAID 1, называющейся параллельный поиск (split seek).

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

Рекомендации по применению RAID 1

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

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

RAID 5

RAID 5 являются отказоустойчивым уровнем RAID, в котором для защиты данных применяется контроль по четности. Каждый слой данных (stripe) RAID создает информацию для контроля по четности, хранимую на одном из дисков в составе слоя. В сочетании с другими дисками в составе слоя RAID, информация для контроля по четности может быть использована для воссоздания данных с любого из дисков слоя. Поэтому массивы RAID 5 устойчивы к отказу одного из дисковых накопителей, входящего в состав массива. Информация для контроля по четности распределяется поочередно по всем дискам массива RAID (рис. 5.11).

 RAID 5


Рис. 5.11.  RAID 5

Достоинством RAID 5 является то, что дисковая память, доступная при применении этого уровня RAID, составляет (n-1)*(объем одного диска) где n равно количеству дисков в массиве. Так, массив RAID 5, составленный из 10 дисков, будет иметь объем, как у 9 дисков, что делает его экономичным и в то же время отказоустойчивым решением.

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

Контроль по четности в массивах RAID 5

В массивах RAID 5 для данных каждого из слоев на каждом из дисковых накопителей создается бит контроля по четности. Бит контроля по четности является дополнительным элементом данных, благодаря которому, имея биты из набора данных, по которому он был создан, можно узнать другие биты из набора данных. Бит контроля по четности создается так: все остальные биты суммируются, а затем определяется, какое значение он должен иметь, чтобы получилось четное (или нечетное число). Бит контроля по четности, в сочетании с остальными битами, может применяться, чтобы восстановить значение потерянного бита.

Давайте разберем работу контроля по четности на примере. В нашем примере мы будем считать, что система RAID 5 содержит пять дисковых накопителей.

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

В нашем примере будем считать, что контроль по четности должен обеспечить четность суммы битов, т.е. сумма всех битов должна давать результат 0 (имеется в виду сложение по модулю 2, т.е. результат сложения битов должен быть четным. – Прим. пер.). Если первый бит первого диска равен 0, первый бит второго диска равен 1, первый бит третьего диска равен 1, первый бит четвертого диска равен 1, то бит контроля по четности для этих битов должен быть равен 1, чтобы дополнить эти биты до четного числа (см. табл. 5.2).

Таблица 5.2. Пример контроля по четности для массива RAID
диск 1: бит 1диск 2: бит 1диск 3: бит 1диск 4: бит 1диск 5: бит контроля по четностиСумма битов
011114(четная)

Контроль по четности следует понимать как действия, применяемые к отдельным битам. Хотя слой диска содержит много битов, контроль по четности для отдельных битов позволит восстановить все данные. Биты контроля по четности, перечисленные в табл. 5.2, создаются на самом деле по отдельным битам, составляющим слои данных. Несмотря на то, что дисковые накопители разбиваются на куски данных (слои), с возможными размерами по 64 Кб и более, но контроль по четности, как мы вам показали, может быть произведен на уровне отдельных битов. На самом деле контроль по четности вычисляется при помощи алгоритмов более сложных, чем тот, который мы сейчас описали.

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

Создание данных для контроля по четности

Как мы уже объяснили в данном разделе, данные контроля по четности, применяемые в массивах RAID 5, составляются из битов, дополняющих до четного числа сумму одинаково отстоящих от начала битов всех дисковых накопителей. Но вам, конечно,понятно, что было бы непрактичным, чтобы контроллер массива считывал бы все данные со всех дисковых накопителей при каждой операции ввода-вывода. Это было бы неэффективно и медленно.

При создании массива RAID 5 происходит первоначальное обнуление данных и создание битов контроля по четности. В результате создается набор дисковых накопителей без данных, но с полным набором битов контроля по четности.

С этого момента, всякий раз при записи данных на дисковый накопитель, должно производиться чтение данных с диска данных и с диска контроля по четности. Новые данные должны сравниваться со старыми данными, и если какой-либо бит данных поменялся, то данные контроля по четности для этого бита тоже должны быть изменены. Эта проверка производится при помощи логической операции "исключающее ИЛИ" ( XOR, exclusive OR ).Поэтому требуется чтение данных только с диска данных и диска контроля по четности, а не со всех дисков массива. Как только описанная операция вычисления изменений данных контроля по четности будет завершена, запись должна быть произведена на оба диска, т.к. операция с данными контроля по четности затрагивает весь слой данных. Таким образом, для выполнения каждой записи в том RAID 5 производятся четыре физических операции ввода-вывода: два чтения (одно – чтение с диска данных, другое – чтение с диска контроля по четности) и две записи (сами данные и данные контроля по четности). Но в массивах RAID 5 данные контроля по четности равномерно распределены по всем дисковым накопителям, поэтому и нагрузка на накопители будет распределена равномерно.

Рекомендации по применению RAID 5

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

Как видите, RAID 5 является экономичным решением, но вы расплачиваетесь за это производительностью. А насколько велика может быть эта цена, вы узнаете из дальнейшего материала данной лекции.

RAID 10

RAID 10 является комбинацией RAID 0 и RAID 1. В RAID 10 применяется зеркальное дублирование слоев данных дисков. Для каждого диска создается дубль, но каждый диск содержит только часть всех данных (рис. 5.12). Этот уровень RAID обеспечивает отказоустойчивость, как у RAID 1, а удобства и производительность, как у RAID 0.

RAID 10


Рис. 5.12.  RAID 10

Как и у RAID 1, каждая операция записи RAID 10 потребует двух физических операций ввода-вывода – по одной операции записи на каждый диск зеркальной пары. Поэтому, при подсчете количества операций ввода-вывода в расчете на один диск, нужно умножать количество записей на 2. Как и для массивов RAID 1, для RAID 10 операции записи не считаются завершенными, пока не будут выполнены обе записи, это может увеличить длительность задержки записи. Но так же, как и для RAID 1, большинство контроллеров поддерживает параллельный поиск для RAID 10.

RAID 10 обеспечивает высокую степень отказоустойчивости. На самом деле, массив может остаться работоспособным даже при отказе более чем одного диска. Конечно, отказ дисков, входящих в зеркальную пару, приведет к потере данных. Если диски, входящие в разные зеркальные пары смонтированы по разным стойкам для оборудования, то отказ даже всей стойки не приведет к потере данных.

Рекомендации по применению RAID 10

RAID 10 обеспечивает высокую производительность и высокую степень отказоустойчивости. Уровень RAID 10 следует применять, когда нужна работа с большими томами, для которых операции записи составляют более 10% от общего объема операций ввода-вывода. Можно дать следующие рекомендации по применению RAID 10:

Уровень RAID 10 является наилучшим отказоустойчивым решением, он обеспечивает хорошую защиту данных и высокую производительность, однако затраты на него тоже большие. Вам придется приобрести диски в двойном количестве, по сравнению с RAID 0. Если же ваш том служит главным образом для чтения данных, то можно применять RAID 5.

Сравнение производительности уровней RAID

Для правильного конфигурирования и настройки вашей системы RAID, вам нужно понимать различия в производительности различных уровней RAID, о которых мы рассказали в предыдущем разделе. Если вы будете понимать, как работает система RAID и какие действия она осуществляет в различных ситуациях, вы лучше сможете настраивать свою подсистему ввода-вывода. В данном разделе мы внимательно сравним различные показатели производительности, с которыми вы познакомились в предыдущем разделе. В наших примерах мы будем считать, что отдельный дисковый накопитель может выполнять 85 операций произвольного ввода-вывода в секунду.

Производительность чтения

Производительность чтения не сильно зависит от выбранного вами уровня RAID. Когда операция чтения применяется к массиву RAID, то каждый диск вносит свой вклад в производительность по чтению. Так как для высокой производительности основным препятствием являются операции произвольного ввода-вывода, то мы сейчас рассмотрим эту тему. Вы можете максимально повысить производительность последовательного ввода-вывода, выделив их на отдельный том. Давайте посмотрим, как происходит произвольный ввод-вывод для различных уровней RAID:

Как видите, подсчитать производительность чтения массивов RAID совсем просто. Добавляя достаточное количество дисковых накопителей, так чтобы ваши потребности в производительности ввода-вывода соответствовали этим ограничениям, вы сможете оптимизировать производительность вашей системы.

Производительность записи

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

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

Подсчет количества операций ввода-вывода для дисков

Чтобы определить объем нагрузки, приходящейся на отдельные дисковые накопители системы, вам придется выполнить некоторые расчеты. Если вы пользуетесь аппаратным контроллером RAID, то количество операций ввода-вывода в секунду, показываемое монитором производительности Performance Monitor означает количество операций ввода-вывода, выполняемых массивом как единым целым. Вы не увидите сведений о дополнительных операциях ввода-вывода, генерируемых контроллером и служащих для обеспечения отказоустойчивости. Фактически, Windows 2000 не замечает их выполнения, но вы должны знать о них, чтобы правильно определить количество дисковых накопителей, необходимое для обеспечения оптимальной производительности.

RAID 0

В массивах RAID 0 темп операций ввода-вывода на один диск вычисляется как сумма всех операций чтения и записи для массива, деленная на количество дисков в массиве. Для RAID 0 нужна лишь одна простая и понятная формула:

количество операций на диск = (чтения + записи) / количество дисков

RAID 1

Для массивов RAID 1 вычисления будут несколько более сложными. Так как количество записей удваивается, то число операций ввода-вывода на один диск в секунду равно сумме количества операций чтения и удвоенного количества операций записи для массива, деленной на количество дисков в массиве (для RAID 0 – два). Нужно применять такую формулу:

количество операций на диск = (чтения + (2 * записи)) / 2

Запись в массивы RAID 1 происходит медленней, но они обеспечивают лучшую отказоустойчивость.

RAID 5

Массивы RAID 5 обеспечивают отказоустойчивость, но при записи у них получается очень большая нагрузка на диски. Операции чтения в массивах RAID 5 распределены по многим дисковым накопителям массива, но для записи приходится выполнять четыре физических операции ввода-вывода. Чтобы подсчитать количество операций ввода-вывода, приходящихся на один дисковый накопитель, надо сложить количество операций чтения и учетверенное количество операций записи, а затем разделить на количество дисков в массиве. Поэтому формула для RAID 5 будет такой:

количество операций на диск = (чтения + (4 * записи)) / количество дисков

RAID 10

Скорость записи в массивы RAID 10 такая же, как в RAID 1, но зато RAID 10 обеспечивает высокую степень отказоустойчивости. Расчет для RAID 10 аналогичен расчету для RAID 1. Поскольку количество записей удваивается, то число операций ввода-вывода на один диск равно сумме количества операций чтения и удвоенного количества операций записи для массива, деленной на количество дисков в массиве. Формула для RAID 10 будет такой:

количество операций на диск = (чтения + (2 * записи)) / количество дисков
Сравнение различных уровней RAID

Давайте сравним разные уровни RAID. Тогда вам станет легче понять, какой уровень RAID лучше подходит для вашей системы. Когда вы сравниваете производительность работы разных уровней RAID, одним из наиболее важных факторов, оказывающих влияние на нее, является соотношение чтения и записи. При выполнении операций чтения производительность различных уровней RAID отличается не сильно, различия относятся в основном к производительности операций записи. Также нужно учитывать, нужна ли вашей системе отказоустойчивость. И наконец, вам следует оценить соотношение стоимости системы и ее емкости. Характеристики для различных уровней RAID перечисленны в табл. 5.3.

Таблица 5.3. Сравнение уровней RAID
Уровень RAID Производительность ОтказоустойчивостьОценка стоимости
RAID 0НаилучшаяБез отказоустойчивостиЭкономичный
RAID 1ХорошаяХорошаяДорогой
RAID 5Быстрая для чтения, медленная для записиНормальнаяСамый экономичный из уровней, обеспечивающих отказоустойчивость
RAID 10ХорошаяХорошаяДорогой

Как видите, наилучший вариант зависит от ваших потребностей. Чтобы понять различие между производительностью RAID 5 и RAID 10 при разных соотношениях чтения и записи, посмотрите табл. 5.4, в которой показаны данные для массивов RAID 5 и RAID 10, выполняющих 500 операций ввода-вывода в секунду на 10 дисковых накопителях при разных соотношениях чтения и записи.

Таблица 5.4. Сравнение RAID 5 и RAID 10
Соотношение Чтения/Записи Операции ввода-вывода RAID 5 (Чтения + (4 * Записи)) /  Кол-во дисков Операции ввода-вывода RAID 10 (Чтения + (2 * Записи)) /  Кол-во дисков
100% чтений

0% записей

(500+0)/10

50 операций ввода-вывода на диск

(500+0)/10

50 операций ввода-вывода на диск

90% чтений

10% записей

(450+200)/10

65 операций ввода-вывода на диск

(450+100)/10

55 операций ввода-вывода на диск

75% чтений

25% записей

(375+500)/10

87.5 операций ввода-вывода на диск

(375+250)/10

62.5 операций ввода-вывода на диск

50% чтений

50% записей

(250+1000)/10

125 операций ввода-вывода на диск

(250+500)/10

75 операций ввода-вывода на диск

0% чтений

100% записей

(0+2000)/10

200 операций ввода-вывода на диск

(0+1000)/10

100 операций ввода-вывода на диск

Как видите, когда соотношение чтения к записи составляет 90%:10%, нагрузка на диски для RAID 5 и RAID 10 почти не отличается. Но когда запись составляет более высокий процент в операциях ввода-вывода, нагрузка на диски массивов RAID 5 становится гораздо больше.

Задержки ввода-вывода и SQL Server

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

Если длительность выполнения операций ввода-вывода слишком велика, то эти ресурсы будут блокированы недопустимо долго, еще сильнее замедляя работу системы. Кроме того, это повышает вероятность тупиковых ситуаций (взаимоблокировок). Чем дольше выполняются операции ввода-вывода, тем дольше длятся и блокировки и тем серьезнее становятся эти проблемы. И в результате отдельные задержки могут сложиться, вызвать "эффект снежного кома" и испортить работу системы.

Кроме того, обработка запросов станет очень медленной. Например, если на вашей системе выполняется сканирование больших таблиц, то для выполнения таких задач часто требуется чтение сотен, тысяч и даже миллионов строк в базах данных. Для миллиона операций ввода-вывода даже небольшие изменения производительности становятся очень важными. Выполнение одного миллиона операций по 10 мс займет около 2,8 часа. А если ваша подсистема ввода-вывода оказалась перегружена и каждая операция ввода-вывода требует 40 мс, то выполнение такого же запроса займет уже более 11 часов.

Как видите, производительность SQL Server может очень сильно пострадать из-за плохого начального проектирования или плохого конфигурирования подсистемы ввода-вывода. Если вы спроектируете свою подсистему ввода-вывода так, что она будет вписываться в возможности отдельных компонент, то производительность вашей системы будет оптимальной.

Планирование размещения дисков SQL Server

Из материала данной лекции ясно, что вы должны правильно спланировать свою систему ввода-вывода, чтобы не допускать ее перегрузки. Перегрузка подсистемы ввода-вывода повлечет увеличение задержек ввода-вывода и падение производительности SQL Server. В данном разделе вы изучите, как построить систему SQL Server, способную работать в рамках ограничений вашей подсистемы. Сначала вы научитесь определять требования вашей системы к вводу-выводу. Затем вы изучите планирование системы, а последним этапом будет само создание вашей системы.

Определяем требования к вводу-выводу

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

Объем дисковой памяти

Определить, сколько места на дисках потребуется для ваших данных, достаточно просто. Объем необходимого места равен сумме следующих величин:

Дисковая память, отводимая для данных, должна иметь достаточно места для хранения данных, которые будут добавлены в вашу базу данных. Рост базы данных в значительной степени определяется вашим бизнесом и вашими клиентами. Чтобы оценить рост вашей системы, можно проводить регулярные проверки существующей базы данных и подсчитывать, как изменился объем дисковой памяти, занимаемой базой данных. Темп роста базы данных должен измеряться несколько месяцев, чтобы можно было определить его закономерности. Рост базы данных может оказаться таким, что удивит вас.

Для новой системы, не имеющей истории, при оценке роста, среди прочих критериев, вы можете воспользоваться количеством заказов на продукцию, умноженным на размер строки. Взяв эти показатели для нескольких периодов времени (например, месяцев или лет), вы получите грубую оценку о скорости роста файлов с данными. Это не даст вам информации о росте индексов. Объем дисковой памяти, необходимой для индексов в расчете на одну строку данных, зависит от конструкции индексов и от объема данных. Для сложного индекса требуется больше места в расчете на одну строку данных, чем для простого индекса. И решение о том, сколько времени система должна существовать в условиях роста – два года, пять лет или дольше, – принимаете вы. Вот так производится оценка, с каким объемом дисковой памяти должна быть сконфигурирована ваша подсистема ввода-вывода.

Определившись с объемом данных, объемом индексов, объемом временной базы данных и с темпом роста, вы можете определить, сколько места на дисках вам потребуется. Затем вы должны учесть место, необходимое для обеспечения отказоустойчивости в массивах RAID. Помните, что в массивах RAID 1 и RAID 10 (с зеркальным дублированием данных) для обеспечения отказоустойчивости тратится половина физического места на дисках. В массивах RAID 5 для обеспечения отказоустойчивости тратится один дисковый накопитель, входящий в состав массива. Также помните, что объем дисков, указываемый изготовителями, обозначает емкость неотформатированного диска. Неотформатированный дисковый накопитель, маркированный, как имеющий емкость 9,1 Гб, после форматирования будет вмещать на самом деле 8,6 Гб.

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

Производительность

Недостаточно просто сконфигурировать систему так, чтобы она отвечала требованиям к объему необходимой дисковой памяти. Как вы уже знаете из материала данной лекции, конфигурация подсистемы ввода-вывода может серьезно ухудшить или значительно улучшить производительность вашей системы. Однако оценка требований к производительности совсем не так проста, как оценка требований к объему дисковой памяти.

Наилучшим способом оценки производительности является изучение аналогичных приложений или систем. Эти данные могут стать отправной точкой для оценки будущих требований. Дополнительную информацию об этом вы получите в лекции 6. Предположим, что вы нашли похожую систему. Тогда для определения необходимого количества дисков вы можете воспользоваться данными, собранными при исследовании этой системы, и информацией, которую вы знаете из данной лекции. Не забудьте учесть влияние уровня RAID, применяемого в той подсистеме ввода-вывода. Следующим этапом станет планирование размещения дисков SQL Server, а после этого можно будет осуществить реализацию вашего решения.

Планирование размещения дисков

При планировании размещения дисков принимаются решения о том, как данные должны быть размещены на дисках, а затем пишутся сценарии SQL, которые создадут базу данных. Достоинством создания базы данных при помощи сценариев SQL, а не при помощи SQL Server Enterprise Manager является то, что вы можете пользоваться ими многократно и вносить в них изменения.

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

Планирование размещения журнала транзакций

Планирование размещения журнала транзакций очень простое. Часто наилучшим решением является использование для журнала транзакций только одного файла данных. Если вам придется добавлять к своей базе данных дополнительные файлы журналов транзакций, не забудьте, что их следует размещать на томах RAID 1 или RAID 10. Также не забудьте, что файлы журналов транзакций должны храниться отдельно от данных и от других журналов транзакций.

Планирование размещения файлов данных

Самый простой способ сконфигурировать вашу подсистему ввода-вывода для файлов данных – это сконфигурировать каждый том как состоящий из одинакового числа дисковых накопителей одинакового размера. Во многих случаях вам не потребуется разбивать подсистему ввода-вывода на несколько томов. На самом деле, вы можете быть абсолютно довольны, имея один логический том с одним контроллером. Однако для охвата нескольких контроллеров не следует применять средства расслоения Windows 2000, потому что это вызывает очень большую нагрузку.

Совет. При планировании размещения файлов данных охватывайте контроллерами максимально возможное количество дисков. Благодаря этому контроллер сможет распределить данные по многим дискам. Не применяйте средства расслоения Windows 2000 для охвата нескольких контроллеров, т.к. это слишком сильно нагружает центральный процессор.

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

Например, если у вас имеется два тома, один – из 20 дисковых накопителей, а другой – из 10 накопителей, то нужно создать группу файлов из двух файлов данных. (О применении файлов и групп файлов см. лекцию 9.) Первый файл данных нужно поместить на 20-дисковый том, и он должен быть в два раза больше файла данных, размещаемого на 10-дисковый томе. При загрузке данных, SQL Server будет загружать в первый файл в два раза больше данных, чем во второй файл. Благодаря этому интенсивность ввода-вывода будет примерно одинаковой для всех дисков.

Реализация конфигурации

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

--
-- Сценарий SQL для создания базы данных, состоящей из нескольких файлов 
-- d:, e: и f: - для данных,  e: и f: имеют в два раза больше дисковых накопителей, 
-- чем имеется у d:, поэтому размер базы данных, распределенной для них в 
-- два раза больше, чем для d:.  l: используется для журнала. 
--

CREATE DATABASE demo 
ON
PRIMARY ( NAME = demo1,
      FILENAME = 'd:\data\demo_dat1.mdf',
      SIZE = 100MB,
      MAXSIZE = 200,
      FILEGROWTH = 20),
( NAME = demo2,
   FILENAME = 'e:\data\demo_dat2.ndf',
   SIZE = 200MB,
   MAXSIZE = 200,
   FILEGROWTH = 20),
( NAME = demo3,
   FILENAME = 'f:\data\demo_dat3.ndf',
   SIZE = 200MB,
   MAXSIZE = 200,
   FILEGROWTH = 20)
LOG ON 
( NAME = demolog1,
   FILENAME = 'l:\data\demo_log1.ldf',
   SIZE = 100MB,
   MAXSIZE = 200,
   FILEGROWTH = 20)
GO

Информация в данной лекции, особенно в данном разделе, поможет вам создать оптимальную подсистему ввода-вывода для вашей системы SQL Server. В следующем разделе даны несколько советов и рекомендаций, которые помогут вам создавать и исправлять подсистемы ввода-вывода.

Советы и рекомендации для подсистемы ввода-вывода

В данном разделе даны советы и рекомендации о том, как лучше всего организовать применение контроллеров RAID в вашей системе. Некоторые из этих советов и рекомендаций вы уже встретили при чтении данной лекции, а некоторые – новые. Будет замечательно, если некоторые из них помогут вам лучше конфигурировать и использовать свой массив RAID. Следуя этим советам и тщательно следя за состоянием системы, вы сможете избежать проблем с производительностью.

Заключение

Как вы узнали из данной лекции, подсистема ввода-вывода является чрезвычайно важной компонентой вашей системы управления базы данных. Теперь вы знаете, как работают дисковые накопители и каковы их ограничения. Зная пределы возможностей дисковых накопителей, вы сможете сконфигурировать свою систему так, чтобы она функционировала в рамках этих ограничений. Зная характеристики уровней RAID, вы сможете сконфигурировать систему так, чтобы воспользоваться достоинствами того или иного уровня RAID. При проектировании своей системы вы должны тщательно спланировать состав и настройку подсистемы ввода-вывода. Настройка ввода-вывода связана с мощностью. Если ваши компоненты будут работать в пределах своих возможностей, то система сможет достичь оптимальной производительности.

Лекция 6. Планирование мощности системы

Планирование мощности определяет расчет необходимых вашей системе ресурсов. Рассказывается о двух формах планирования мощности: предварительном и последующем. Различные нюансы каждой из форм планирования, акценты при непосредственном определении характеристик системы. Определение возможностей обработки транзакций. Планирование мощности памяти: определение размера кэша и минимальной памяти. Множество различных формул для быстрого подсчета необходимых характеристик системы. Советы профессионалов помогут не совершить наиболее распространенных ошибок. Особое внимание уделяется работе с Performance Monitor и подробное описание имеющихся счетчиков. Планирование мощности системы станет несложной задачей при хорошем усвоении лекции.

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

Виды планирования мощности

Планирование мощности имеет две формы: предварительное планирование мощности (pre-capacity planning) и последующее планирование мощности (post-capacity planning). В задачи предварительного планирования мощности, известного также под названием планирование состава системы (sizing), входит прогнозирование требований к аппаратуре, при соблюдении которых система сможет исполнять необходимую работу в заданные сроки (в соответствии с соглашением об уровне обслуживания (SLA, service level agreement)). Соглашения об уровне обслуживания гарантируют заданные длительности времени отклика для тех или иных функций системы, т.е. длительность исполнения каких-либо действий или транзакций.

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

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

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

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

Исследования, выполняемые при последующем планировании мощности, помимо упреждающего анализа дают чрезвычайно ценную информацию – они отвечают на вопросы "что, если...", касающиеся нагрузки на компьютер. Получив знания о том, как разные категории пользователей расходуют ресурсы системы, вы можете точно предсказывать нагрузку на ресурсы системы, зная категорию добавляемых пользователей (например, как повлияет появление новых сотрудников в отделе кредиторских задолженностей). Благодаря такому упреждающему анализу системный администратор получает достаточно времени, чтобы приобрести нужное оборудование, еще до того, как в системе появятся новые пользователи, избегая тем самым снижения производительности или удлинения времени отклика системы.

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

Исторический обзор планирования мощности

Во времена многопользовательских ЭВМ концепции планирования мощности и производительности не были осознаны и не получили развития. В начале 1970-х годов предварительное планирование мощности заключалось лишь в поиске потребителей, применявших приложения, которые "работали бы так же", как и нужное приложение. Находить таких потребителей было трудно, а сравнивать фирмы и организации и как у них работают приложения – еще труднее.

В середине 1970-х годов потребители и поставщики приложений разработали методики для анализа, предусматривавшие запуск тестовых задач, при помощи которых можно было оценить оптимальный первоначальный состав аппаратных компонент ЭВМ. Они создавали приложения, похожие на применяемые потребителями и запускали их на похожем оборудовании, собирая статистические данные о его работе. Затем эти статистические данные использовались для подбора состава ЭВМ, наиболее хорошо удовлетворяющего потребностям потребителей. Этот процесс тоже позволял ответить на вопросы "что, если...", при помощи запуска сценариев с тестовыми задачами, позволяющими определить, какой состав системы необходим при увеличении в системе числа пользователей, процессов приложений или при увеличении объема данных. Недостатком этого процесса была его дороговизна. Первые тестовые задачи, разработанные первоначально для моделирования типовой работы потребителей, стали применяться в основном поставщиками компьютерного оборудования в качестве маркетинговых средств при продажах ЭВМ и для сравнения производительности конкурирующего оборудования.

Во время этого периода аналитики создавали методики для предсказания использования ресурсов существующих систем. Внешне этот процесс казался менее интересным, но он оказался таким же сложным, так как не существовало ни методик тестирования, ни инструментальных средств для сбора нужных данных. Ученые-компьютерщики (такие как д-р Джеффри Бузен [Jeffrey Buzen] – родоначальник теории планирования мощности) еще только разрабатывали теории об использовании ресурсов компьютеров и исследовали вопрос, как можно выполнять эти вычисления.

С 1980-х годов первоначальные тестовые модели развились в тесты стандартных нагрузок, такие как тесты ST1, TP1 и Debit/Credit, но усилия в то время были направлены на выявление аппаратуры с наивысшей производительностью для рекламных целей, а не на разработку стандартных моделей нагрузки от приложений, которые можно было бы использовать при предварительном планировании и поддержке систем. Потребители еще не могли пользоваться этими тестами для сравнения аппаратуры систем, потому что они работали в различных ситуациях. В ответ на эти нужды потребителей возник консорциум представителей компьютерной промышленности, "Совет по производительности обработки транзакций" (Transactional Processing Performance Council). Этот Совет задал стандарты обработки транзакций для более чем 45 производителей оборудования и программного обеспечения. Эти тесты часто могут показать относительные возможности оборудования и программного обеспечения для баз данных; к сожалению, они не могут помочь при предварительном планировании нагрузки от работы приложений.

Примечание.Тесты Совета не годятся для предварительного планирования мощности, потому что они не отражают свойства настоящей рабочей нагрузки. Чаще всего они спроектированы для демонстрации производительности, например, для измерения количества транзакций, проходящих через систему в течение заданного времени. Эти тестовые транзакции имеют маленькие длительности и выполняют очень небольшие объемы работы, поэтому можно обработать очень большое их количество. Из-за большого количества обработанных транзакций складывается впечатление, будто системы, на которых работали эти тесты, – очень мощные, но на самом деле они только кажутся таковыми, из-за особым образом сконструированной модели рабочей нагрузки.

В это самое время подоспела архитектура "клиент/сервер" и технология реляционных баз данных, и потребность в предварительной оценке размера системы и в планировании мощности возросла. Большинство из современных приложений сейчас пишутся на основе архитектуры "клиент/сервер". Серверы обычно используют устройства для централизованного хранения данных, а пользовательский интерфейс обычно исполняется локально на настольных компьютерах пользователей или на удаленном веб-сайте. Эта экономная стратегия использования дорогих мощностей для обработки данных на сервере имеет еще одно достоинство: пользователи работают в уже привычных для них графических интерфейсах. Так как серверы, на которых работают приложения доступа к базам данных, используются очень интенсивно, то именно им уделяется основное внимание в большинстве проектов предварительного планирования мощности и исследований последующего планирования мощности.

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

Обработка транзакций

В данном разделе мы изучим, как выполнять анализ тенденций использования сервером базы данных ресурсов процессоров, памяти и дисков. Это нужно, чтобы правильно выбирать систему для нужного приложения. Сервер базы данных выполняет только функции работы с базой данных: при своей работе этот сервер выполняет только транзакции. При исполнении оператора SELECT или UPDATE сервер базы данных интерпретирует данные операторы как последовательности операторов чтения и записи. На самом деле, любая транзакция может быть разбита на чтения и записи в базу данных. На этом атомарном уровне сервер базы данных обрабатывает операции ввода-вывода. Нужно выбрать систему, способную обращаться с транзакциями различных видов и объемов, и с порождаемыми ими операциями ввода-вывода. Основными типами транзакций являются системы оперативной обработки транзакций (OLTP, on-line transaction processing) и системы поддержки принятия решений (DSS, decision support system).

Транзакции систем оперативной обработки транзакций

Транзакции систем оперативной обработки транзакций (OLTP) являются компонентами рабочей нагрузки, исполнение которых ожидается за короткие промежутки времени, так как они взаимодействуют с базой данных в режиме реального времени или в режиме "он-лайн". Другими словами, эти транзакции будут непрерывно обновлять базу данных, основываясь на наиболее свежей доступной информации, чтобы следующий пользователь мог бы быть уверен в том, что эта информация является наиболее свежей. Например, в системе ввода заказов вся информация, относящаяся к складскому учету, хранится в таблицах, распределенных по дисковой системе, и база данных может работать в режиме "он-лайн". Доступ к информации в базе данных получает каждый пользователь. Таблицы базы данных, такие как Таблица_изделий или Таблица_складских_запасов, содержат наиболее свежую информацию о разновидностях и об имеющемся количестве продаваемых товаров. Таким образом, когда поступает заказ на некоторое количество какого-либо товара, вы можете произвести доступ к таблицам базы данных, чтобы выяснить, имеется ли этот товар и сколько его осталось на складе, чтобы не продать отсутствующий товар.

Типичный сценарий предварительного планирования мощности для подобных систем обработки транзакций для сбора специальной информации предусматривает опрос людей. Вы должны провести беседы с проектировщиком базы данных, с разработчиком приложения и с представителем управленческого персонала. Эти люди могут дать начальные и корректирующие сведения о предполагаемом объеме обрабатываемых транзакций и о времени суток, когда предполагается обработка этих транзакций (например, 25 тысяч транзакций должны быть обработаны в течение 8-часового рабочего дня), сведения о количестве одновременно работающих пользователей, о времени пиковой нагрузки (времени суток, когда нагрузка на систему максимальна). Возможно, эти опросы окажутся самой важной частью процесса предварительного планирования мощности.

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

Банкоматы

Давайте в качестве примера рассмотрим систему с банкоматами. Допустим, национальный банк нанял вас спроектировать систему банкоматов для своего чикагского отделения. В результате опросов вы могли узнать, что пиковая нагрузка на сеть банкоматов приходится на время с 11 часов утра до 2 часов дня – в то самое время, когда большинство людей идут обедать. Зная эту информацию, вы сможете спроектировать свою систему так, чтобы она могла выдержать период пиковой нагрузки.

Транзакции систем поддержки принятия решений

Другим типом систем обработки транзакций являются системы поддержки принятия решений (DSS). Транзакции систем поддержки принятия решений возвращают большие объемы информации и требуют для своей обработки гораздо больше времени, чем транзакции OLTP. Для обработки транзакции DSS могут понадобиться часы или даже дни. В качестве примера системы поддержки принятия решений можно привести архив складских запасов, запись в который производится редко, только при его обновлениях. Такие системы обычно снабжают информацией сотрудников-управленцев, чтобы они могли принимать важные решения, например, о развитии бизнеса или о необходимом уровне складских запасов. В качестве другого примера можно привести используемую военно-воздушными силами США систему поддержки принятия решений, информирующую руководящий состав ВВС о текущем состоянии, расположении и вооружении реактивных истребителей, бомбардировщиков и людей.

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

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

Как знают системные аналитики, в системах этого типа обычно достигается 100-процентное использование центрального процессора и других системных ресурсов, поэтому вопрос состоит не в загрузке системы работой, а в сроках обработки запросов системой. Есть такое практическое правило при проектировании систем DSS: распределяйте, насколько это возможно, систему по имеющемуся оборудованию. Другими словами, вы должны не просто иметь количество дисков, достаточное для того, чтобы база данных помещалась бы на них, а спланировать размещение базы данных по многим томам, чтобы рассеять по ним активность ввода-вывода. Насчет оперативной памяти в этом отношении никакие подобные меры не понадобятся, потому что кэширование к ней почти не применяется. (Для обработки транзакций DSS потребуются полные сканирования таблиц, т.е. просмотр таблиц будет начинаться от их начал и продолжаться пока они не будут полностью обработаны.)

Практические советы

Квартальные продажи

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

Принципы планирования мощности

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

Примечание. Установившимся режимом называют ожидаемую нагрузку на центральный процессор в течение вашего рабочего дня. Если вы предполагаете, что в течение рабочего дня процессор будет использоваться на 55%, то это и есть установившийся режим. Если в этот день был час, в течение которого процессор был загружен на 90%, то этот час называется периодом пиковой нагрузки.

Если вы знаете максимальное количество транзакций, которые будут выполняться в течение рабочего дня и знаете длительность рабочего дня, то вы сможете подсчитать среднее количество транзакций за единицу времени. Однако, так как вы не знаете истинного темпа, в котором будут поступать транзакции, то предварительное планирование мощности системы надо выполнять с "встроенным" резервом мощности. Та часть мощностей системы, которая оставлена как резерв на периоды повышенной рабочей нагрузки, называется резервная мощность.

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

Использование мощности центрального процессора

Еще одна причина, по которой надо создавать и поддерживать резерв мощности компьютера, связана с теорией "загиба кривой" (knee of the curve theory). Если объяснять просто, эта теория предсказывает, что загруженность системы работой непосредственно влияет на образование очередей, а так как длина очередей непосредственно связана со временем отклика (фактически, длина очередей является частью формулы для расчета времени отклика), то загруженность системы оказывает непосредственное влияние на время отклика. Загибом кривой называется точка, начиная от которой такие показатели, как время отклика или длительность очередей, переходят от линейного роста к экспоненциальному или асимптотическому (с уходом в бесконечность при приближении нагрузки к некоторому конечному значению) росту.

Практические советы

Использование мощности и время отклика на примере супермаркета

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

Предположим ту же ситуацию, но в 5 часов вечера, время наибольшей нагрузки на супермаркет. Теперь, когда вы подойдете к кассе, перед вами будут стоять в очереди восемь человек (т.е. длина очереди равна 8). Теперь ваше время отклика будет равно сумме времен отклика каждого из восьми людей перед вами (которые могут варьировать в зависимости от количества покупок, от оплаты банковским чеком или наличными и т.д.) плюс ваше собственное время обслуживания. Использование мощности кассира в 5 часов вечера тоже гораздо больше, чем в 3 часа утра, непосредственным следствием чего и является рост очереди и, следовательно, общее время вашего ожидания (время отклика).

Сравнение линейного и экспоненциального роста

Обычно мы стремимся добиться, чтобы система работала в линейном режиме, т.е., чтобы рост очередей был бы линейным. Из рисунка 6-1 видно, что линейный рост является равномерным ростом очередей в зависимости от роста загруженности системы. Согласно одному практическому правилу, рост очередей остается линейным, пока центральный процессор используется не более чем на 75%.

Впрочем, иногда при установившемся режиме центральный процессор может быть загружен и более чем на 75%. У такой работы имеются некоторые недостатки – в частности, из-за такой высокой загруженности рост длины очередей может стать экспоненциальным. Экспоненциальный рост – это рост в геометрической прогрессии (см. рис. 6.2).

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

Линейная зависимость от загруженности центрального процессора


Рис. 6.1.  Линейная зависимость от загруженности центрального процессора

Экспоненциальный рост в зависимости от загруженности центрального процессора


Рис. 6.2.  Экспоненциальный рост в зависимости от загруженности центрального процессора

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

Время отклика

График на рис. 6.3 показывает, как использование мощностей центрального процессора влияет на время отклика. Обратите внимание на то, как похожи графики времени отклика и длины очереди. Наличие на обоих графиках точек загиба, после которых происходит резкое увеличение времени отклика, показывает, что никогда не следует применять установившийся режим с загруженностью центрального процессора более 75%. Это не значит, что процессор никогда не будет работать с загруженностью более 75%, но чем дольше это будет происходить, тем больше негативных последствий вызовет (в отношении длины очередей и длительности отклика).

Зависимость времени отклика от загруженности центрального процессора


Рис. 6.3.  Зависимость времени отклика от загруженности центрального процессора

Недопущение выхода за точку загиба кривой (в нашем примере – 75% мощности процессора) является одним из наиболее важных принципов предварительного планирования мощности, и его нужно соблюдать при определении количества центральных процессоров, нужных для вашей системы. Например, допустим, при предварительном планировании мощности системы, вы оценили, что потребность в ресурсе процессора составит 180% от мощности процессора. Вы можете мучиться из-за очень плохой производительности, а можете запустить два процессора с 90% загруженностью их мощности (на 15% выше точки загиба кривой). Но еще лучше было бы запустить три процессора, загрузив их на 60% мощности, тогда их загруженность будет на 15% ниже точки загиба кривой.

Этот же принцип применяется и к другим элементам системы, например, к дискам. У графиков для дисков точка загиба расположена не так, как у графиков для процессоров, она находится где-то при 85% загруженности их мощности. Эта пороговая величина (85%) относится и к вместимости, и к производительности ввода-вывода дисковых накопителей. Например, 9 Гб диски не должны содержать более 7,65 Гб данных, хранящихся на нем одновременно. Это ограничение на объем хранимых данных может послужить как резерв для роста, но оно более важно для сокращения времени отклика, потому что время поиска для дисков, заполненных полностью, становится больше, увеличивая тем самым суммарное время отклика. В соответствии с этим же правилом, если дисковый накопитель имеет производительность обмена данными 70 операций ввода-вывода в секунду, то его не следует применять в условиях, когда темп ввода-вывода постоянно превышает 60 операций ввода-вывода в секунду (при установившемся режиме работы). Следуя этим правилам, вы сможете минимизировать суммарное время отклика и получить наибольшую производительность своей системы, так как ваши процессоры и диски используются не с полной загруженностью. Кроме того, ваша система сохранит резервы мощности, которые пригодятся при работе в периоды пиковых нагрузок.

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

Для процессора и дисков надо не допускать превышения их загруженности выше точки загиба, это важный принцип предварительного планирования мощности. А что можно сказать о памяти? Для предварительного планирования памяти нужно рассмотреть обращения к отсутствующим страницам виртуальной памяти (page faulting). Обращения к отсутствующим страницам – это нормальное явление при обычном функционировании системы, оно применяется для доступа к данным на диске. Если системе потребуется что-нибудь из памяти (страница с кодом программы или с данными) и будет иметься нужная страница памяти, то произойдет логическое событие ввода-вывода, означающее, что код или данные считываются из памяти, и транзакция, которой понадобился этот программный код или данные, будет обработана.

А что произойдет, если нужного кода или страницы с данными не окажется в памяти? В этом случае придется выполнить физический ввод-вывод и прочитать нужную страницу с диска. Эта задача выполняется при помощи обращения к отсутствующей странице. Система, если в ее рабочем наборе оперативной памяти не найдется нужная страница с кодом программы или с данными, выдаст прерывание обращения к отсутствующей странице (page fault interrupt). Обработка обращения к отсутствующей странице прикажет другой части системы доставить программный код или данные с физического диска. Другими словами, если нужная вашей системе страница с кодом или данными отсутствует в памяти, то система выполнит обращение к отсутствующей странице, которое прикажет другой части системы выполнить физическую операцию ввода-вывода и доставить нужную страницу с диска. Обращение к отсутствующей странице не повлечет доставку нужной страницы с диска, если эта страница находится в списке резерва (standby list) и, следовательно, уже находится в оперативной памяти, или если она находится в пользовании у другого процесса, с которым она может совместно использоваться (разделяться).

Существует два типа ввода-вывода: пользовательский и системный. Пользовательский физический ввод-вывод происходит, когда пользовательская транзакция просит прочитать данные, которые нашлись в памяти. Происходит простая передача данных с диска в память. Такая передача данных обычно выполняется какой-либо программой для управления потоком данных (data flow manager), дополненной функциональными возможностями контроллера дисков. Системный физический ввод-вывод происходит, когда система запрашивает страницу с программным кодом, нужным для выполняемого ею процесса, а этой страницы нет в памяти. Тогда система выдает прерывание обращения к отсутствующей странице, препятствующее продолжению работы до тех пор, пока с диска не будет доставлена нужная страница. После доставки этой страницы обработка будет продолжена. Обе эти разновидности физического ввода-вывода удлиняют время отклика, потому что время, необходимое на доставку данных из оперативной памяти, занимает микросекунды (миллионные доли секунды), а физический ввод-вывод занимает миллисекунды (тысячные доли секунды). Так как обращения к отсутствующим страницам вызывают физический ввод-вывод, который увеличивает длительность времени отклика, то при минимизации обращений к отсутствующим страницам будет достигаться лучшая производительность системы.

В вашей системе могут возникать три типа обращений к отсутствующим страницам:

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

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

Страничный обмен. При внесении изменений в страницу данных (в результате чего она становится "недействительной" (dirty page, "черновой" страницей)), производится двухэтапный обмен страниц (page fault swap), при котором система не только доставляет новые данные с диска, но и записывает измененные данные из памяти на диск. Для выполнения этого двухэтапного обращения к отсутствующей странице потребуется две физических операции ввода-вывода, но это гарантирует сохранение всех измененных данных. Если обмен страниц будет происходить слишком часто, то он может стать единственным наиболее значительным фактором, ухудшающим длительность времени отклика. Помните, что при обмене страниц происходит передача данных целиком всей страницы, даже если на самом деле нужно передать лишь несколько байтов. Обмены страниц, вызванные обращениями к отсутствующим страницам, требуют больше времени, чем просто обращения к отсутствующим страницам, потому что для них требуется по два физических ввода-вывода. Поэтому вы в своей системе должны стараться минимизировать количество обменов из-за обращений к отсутствующим страницам.

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

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

Планирование мощности памяти

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

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

Рассчитывая объем памяти, нужной для вашей системы, вы также должны учесть такие характеристики, как желательную частоту удачных обращений к кэшу и обращений к отсутствующим страницам. Рассмотрим типичный сценарий: вы участвуете в проектировании системы для сервера базы данных, которая будет применяться для заказов в режиме реального времени, и вам надо знать количество одновременно работающих пользователей, из-за которых возникает рабочая нагрузка. Эта информация поможет вам определиться с необходимым вам объемом оперативной памяти. Например, вы знаете, что в каждый момент времени с системой будут одновременно работать 50 пользователей. Для такой системы вам потребуется 25 Мб памяти только для пользователей.

Примечание. Обычно для каждого из пользователей требуется выделять по 500 Кб памяти, потому что эта память необходима для теневого процесса (shadow process) пользователя. Теневой процесс – это пользовательский процесс, который имеется для каждого из пользователей системы.

Затем вам надо знать, какую операционную систему вы будете применять. В нашем случае эта операционная система – Microsoft Windows 2000, для которой нужно 20 Мб памяти. Поэтому теперь вам понадобится уже 45 Мб памяти. Вам также надо будет узнать размер программы базы данных, которая будет у вас работать, в нашем случае – Microsoft SQL Server, для которого нужно 5,5 Мб памяти. Итого теперь требуется 50,5 Мб памяти.

И последняя информация, которая вам понадобится, – размер области памяти для обработки базы данных. Эта область состоит из двух элементов: области журнала и кэша базы данных. Область журнала содержит информацию о выполняющихся действиях записи. Эта область очень важна, потому что в случае сбоя системы во время исполнения транзакции в ней сохранится информация для восстановления образа данных перед транзакцией, т.е. образа базы данных, бывшего до того, как произошел сбой. Область журнала имеет также названия "аудиторский след", "контрольный журнал" (audit trail).

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

Для расчета размера кэша воспользуйтесь следующей формулой:

размер кэша  =  (размер блока кэша) х (количество блоков в кэше)

Размер блока кэша – это объем данных, передаваемых при одной операции ввода-вывода. Помните, что в SQL Server уже задан стандартный размер блока кэша, равный 8 КБ. Количество блоков в кэше – это просто выбираемый вами размер кэша (в блоках). Для систем оперативной обработки транзакций (OLTP) размер блока следует выбирать поменьше, потому что объем передаваемых данных – небольшой, а чем меньше объем передаваемых данных, тем меньше будет и время, необходимое для исполнения транзакции. В системах поддержки принятия решений (DSS) размер блока должен быть гораздо больше, потому что объем передаваемых данных будет гораздо больше, из-за чего уменьшится количество операций ввода-вывода.

Примечание. Никакая настройка размера кэша не может гарантировать успешность обращений к кэшу от 90% и выше. Есть хорошее практическое правило, согласно которому для малых систем надо иметь кэш размером около 25 Мб, для систем среднего размера – 70 Мб, а для больших систем – 215 Мб. Для систем с очень большими базами данных (около 300 Гб) для получения желаемого процента попадания в кэш понадобится кэш объемом около 3 Гб.

Теперь, пользуясь собранной информацией, мы можем вычислить минимальный необходимый объем памяти. Для расчета минимального объема памяти, необходимого для вашей системы, обычно пользуются следующей формулой:

минимальная память = (системная память) + (пользовательская память) + 
  +(память процесса базы данных)

Здесь системная память – это объем памяти, необходимой для операционной системы и SQL Server, пользовательская память – это по 500 Кб памяти, выделяемых каждому из одновременно работающих пользователей, а память процесса базы данных – это память, необходимая для журнала и кэша.

Эта простая формула может применяться для расчета минимального необходимого объема памяти, нужного для нормальной работы как приложений оперативной обработки транзакций (OLTP), так и для систем поддержки принятия решений (DSS). Для систем DSS нужно выбирать более крупные размеры блоков кэша, потому что приложения DSS выполняют полное сканирование таблиц в режиме последовательного чтения. Увеличив размер блока, можно увеличить количество записей, считываемых за одну физическую операцию ввода-вывода. Для систем DSS кэш не используется, потому что все операции ввода-вывода будут физическими.

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

Примечание. Следует стремиться приблизить успешность попаданий в кэш к 100%, насколько это возможно (и этот показатель не должен быть меньше 90%).
Сбор данных об использовании памяти

После того как система, для которой производилось предварительное планирование, будет сконфигурирована и настроена, вам надо будет методично собирать данные об использовании ее памяти. Эти данные можно использовать для проверки соответствия созданной вами системы требованиям соглашения об уровне обслуживания, таким как время отклика или загруженность памяти и центрального процессора. Данные можно собрать при помощи просто Microsoft Performance Monitor (Монитора производительности) для среды Microsoft Windows NT.

Примечание. В Microsoft Windows 2000 "монитор производительности" называется не Performance Monitor, а System Monitor.

Помните, что данное исследование является анализом для планирования производительности и поэтому должно производиться достаточно долго. Измерения будут длиться часами (в большинстве случаев – 24 часа), и интервал измерений тоже должен быть установлен равным 24 часам. Для задач планирования производительности нужно заносить в базы данных о производительности по одной записи в сутки. Критерии производительности, называющиеся счетчики (counters), выбираемые вами для мониторинга, будут усредняться по интервалам измерений. Счетчики для планирования мощности памяти, находятся в объекте Memory (в "мониторе производительности" объектом называется набор счетчиков).

Примечание. Чтобы запустить Performance Monitor (Монитор производительности) нажмите сначала мышью на экранную кнопку Start. Затем выберите Programs, Administrative Tools (Common) и Performance Monitor. В окне Performance Monitor в меню Edit выберите Add To Chart (Добавить к схеме). Диалоговое окно Add To Chart может применяться для выбора объектов и счетчиков, которые нужно отслеживать. Для получения дополнительной информации нажмите на кнопку Help в окне Performance Monitor.

Среди счетчиков монитора производительности имеются следующие:

Примечание. Счетчик Available Memory можно просматривать в окне монитора производительности Performance Monitor в составе объекта Memory. Кроме того, в мониторе производительности Windows 2000 Server этот счетчик представлен трижды: Available Bytes, Available Kbytes, Available Mbytes. Также он доступен из Task Manager’а (Диспетчер задач), если открыть вкладку Performance и наблюдать за доступной памятью в течение периода пиковой нагрузки. (Чтобы получить доступ к Task Manager, нажмите правой кнопкой мышки на панель задач и выберите Task Manager в контекстном меню.)

Вам следует хотя бы включить в общий процесс сбора данных для планирования мощности, наблюдение за счетчиками Available Memory и Page Faults/sec.

Анализ данных о памяти

После сбора данных их можно отобразить в графической форме, чтобы предсказать, какими они станут в будущем. График на рисунке 6-4 показывает пример упреждающего анализа. В этом примере показаны данные о свободной памяти, собранные с 22 октября 1999 года по 14 января 2000 года. При помощи Microsoft Excel эти данные были нанесены на график и построена линия тренда. Зубчатая линия обозначает историю фактического использования памяти, а прямая линия обозначает линейный тренд использования памяти. Как видите, этот анализ предсказывает, что 18 февраля 2000 года у системы останется менее 6% свободной памяти.

График на рис. 6.5 показывает увеличение обращений к отсутствующим страницам виртуальной памяти за тот же период, а также демонстрирует, что по мере уменьшения объема свободной памяти число обращений к отсутствующим страницам увеличивается.

Объем свободной памяти (линейная закономерность)


Рис. 6.4.  Объем свободной памяти (линейная закономерность)

Обращения к отсутствующим страницам (линейная закономерность)


Рис. 6.5.  Обращения к отсутствующим страницам (линейная закономерность)

Обратите внимание на то, что данные о количестве обращений к отсутствующим страницам виртуальной памяти за секунду собирались за тот же период времени, что и данные о свободной памяти. Снова воспользуемся Microsoft Excel, чтобы записать эти данные и отобразить их на графике. Зубчатая линия снова обозначает историю фактического изменения показателя, а прямая линия обозначает линейный тренд этого показателя. В нашем случае график предсказывает, что 18 февраля 2000 года у системы будет происходить более шести обращений к отсутствующим страницам в секунду. Значит, и после этой даты число обращений будет увеличиваться и это может привести к нарушению соглашения об уровне обслуживания. Рассмотренный метод упреждающего анализа является простым и эффективным способом слежения за ресурсами памяти.

Планирование мощности процессора

Теперь, когда мы выполнили предварительное планирование и анализ для памяти, пора выполнить такие же работы и для процессора. К настоящему моменту мы можем принять следующие предположения о работе нашей системы:

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

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

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

Для уже работающих систем пользователи могут определить профили транзакций, запуская транзакции по одной за раз и следя за ними через Performance Monitor (чтобы определить количество генерируемых операций чтения и записи). Эта "натурная" информация может применяться для подбора скорости, типа и количества используемых центральных процессоров.

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

Отказоустойчивость

Сейчас большинство компьютерных фирм добиваются отказоустойчивости при помощи поддержки технологии RAID (Redundant Array of Independent Disks, "массивы независимых дисковых накопителей с избыточностью"). (О технологии RAID см. лекцию 5.) Запомните, что чаще всего применяются следующие уровни RAID:

Так как в RAID 0 не применяется дублирование данных, то для них достаточно одиночного повреждения – при отказе дискового накопителя вы потеряете данные на нем и, следовательно, во всей базе данных. Схема массива RAID 0 показана на рис. 5.9. В RAID 1 обеспечивается зеркальное дублирование диска базы данных. При отказе какого-либо дискового накопителя остается резервный накопитель, весь заполненный данными, такими же, какие были и на отказавшем дисковом накопителе. Если вы решите применять массивы RAID 1, то можно воспользоваться достоинствами параллельного поиска (split seek, см. лекцию 5), благодаря которому система может выполнять поиск данных одновременно сразу на двух дисковых накопителях, что значительно повышает скорость поиска и, следовательно, уменьшает время отклика для транзакций. Схема массива RAID 1 показана на рис. 5.10.

Выбор уровня RAID непосредственно влияет на количество операций дискового ввода-вывода, т.к. разные уровни RAID отличаются количеством записей на диски. Например, для RAID 1 по сравнению с RAID 0 требуется в два раза больше записей на диск. Если пользователь задаст транзакцию, требующую 50 чтений и 10 записей, то при использовании RAID 1 количество записей вырастет до 20.

Если конфигурация RAID 0 имеет два дисковых накопителя, то равноценная конфигурация RAID 5 должна иметь три дисковых накопителя. В конфигурациях RAID 5 применяется слой данных (stripe), содержащий информацию о данных на двух других накопителях, который может быть использован для восстановления данных с отказавшего диска. Схема массива RAID 5 показана на рис. 5.11. Эта схема защиты базы данных хороша и по показателям производительности и по цене. Каждая запись в RAID 5 удваивает количество чтений и количество записей для каждой обрабатываемой транзакции, потому что каждая транзакция должна быть записана на два диска – должен быть прочитан слой контроля по четности, изменен в соответствии с новыми данными, а затем снова записан. Эта избыточность несколько увеличивает длительность времени отклика.

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

Для RAID 0:

количество операций ввода-вывода = (количество чтений на одну транзакцию) + 
+(количество записей на одну транзакцию)

Если транзакция содержит 50 чтений и 10 записей, то общее количество операций ввода-вывода для уровня RAID 0 будет равно 60.

Для RAID 1:

количество операций ввода-вывода = 
(количество чтений на одну транзакцию) + 
(2 х [количество записей на одну транзакцию])

Если транзакция содержит 50 чтений и 10 записей, то общее количество операций ввода-вывода для уровня RAID 1 будет равно 70.

Для RAID 5:

количество операций ввода-вывода = 
3 х (количество операций ввода-вывода на одну транзакцию)

Если транзакция содержит 50 чтений и 10 записей, то общее количество чтений будет равно 150, а общее количество записей будет равно 30. Общее количество операций ввода-вывода для уровней RAID 5 будет равно 180.

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

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

загруженность центрального процессора = 
(темп ввода-вывода) х (время обслуживания) х 100

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

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

  1. Рассчитайте общее количество операций чтения, которые будут выполняться в системе, при помощи следующей формулы:
    общее количество чтений = 
    (количество чтений на одну транзакцию) х (общее количество транзакций)
  2. Определите, сколько из этих операций чтения будут физическими операциями ввода-вывода, а сколько – логическими операциями ввода-вывода, пользуясь следующими формулами:
    общее количество логических чтений = 
    (общее количество чтений) х (процент успешных обращений к кэшу)
    
    общее количество физических чтений = 
    (общее количество чтений) – 
    -(общее количество логических чтений)
  3. Преобразуйте общие количества каждой из разновидностей операций чтения в количество чтений в секунду при помощи следующих формул:
    количество логических чтений в секунду = 
     (общее количество логических чтений) / (рабочий период)
     
    количество физических чтений в секунду = 
     (общее количество физических чтений) / (рабочий период)
    Здесь рабочий период обозначает длительность времени (в секундах), в течение которого должна быть выполнена работа.
  4. Рассчитайте объем времени работы центрального процессора, истраченный на каждую из разновидностей операций чтения при помощи следующих формул:
    время для выполнения логических чтений = 
    (количество логических чтений в секунду) х 
    (длительность операции логического чтения)
    
    время для выполнения физических чтений = 
    (количество физических чтений в секунду) х 
    (длительность операции физического чтения)
    Здесь длительность операции логического чтения обозначает время, необходимое для обработки одного логического чтения, а длительность операции физического чтения – время, необходимое для обработки одного физического чтения. Эти длительности операций чтения можно узнать при помощи Performance Monitor (см. врезку "Как узнать длительность операций чтения" после данного перечня инструкций по расчету.)
    Примечание.Длительность операций чтения обычно составляет 0.002 секунды для физического чтения и 0.001 секунды для логического чтения.
  5. Рассчитайте загруженность центральных процессоров для различных видов операций чтения при помощи следующей формулы:
    загруженность = (темп чтения) х (время обслуживания) х 100
    Можно рассмотреть отдельно загруженность логическими или физическими операциями чтения, применив следующие формулы:
    загруженность операциями логического чтения = 
    (количество логических чтений в секунду) х 
    (длительность операции логического чтения) 
    
    загруженность операциями физического чтения = 
    (количество физических чтений в секунду) х 
    (длительность операции физического чтения)
    Эта информация полезна, когда надо определить, а не слишком ли много нагрузки вызвано операциями физического чтения. Если это так, то можно настроить размер кэша, чтобы сдвинуть равновесие в сторону операций логического чтения.
  6. Рассчитайте общее количество операций записи, которые будут выполняться в системе, при помощи следующей формулы:
    общее количество записей = (количество записей на одну транзакцию) х 
    (общее количество транзакций) х (множитель RAID)
    Здесь множитель RAID обозначает общее количество операций записи, выполняемых рабочей нагрузкой за период обработки.
  7. Определите, сколько операций записи в секунду будут проходить через систему, пользуясь следующей формулой:
    количество записей в секунду = (общее количество записей) / 
    (рабочий период)
    Здесь рабочий период по-прежнему обозначает длительность времени (в секундах), в течение которого должна быть выполнена работа.
  8. Рассчитайте суммарное время работы центрального процессора, истраченное на обработку операций записи, пользуясь следующей формулой:
    время центральных процессоров для выполнения записей = 
    (количество записей в секунду) х 
    (длительность обработки центральным процессором одной операции записи)
  9. Рассчитайте загруженность операциями записи, пользуясь следующей формулой:
    загруженность операциями записи = (количество записей в секунду) х 
    (длительность обработки центральным процессором одной операции записи) х 100
  10. Рассчитайте суммарную загруженность центральных процессоров для каждого из типов транзакций, пользуясь следующей формулой:
    загруженность центральных процессоров  = 
    ((загруженность операциями логического чтения) + 
    (загруженность операциями физического чтения) +
    (загруженность операциями записи)) х 100
    Этот расчет должен быть выполнен для каждого типа транзакций, допустимых в вашей системе. Например, если ваша система – банковская, то в ней должны иметься транзакции для снятия денег со счетов, для помещения денег на счета и справки о состоянии баланса. Для точного предварительного планирования мощности центральных процессоров в вашей системе вычисления о нагрузке должны быть выполнены раздельно для каждого из этих трех типов транзакций.
  11. И наконец, рассчитайте суммарную загруженность центральных процессоров, пользуясь следующей формулой:
    суммарная загруженность центральных процессоров = 
    сумма загруженностей для всех отдельных видов транзакций
    Если суммарная загруженность центральных процессоров превысит 75-процентный порог, то вам следует установить в свою систему дополнительные центральные процессоры, которые уменьшат суммарную загруженность на один процессор в соответствии со следующей формулой:
    суммарная загруженность на один процессор  = 
    (суммарная загруженность центральных процессоров) / 
    (количество центральных процессоров)
    Добавьте столько центральных процессоров, чтобы суммарная загруженность на один процессор снизилась ниже 75%. Например, если суммарная загруженность центральных процессоров окажется равной 180%, то нужно применять три центральных процессора. В результате для трехпроцессорной системы суммарная загруженность на один процессор будет равна 60%.
Примечание.Вы, наверное, удивлены, почему ни в одной из наших формул не присутствует скорость работы процессоров. На самом деле, она входит в формулы, но в неявном виде. Скорость процессоров учтена во времени обслуживания – длительности времени, необходимого для обработки транзакции.
Как узнать длительность операций чтения

Длительность операций чтения в вашей системе можно определить при помощи утилиты Performance Monitor. Включите Diskperf при помощи следующей команды, вводимой в окне MS-DOS:

diskperf -y

Затем запустите Performance Monitor и наблюдайте в объекте Physical Disk за счетчиками Avg. Disk sec/Read и Avg. Disk sec/Write. Обратите внимание, что эти счетчики дают вам среднее время для операций физического чтения. Для определения длительности логического чтения операций эти счетчики неприменимы.

Сбор данных о загруженности одного центрального процессора

После того как ваша система будет реализована, потребуется тщательно следить за загруженностью центрального процессора, так же, как и за памятью. В Performance Monitor имеется множество счетчиков, связанных с измерением загруженности отдельных центральных процессоров. Эти счетчики находятся в объекте Processor. Для задач предварительного планирования мощности наиболее полезны следующие счетчики:

Для предварительного планирования мощности могут понадобиться не все эти показатели; выбор применяемых показателей зависит от глубины проводимого вами исследования. По крайней мере, следует использовать счетчик % Processor Time.

Сбор данных о загруженности нескольких центральных процессоров

При помощи Performance Monitor вы можете также получить усредненные данные для нескольких центральных процессоров. Для этого воспользуйтесь объектом System, содержащим, среди прочих, следующие счетчики:

Анализ данных о загруженности центральных процессоров

Информация, собранная при помощи счетчиков Performance Monitor, может применяться для прогнозирования увеличения нагрузки на отдельные центральные процессоры, следствием которого станет увеличение времени отклика для этого процессора. На рис. 6.6 показан график загруженности центрального процессора (значения загруженности для разных дат). Обратите внимание, что тренд загруженности центрального процессора растет и достигнет 75% порога 18 февраля 2000 года.

 Линейный прогноз загруженности центрального процессора


Рис. 6.6.  Линейный прогноз загруженности центрального процессора

Примечание. Чем больше точек с данными вы соберете, тем точнее будет ваш прогноз.

Планирование мощности дисковой подсистемы

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

Многие люди бывают удивлены количеством дисковых накопителей, необходимых для их баз данных. Но дополнительные накопители дают дополнительные точки доступа к данным. Если вы имеете только одну точку доступа к данным, то вы создаете узкое место ("бутылочное горлышко"). Так как через это узкое место придется проходить всем транзакциям, то длительность откликов будет увеличиваться. Есть такое практическое правило – имейте как можно больше точек доступа к данным. Чем больше точек доступа к данным будет у вас, тем меньше станет вероятность возникновения узкого места из-за недостаточного количества дисковых накопителей. Кроме того, вы сможете генерировать больше операций ввода-вывода в секунду – чтобы система могла выдерживать большой поток операций ввода-вывода, необходимый для больших баз данных.

Предположим, ваша система управляет базой данных объемом 10 Гб и в ней генерируется 140 операций ввода-вывода в секунду. Из правила 85% об объеме дисковой памяти следует, что вам понадобится дисковый накопитель объемом примерно в 12 Гб, чтобы его хватило для хранения базы данных. Теперь взглянем на требования к дисковым накопителям с точки зрения производительности ввода-вывода. Если дисковые накопители имеют производительность ввода-вывода 70 операций в секунду, то с учетом правила 85% для производительности каждого из накопителей вам потребуются три накопителя. Поэтому, так как анализ производительности ввода-вывода требует применения трех накопителей (максимально), мы должны применять три дисковых накопителя, суммарный объем которых составит 12 Гб, а производительность каждого будет 70 операций ввода-вывода в секунду.

Обратите внимание, что эта конфигурация – минимальная, если хотите, то можете применить большее количество дисковых накопителей с более высокой производительностью. Также обратите внимание, что этот метод анализа не учитывает эффекты от применения конфигураций RAID.

Примечание. При предварительном планировании дисковой подсистемы всегда соблюдайте "правило 85%" и для объема базы данных, и для производительности операций ввода-вывода генерируемых пользователями. Использование каких-либо других расчетов вызывает увеличение количества дисковых накопителей. Также помните, что 85% является максимально допустимым значением использования дисков. На практике следует загружать диски менее чем на 85%. И помните, что слишком большое количество операций ввода-вывода в секунду вызовет появление узких мест и, следовательно, увеличит длительность времени отклика.

А теперь давайте более подробно изучим, как правильно определить количество дисковых накопителей, нужных для вашей системы, с учетом применения конфигураций RAID. Вам понадобится хранить три основных категории данных:

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

Дисковые накопители для Windows 2000 и SQL Server

Сначала надо рассчитать количество дисковых накопителей, необходимых для хранения первой категории данных – операционной системы Windows 2000 Server и СУБД SQL Server. Обычно для этого применяют отдельный набор томов RAID 1 (дисковые накопители с зеркальным дублированием), чтобы обеспечивать наиболее быстрое восстановление после отказов. Количество дисковых накопителей может быть разным в зависимости от объема хранимой на них информации, но операционная система Windows 2000 и СУБД SQL Server обычно умещаются на одном диске. Наш простой метод расчета можно выразить следующей формулой:

диски для операционной системы и SQL  = 
(диски для Windows 2000 Server и SQL) х (множитель RAID)

В данном случае, для дисковых накопителей с зеркальным дублированием, результатом формулы будет 2 диска (Windows NT и SQL Server уместятся на одном диске, а другой будет служить дублирующим диском массива RAID 1). Конфигурация тома для операционной системы как RAID 5 или как RAID 0 не рекомендуется. Применять RAID 5 имеет смысл, только когда для собственно хранения данных требуется более одного диска, и вам следует стремиться к как можно более быстрому восстановлению операционной системы и программы СУБД.

Дисковые накопители для файлов журналов

Затем вам потребуется рассчитать количество дисковых накопителей, необходимых для поддержки системных файлов журналов. Это количество сильно зависит от общего количества операций записи за одну секунду, вызываемых вашими транзакциями. Помните, что ценность информации, содержащаяся на этих дисках, очень велика. Она представляет собой "аудиторский след" (контрольный журнал) или "образ до сбоя", который понадобится, если что-нибудь случится с базой данных. При помощи аудиторского следа вы сможете отменить транзакции, незавершенные из-за отказа диска. Расчет количества операций записи уже был выполнен при предварительном планировании мощностей процессоров. Пусть, например (эти числа взяты произвольно), транзакции вызывают 1 500 000 операций записи при использовании тома RAID 0. Если мы решим, что для дисковых накопителей, хранящих журнал, надо применять RAID 1, то получится, что за 8-часовой рабочий день должно быть выполнено 3 000 000 операций записи, или 104,16 операций записи за одну секунду. (Помните, что по сравнению с RAID 0, массивы RAID 1 удваивают количество операций записи на одну транзакцию.) Для расчета необходимого количества дисковых накопителей примените следующую формулу:,

диски для журналов  = 
(количество записей в секунду) / (производительность ввода-вывода диска)

Помните, что производительность ввода-вывода диска в данной формуле должна составлять 85% от его паспортной максимальной производительности. Также не забудьте округлить результат деления (количество записей в секунду) / (производительность ввода-вывода диска) до ближайшего целого числа в сторону увеличения. И наконец, не забудьте скорректировать величину количество записей в секунду в соответствии с увеличением количества операций записи, вызванным из-за применения того или иного уровня RAID. Если мы применим 85-процентный потолок к дисковым накопителям, имеющим максимальную производительность ввода-вывода 70 операций ввода-вывода за одну секунду, то получится, что нам надо иметь 1,7 накопителя. Округлив этот результат, мы получим, что нам надо иметь два накопителя.

Дисковые накопители для базы данных

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

Расчет для объема дисковой памяти

Чтобы определить количество дисковых накопителей, необходимых для того, чтобы база данных могла на них уместиться, примените следующую формулу:

диски для базы данных  = (объем данных) / (размер диска) + (прибавка RAID)

Помните, что размер диска в данной формуле должен составлять 85% от его паспортной максимальной емкости. Также не забудьте, что для объема данных и размера диска надо применять одинаковые единицы измерения (например, килобайты или мегабайты). Прибавка RAID – это количество дополнительных дисковых накопителей, необходимых для обеспечения отказоустойчивости. Для RAID 1 это число равно количеству дисковых накопителей, необходимых для хранения самой базы данных. Для RAID 5 требуется один дополнительный накопитель. Для нашей 10-гигабайтной базы данных, использующей RAID 5, потребуется два 12 Гб накопителя.

Примечание. Для дисковых накопителей, хранящих базу данных, рекомендуется применять RAID 5.

Расчет для производительности ввода-вывода при доступе к базе данных

Количество дисков, необходимых, чтобы система могла выдержать необходимый темп ввода-вывода, может вырасти очень значительно, как вы уже видели из простого примера, приведенного ранее. Чтобы рассчитать это количество, надо выполнить ряд действий:

  1. Рассчитайте общее количество операций чтения, которые будут проходить через систему, применив следующую формулу:
    общее количество чтений = (количество чтений на одну транзакцию) х 
    (общее количество транзакций)
    Предположим, на одну транзакцию у нас производится 500 чтений, а всего будет 50 000 транзакций, тогда всего у нас будет 25 000 000 чтений.
  2. Определите, сколько из этих операций чтения будут физическими операциями ввода-вывода, а сколько – логическими операциями ввода-вывода, пользуясь следующими формулами:
    общее количество логических чтений = (общее количество чтений) х 
    (процент успешных обращений к кэшу)
    
    общее количество физических чтений = (общее количество чтений) - 
    (общее количество логических чтений)
    Предположим, процент успешных обращений к кэшу равен 90%, тогда общее количество логических операций чтения у нас будет равно 22 500 000, а общее количество физических операций чтения будет равно 2 500 000.
  3. Преобразуйте общее количество физических операций чтения в количество чтений в секунду при помощи следующей формулы:
    количество физических чтений в секунду = 
    (общее количество физических чтений) / (рабочий период)
    Здесь рабочий период обозначает длительность времени (в секундах), в течение которого должна быть выполнена работа. Эта величина нужна также для расчета загруженности центрального процессора. Если взять для нашего примера 8-часовой рабочий период, то мы получим 86,8 физических операций чтения в секунду.
  4. Затем рассчитайте общее количество операций записи, которые будут выполняться в системе, при помощи следующей формулы:
    общее количество записей = (количество записей на одну транзакцию) х 
    (количество транзакций) х (множитель RAID)
    Пусть мы имеем 10 операций записи на одну транзакцию и применяем массив RAID 5, тогда общее количество записей будет равно 10 х 50 000 х 3, т.е. 1 500 000 операций записи.
  5. Преобразуйте общее количество физических операций записи в количество операций записи в секунду при помощи следующей формулы:
    количество физических записей в секунду = (общее количество физических записей) / 
    (рабочий период)
    В нашем примере мы имеем 1 500 000 физических операций записи за 8-часовой рабочий период (28 800 секунд), что дает 52,1 физических операций записи в секунду.
  6. Рассчитайте общее количество физических операций ввода-вывода в секунду при помощи следующей формулы:
    количество физических операций ввода-вывода в секунду = 
    	(общее количество физических чтений в секунду) + 
    	(количество физических записей в секунду)
    В нашем примере мы имеем 86,8 физических операций чтения в секунду и 52,1 физических операций записи в секунду, что дает в сумме 138,9 физических операции ввода-вывода в секунду.
  7. Вычислите общее необходимое количество дисковых накопителей по следующей формуле:
    количество дисков для базы данных = 
    	((количество физических операций ввода-вывода в секунду) / 
    	(производительность ввода-вывода одного диска)) + (прибавка RAID)

Помните, что значение производительности ввода-вывода одного диска вы должны брать с учетом правила "85%". Прибавка RAID – это количество дополнительных дисковых накопителей, необходимых для обеспечения отказоустойчивости. Если мы имеем всего 138,9 физических операции ввода-вывода в секунду, а производительность диска составляет 70 операций ввода-вывода в секунду и применяется массив RAID 5, то всего понадобится четыре дисковых накопителя – три для поддержки суммарного ввода-вывода и еще один для обеспечения отказоустойчивости массива RAID 5.

Итак, вы видите, что для размещения базы данных размером 10 Гб было бы достаточно иметь всего лишь один диск, но с учетом выполняемого ввода-вывода потребуется три диска – больший из двух результатов расчета.

Общее количество дисковых накопителей, нужных в системе

Чтобы определить суммарное количество дисковых накопителей, нужных для системы, надо суммировать все количества накопителей, нужных для всех ее компонент. В соответствии с условиями нашего примера нам понадобятся два накопителя для Windows 2000 Server и SQL Server, два накопителя для файлов журнала и четыре накопителя для базы данных, из чего следует, что для всей системы потребуется восемь дисковых накопителей.

Практические советы.

Оставляйте себе резервы

Большинство проектировщиков пользуются пороговыми величинами (75% для загруженности центральных процессоров, 85% для использования дисков и т.д.) как максимальными значениями нагрузок. В большинстве случаев желательно применять меньшие величины. Конечно, часто решения в этих вопросах принимают не проектировщики. На решение проектных вопросов могут оказывать влияние такие внешние факторы, как бюджет расходов на покупку вычислительной техники. В качестве хорошего целевого показателя можно принять максимальную загруженность центральных процессоров, равную 65% и использование дисков на 70%. Однако вы можете применять и любые другие значения этих процентов, которые сочтете оптимальными для проектируемого вами типа систем.

Сбор данных об использовании дисков

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

При выполнении исследований последующего планирования загруженности дисков понадобится следить за следующими счетчиками утилиты Performance Monitor, которые вы найдете в объекте PhysicalDisk:

Для запуска Disk Administrator нажмите на экранную кнопку Start, затем выберите Programs, Administrative Tools (Common) и, наконец, Disk Administrator. Для получения дополнительной информации об использовании утилиты Disk Administrator, производительности, нажмите на кнопку Help в окне Disk Administrator.

Анализ данных об использовании дисков

Анализ информации об использовании дисков несложен. Например, если бы мы анализировали работу системы, то для определения объема свободного места мы собирали бы информацию о свободном месте на дисках. На рис. 6.7 показаны нагрузка на базу данных в отношении наличия свободного места.

Как можно видеть, в начале наблюдений у нас было 2,05 Мб свободного места из общего объема в 6,15 Мб, т.е. диск был заполнен примерно на 67%. 14 января 2000 года объем свободного места на диске уменьшился примерно до 1,5 Мб, т.е. диск заполнился примерно на 75%. Проведя при помощи Microsoft Excel линию тренда, можно спрогнозировать, что 18 февраля 2000 года на диске останется свободно только около 1,3 Мб, т.е. диск заполнился примерно на 83%. Администратор баз данных может принять решение приобрести в этот момент дополнительный диск.

Прогноз (упреждающий анализ) для свободного места на диске


Рис. 6.7.  Прогноз (упреждающий анализ) для свободного места на диске

Планирование мощности сети

Планирование мощности сети мы оставили под конец, потому что изнутри системы вы не сможете получить много информации. Из утилиты Performance Monitor нельзя получить никакие счетчики производительности работы сети, поэтому предварительное планирование сети может оказаться достаточно трудным делом. Сеть обычно является самым слабым звеном в системе, поэтому будьте реалистичны при ее оценке.

Чтобы выполнить предварительное планирование сети, вам понадобится определить, сколько пользователей будут одновременно работать в системе, сколько сообщений (messages) будет проходить за одну секунду и сколько в среднем байт будет содержаться в этих сообщениях. Опираясь на эту информацию, вы можете произвести некоторые оценки минимально необходимой пропускной способности сети. Пусть, например, в нашей системе будут передаваться такие объемы данных: будет 10 пользователей, каждый из которых будет передавать 25 сообщений в минуту. Каждое сообщение будет иметь длину 259 байтов. Можно оценить, что за одну минуту все эти 250 сообщений будут генерировать 64 750 байтов в минуту, т.е. 518 000 битов в минуту, т.е. 8633,33 бита в секунду. Для такой нагрузки подойдет небольшая сеть. Для оценки мощности сети можно применять следующую формулу:

мощность сети = (количество сообщений секунду) х  (длина сообщений) х  
(количество битов в одном байте)

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

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

Сбор данных об использовании сети

При выполнении исследований последующего планирования загруженности сети вам понадобится следить за счетчиком производительности Bytes/Sec Through Network Interface утилиты Network Monitor (Сетевой монитор). Этот счетчик обозначает процент времени, когда линия передачи данных занята.

Примечание. Инструкции по инсталляции утилиты Network Monitor вы найдете в разделе "Installing Network Monitor" справочной системы Windows 2000 Server.
Анализ данных об использовании сети

Для анализа сетевых данных надо сначала рассчитать пропускную способность линии передачи данных (мощность сети), как было показано выше, а затем посмотреть значение счетчика Bytes/Sec Through Network Interface. Зная два этих значения, можно вычислить общую загруженность сети при помощи следующей формулы:

загруженность сети = 
((количество байт, проходящих через сеть за одну секунду) / 
(мощность сети)) х 100

На рис. 6.8 показан пример линейного роста процента загруженности сети в зависимости от даты.

Прогноз (упреждающий анализ) для загруженности сети


Рис. 6.8.  Прогноз (упреждающий анализ) для загруженности сети

График показывает, что 2 сентября 2000 года загруженность данного сегмента сети станет максимально возможной. Опять напомним, что чем больше точек с данными вы нанесете на график, тем точнее будет ваш прогноз.

Как выбирать оценочные данные

Нельзя однозначно назвать набор счетчиков, за которыми нужно следить при последующем планировании. Набор используемых счетчиков зависит от анализируемых вами данных и от необходимой вам степени детализации. Кроме счетчиков, уже описанных ранее, Performance Monitor имеет много других счетчиков для измерения производительности, которые могут оказаться полезными в некоторых ситуациях. Одну такую ситуацию – сбор информации о процессах – мы сейчас и рассмотрим.

Сбор данных о процессах

Информация о процессах может оказаться очень ценной при создании профилей рабочей нагрузки. Создание профилей рабочей нагрузки – это выяснение, какую именно работу выполняет каждый из пользователей. Performance Monitor имеет много разнообразных счетчиков для выполнения этой задачи. Эти счетчики подобны счетчикам из объекта Processor, но в данном случае они применяются для сбора данных о процессе. Они находятся в объекте Process и перечислены ниже:

Анализ данных о процессах

Анализ этой информации вовсе не так сложен, как вы могли бы подумать. Например, если бы потребовалось провести анализ работ, выполняемых процессами системы, то нам надо было бы собрать данные процессов при помощи, например, счетчика % Processor Time. Этот счетчик позволяет оценить, насколько много внимания система уделяет данной функции. На рис. 6.9 показан рост пользовательского процесса в запросе CalProc, применяемом отделом кредиторских задолженностей.

Эта информация полезна тем, что мы можем спрогнозировать результат от увеличения числа пользователей в отделе кредиторских задолженностей. Линия тренда на данном графике показывает, что процент использования возрастает и достигнет 18 февраля 2000 года 30%. Допустим, в отделе кредиторских задолженностей имеется 10 пользователей, тогда можно оценить в 3% вклад каждого из пользователей в загруженность в феврале. Мы можем сделать вывод, что если в феврале добавить еще трех пользователей, то загруженность для запроса CalProc составит приблизительно 39%.

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

Прогноз (упреждающий анализ) пользовательского процесса


Рис. 6.9.  Прогноз (упреждающий анализ) пользовательского процесса

В табл. 6.1 дан список счетчиков, которые послужат хорошей основой для исследований планирования мощности.

Таблица 6.1. Показатели, доступные в Performance Monitor
Объект Показатели
Processor% Processor Time (статистика для отдельных центральных процессоров)
System% Total Processor Time (усредненные данные для всех центральных процессоров)

Лекция 7. Инсталляция Microsoft SQL Server

Инсталляция SQL Server полна неожиданностей и различного рода проблем. Три вида инсталляции (локальная, дистанционная, автоматическая) рассматриваются в лекции в полном объеме. Множество скриншотов позволяет уточнить, какие именно настройки были отмечены на каждом этапе установки. Различные варианты настроек влияют на дальнейшее развитие системы, поэтому в лекции приводятся примеры комбинаций параметров. Рассматривается обновление от ранних версий SQL Server. Дается описание инсталляции, конфигурирования и возможностей клиентских компонент.

Теперь, когда вы закончили работы по подготовке к инсталляции, описанные в лекциях 4 и 5, и правильно выполнили предварительное планирование своей системы (в соответствии с объяснениями в лекции 6), можно приступить к инсталляции Microsoft SQL Server 2000. В данной лекции содержатся объяснения о ходе инсталляции и обзор процедуры обновления Microsoft SQL Server от старых версий. А затем, поскольку вы можете применять SQL Server в клиент-серверных окружениях, мы подробно расскажем об инсталляции клиентских утилит на компьютерах-клиентах.

Инсталляция на сервере

Имеется три способа инсталляции SQL Server. Можно выполнить локальную, дистанционную либо автоматическую инсталляцию. При локальной инсталляции SQL Server устанавливается на компьютер, которым вы пользуетесь в текущий момент. При дистанционной инсталляции вы можете установить SQL Server на другой компьютер, входящий в вашу сеть. Автоматическая инсталляция дает возможность инсталлировать SQL Server без необходимости человеческих ответов на вопросы системы (вы заблаговременно сохраняете в файле все ответы на вопросы системы, а программа инсталляции автоматически считывает их оттуда по мере надобности). В данной лекции будут описаны все эти три способа инсталляции. Если вы впервые инсталлируете SQL Server 2000, то, прежде чем пробовать другие способы, пользуйтесь локальной инсталляцией. Тогда вы хорошо освоитесь с обычной процедурой инсталляции.

Локальная инсталляция

Если вы подготовились к инсталляции в соответствии с тем, как это было описано в лекциях 4, 5 и 6, то процесс инсталляции пройдет гораздо более гладко. Для локальной инсталляции выполните следующие действия, в результате чего SQL Server установится и начнет работать на сервере:

  1. Вставьте компакт-диск SQL Server в привод для компакт-дисков вашего сервера. Если у вашей операционной системы включена настройка для автоматического запуска компакт-дисков, тогда появится диалоговое окно начальной установки Microsoft SQL Server 2000 (рис. 7.1). Если настройка для автоматического запуска компакт-дисков не включена, тогда нужно вручную запустить программу Autorun.exe, находящуюся в корневой директории компакт-диска.
  2. Если у вас не установлены необходимые дополнительные пакеты операционной системы (service packs, "сервис-пэки") или требуемая версия Microsoft Internet Explorer, или если вы просто хотите посмотреть перечень программных компонент, необходимых для инсталляции, то нажмите на SQL Server 2000 Prerequisites, и тогда откроется диалоговое окно SQL Server 2000 Prerequisites (Предварительные условия для SQL Server 2000). Нажмите на обозначение нужной операционной системы, появится список необходимых программных компонент для нее. Затем нажмите на обозначение программной компоненты, которую вы хотите инсталлировать. Если все необходимое программное обеспечение у вас уже установлено, то переходите к шагу 3.

     Диалоговое окно начальной установки SQL Server


    Рис. 7.1.  Диалоговое окно начальной установки SQL Server

    Примечание.Если вам потребуется инсталлировать Microsoft Internet Explorer или дополнительные пакеты (service packs, сервис-пэки), необходимые для Microsoft Windows 2000 или Microsoft Windows NT 4, то, прежде чем вы сможете продолжить инсталляцию SQL Server, может потребоваться перезагрузка компьютера и повторный запуск Autorun.exe.
    Инсталлировав необходимые программные компоненты, вернитесь в основное диалоговое окно инсталляции SQL Server, нажав на Back (Назад).
  3. Чтобы начать инсталляцию SQL Server, нажмите на SQL Server 2000 Components (Компоненты SQL Server 2000).
  4. Появится диалоговое окно Install Components (рис. 7.2). Чтобы начать инсталляцию основных компонент SQL Server, нажмите на Install Database Server.

     Диалоговое окно Install Components


    Рис. 7.2.  Диалоговое окно Install Components

  5. Появится стартовое окно мастера SQL Server 2000 Installation Wizard. Если у вас работают какие-либо другие программы, то их нужно закрыть. Чтобы продолжить процесс инсталляции, нажмите на Next.
  6. Появится диалоговое окно Computer Name (Имя компьютера). Нажмите сначала на Local Computer, а затем на Next.
  7. Появится диалоговое окно SQL Server 2000 Installation Selection (Выбор инсталляции SQL Server 2000). Для продолжения инсталляции нажмите сначала на Create A New Instance Of SQL Server (Создать новый экземпляр SQL Server), а затем нажмите на Next.
  8. Появится диалоговое окно User Information (Информация о пользователе). Проверьте правильность вашего имени и названия вашей фирмы. Для продолжения нажмите на Next.
  9. Появится диалоговое окно Software License Agreement (Лицензионное соглашение об использовании программного обеспечения). Нажмите на Yes, чтобы согласиться с условиями лицензионного соглашения и продолжить процесс инсталляции.
  10. Появится диалоговое окно CD Key (Ключ компакт-диска). Введите 25-символьный ключ компакт-диска, напечатанный на желтой наклейке на футляре компакт-диска, а затем нажмите на Next.
  11. Появится диалоговое окно Installation Definition (Задание инсталляции). Нажмите на Server And Client Tools (Серверные и клиентские инструментальные средства), а затем нажмите на Next.
  12. Появится диалоговое окно Instance Name (Имя экземпляра). Если вы хотите, чтобы имя этого экземпляра SQL Server отличалось от принятого по умолчанию, то снимите флажок Default и введите с клавиатуры нужное имя. Для продолжения процесса инсталляции нажмите на Next.
  13. Появится диалоговое окно Setup Type (Тип установки)(рис. 7.3), в котором вы можете выбрать тип инсталляции – "типичную" (Typical), "минимальную" (Minimal) или "выборочную" (Custom). В типичную инсталляцию включены все опции (возможности), кроме средств разработки (Development Tools) и полнотекстного поиска (Full-Text Search). При помощи выборочной инсталляции вы можете добавить эти опции, а также отказаться от любых ненужных вам опций. При минимальной инсталляции устанавливаются те же опции, что и при типичной, кроме Upgrade Tools (Средства обновления), Books Online (Справочная документация в электронной форме) и Management Tools (Средства управления).

    В большинстве случаев надо выполнять типичную инсталляцию, поэтому в наших примерах предполагается, что была нажата экранная кнопка Typical. Также вы можете указать местоположение устанавливаемых файлов программ и данных SQL Server, для чего нажимайте на экранные кнопки Browse в группе экранных форм Destination Folder (Целевая папка). Для продолжения нажмите на Next.

  14. Появится диалоговое окно Services Accounts (Учетные записи служб) (рис. 7.4). Вы можете применять как учетную запись Windows NT или Windows 2000, так и администраторскую учетную запись (Administrator account). В любом случае, учетная запись должна иметь права доступа Log on as a service. Если вы не знаете, как создавать такие учетные записи, посоветуйтесь со своим системным администратором или почитайте документацию по Windows NT или Windows 2000. В соответствующие поля окна введите с клавиатуры имя и пароль созданной вами учетной записи службы SQL Server. Если вы инсталлируете SQL Server на одиночный компьютер – рабочую станцию, то нажмите мышкой на Use the Local System account (Использовать учетную запись локальной системы). Для продолжения нажмите на Next.

    Диалоговое окно Setup Type (Тип установки)


    Рис. 7.3.  Диалоговое окно Setup Type (Тип установки)

     Диалоговое окно Services Accounts (Учетные записи служб)


    Рис. 7.4.  Диалоговое окно Services Accounts (Учетные записи служб)

  15. Затем появится диалоговое окно Authentication Mode (Режим аутентификации), (рис. 7.5). Это диалоговое окно определяет уровень безопасности вашей инсталляции SQL Server. Вы можете выбрать Windows Authentication Mode (Режим аутентификации Windows) либо Mixed Mode (Смешанный режим). При выборе Windows Authentication Mode все права пользователей в отношении базы данных наследуются из настроек Windows User Security. При выборе Mixed Mode вы должны задать пароль для учетной записи sa (системного администратора SQL Server). Вы можете и не задавать этот пароль (оставить его пустым), но такой поступок серьезно ухудшит безопасность вашей инсталляции SQL Server. После того как вы выберете режим аутентификации, чтобы продолжить работу, нажмите на Next.

    Диалоговое окно Authentication Mode (Режим аутентификации)


    Рис. 7.5.  Диалоговое окно Authentication Mode (Режим аутентификации)

  16. Появится диалоговое окно Start Copying Files (Запустить копирование файлов). Для продолжения нажмите на Next.
  17. Появится диалоговое окно Licensing Mode (Лицензионный режим). Вы можете выбрать один из двух вариантов лицензии для клиентов SQL Server – на количество посадочных мест (per seat) или на количество процессоров.

    При выборе лицензии на количество посадочных мест потребуется лицензия на клиентский доступ (Client Access License) для каждого компьютера-клиента, который будет осуществлять доступ к серверу. После того как для такого компьютера будет получена лицензия, он сможет осуществлять доступ к любому компьютеру в сети, на котором исполняется SQL Server 2000 без какой-либо дополнительной оплаты. Лицензия на количество процессоров требует получения лицензии на каждый из процессоров, который будет исполнять SQL Server. Например, если ваш SQL Server работает на четырехпроцессорном компьютере, то для использования всех четырех процессоров вам надо будет приобрести четыре процессорных лицензии. Если хотите, вы можете ограничить работу SQL Server лишь двумя процессорами из четырех. В этом случае вам потребуется приобрести только две процессорных лицензии. После того как вы приобретете нужное количество процессорных лицензий, вы сможете соединяться с неограниченным числом клиентов.

    Чтобы начать инсталляцию приложений и файлов данных SQL Server, нажмите на Continue. SQL Server установит на ваш компьютер нужные файлы и сконфигурирует необходимые компоненты. Инсталляция может выполниться всего лишь за несколько минут либо дольше (в зависимости от быстродействия вашего компьютера).

  18. По завершении инсталляции появится диалоговое окно Setup Complete (Установка завершена). Для завершения процесса инсталляции нажмите на Finish.

Поздравляем! Вы инсталлировали SQL Server на свой сервер.

Дистанционная инсталляция

Если вы хотите инсталлировать SQL Server на сервер со своего компьютера через сеть, то вам надо будет выполнить дистанционную инсталляцию. Дистанционная инсталляция несколько отличается от локальной инсталляции и выполняется при помощи следующей последовательности шагов:

  1. Выполните пункты 1-5 из последовательности действий для локальной инсталляции.
  2. В диалоговом окне Computer Name нажмите на Remote Computer и введите с клавиатуры имя удаленного компьютера. Для продолжения нажмите на Next.
  3. Появится диалоговое окно SQL Server 2000 Installation Selection. Нажмите на Create A New Instance Of SQL Server (Создать новый экземпляр SQL Server), а затем, чтобы продолжить инсталляцию, нажмите на Next.
  4. Появится диалоговое окно User Information. Проверьте правильность вашего имени и названия вашей фирмы. Для продолжения нажмите на Next.
  5. Появится диалоговое окно Software License Agreement. Нажмите на Yes, чтобы согласиться с условиями лицензионного соглашения и продолжить процесс инсталляции.
  6. Появится диалоговое окно CD Key. Введите 25-символьный ключ компакт-диска, напечатанный на желтой наклейке на футляре компакт-диска, а затем нажмите на Next.
  7. Появится диалоговое окно Remote Setup Information (Информация о дистанционной установке) (рис. 7.6). Введите в нем с клавиатуры имя учетной записи, пароль и домен для компьютера, на который вы хотите инсталлировать SQL Server. Не забудьте, что учетная запись, которой вы пользуетесь, должна иметь полномочия инсталлировать программное обеспечение на этом компьютере. Вы также должны ввести с клавиатуры путь инсталляции в файловой системе на удаленном компьютере в текстовое поле Target Path (Целевой путь). Путь инсталляции должен быть путем в формате UNC (Universal Naming Convention), например, \\remoteserver\c$\Program Files\ Microsoft SQL Server. Для продолжения нажмите на Next.

    Диалоговое окно Remote Setup Information (Информация о дистанционной установке)


    Рис. 7.6.  Диалоговое окно Remote Setup Information (Информация о дистанционной установке)

  8. Появится диалоговое окно Installation Definition. Нажмите на Server And Client Tools, а затем нажмите на Next.
  9. Появится диалоговое окно Instance Name. Если вы хотите, чтобы имя этого экземпляра SQL Server отличалось бы от принятого по умолчанию, то снимите флажок Default и введите с клавиатуры нужное имя. Для продолжения процесса инсталляции нажмите на Next.
  10. Появится диалоговое окно Setup Type. При дистанционной инсталляции, так же, как и при локальной, вы можете выбрать типичную, минимальную или выборочную инсталляцию. В типичную инсталляцию включены все опции, кроме Development Tools и Full-Text Search. При помощи выборочной инсталляции вы можете добавить эти опции, а также отказаться от любых ненужных вам опций. При минимальной инсталляции устанавливаются те же опции, что и при типичной, кроме Upgrade Tools, Books Online и Management Tools.В большинстве случаев надо выполнять типичную инсталляцию, поэтому в наших примерах предполагается, что была нажата экранная кнопка Typical. Вы также можете указать местоположение устанавливаемых файлов программ и данных SQL Server, для чего нажимайте на экранные кнопки Browse в группе экранных форм Destination Folder. Для продолжения нажмите на Next.

    Появится диалоговое окно Services Accounts (рис. 7.4). В соответствующие текстовые поля этого окна введите с клавиатуры имя и пароль созданной вами учетной записи службы SQL Server. (Если вы не создали отдельную учетную запись, то можете воспользоваться учетной записью и паролем администратора Windows NT или Windows 2000.) Для продолжения нажмите на Next.

  11. Появится диалоговое окно Authentication Mode. Это диалоговое окно определяет уровень безопасности вашей инсталляции SQL Server. Вы можете выбрать Windows Authentication Mode либо Mixed Mode. При выборе Windows Authentication Mode все права пользователей в отношении базы данных наследуются из Windows User Security. При выборе аутентификации Mixed Mode вы должны задать пароль для учетной записи системного администратора SQL Server (в этом диалоговом окне – "sa"). Вы можете и оставить этот пароль пустым, но такой поступок серьезно ослабит безопасность вашей инсталляции SQL Server. После того как вы выберете режим аутентификации, для продолжения работы нажмите на Next.
  12. Появится диалоговое окно Licensing Mode. При дистанционной инсталляции, как и при локальной, вы можете выбрать один из двух вариантов лицензии для клиентов SQL Server – на количество клиентов для работы на серверах или на посадочных мест (на количество процессоров). Различия между этими двумя видами лицензий описаны в пункте 16 последовательности действий для выполнения локальной инсталляции.

В ходе процесса дистанционной инсталляции SQL Server создаст файл с именем Sqlstp.log. Этот файл находится в папке %Systemroot% вашей операционной системы Windows NT или Windows 2000. Обычно папка %Systemroot% – это C:\Winnt. В файле Sqlstp.log хранится информация обо всех выполненных действиях процесса инсталляции, а также об ошибках или предупреждениях, возникших при инсталляции. Если вдруг дистанционная инсталляция завершится неудачно, этот файл поможет при диагностике.

Автоматическая инсталляция

В SQL Server имеются средства, при помощи которых можно автоматизировать процесс инсталляции. С их помощью вы сможете выполнять инсталляцию без личного присутствия, что особенно полезно при установке SQL Server на большое число серверов. Ниже перечислены действия для создания автоматической инсталляции:

  1. Из командной строки перейдите в директорию на компакт-диске.
  2. Выполните один из пакетных (.bat) файлов для автоматической инсталляции:
    • Sqlins.bat служит для выполнения типичной инсталляции SQL Server на Windows 95/98, Windows NT или на Windows 2000. Этот пакетный файл использует файл инициализации Sqlins.iss.
    • Sqlcst.bat служит для выполнения выборочной инсталляции SQL Server на Windows 95/98, Windows NT или на Windows 2000. Этот пакетный файл использует файл инициализации Sqlcst.iss.
    • Sqlcli.bat служит для инсталляции клиентских утилит. Эти утилиты инсталлируются с использованием файла инициализации Sqlcli.iss. Клиентские утилиты инсталлируются в папку C:\Program Files\Microsoft SQL Server\80\.
    • Sqlrem.bat служит для удаления с компьютера всех компонент SQL Server. В качестве параметра вы должны указать установочную папку SQL Server.

Прежде чем запускать какой-либо из этих пакетных файлов, вы можете настраивать для конкретных компьютеров файлы .iss, соответствующие этим .bat -файлам. Например, вы можете пожелать изменить режим лицензирования со стандартного ("на сервер") на "на количество посадочных мест". Для этого потребуется изменить раздел [License] соответствующего .iss -файла с LicenseMode=PERSERVER на LicenseMode=PERSEAT.

Обновление от ранних версий

Если на ваших компьютерах уже размещены данные Microsoft SQL Server 6.5 или Microsoft SQL Server 7, то вы можете без хлопот обновить эти данные для использования с SQL Server 2000. Для обновления инсталляций Microsoft SQL Server 6.5 понадобится использовать мастер Version Upgrade Wizard. Инсталляции SQL Server 7 обновляются автоматически в процессе установки SQL Server 2000.

Обновление к SQL Server 2000 от SQL Server 7

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

 Сообщение о состоянии процесса обновления SQL Server 7


Рис. 7.7.  Сообщение о состоянии процесса обновления SQL Server 7

Обновление к SQL Server 2000 от SQL Server 6.5

Прежде чем запустить мастер SQL Server Upgrade Wizard, который обновляет данные SQL Server 6.5 к форматам SQL Server 2000, вам понадобится проверить все пункты приведенного ниже списка (применительно к вашей инсталляции SQL Server 6.5):

Чтобы обновить данные SQL Server 6.5 к форматам SQL Server 2000 (после того как вы инсталлировали SQL Server 2000), надо выполнить следующие действия:

  1. Нажмите на экранную кнопку Start, наведите курсор на Programs, затем наведите курсор на Microsoft SQL Server-Switch, а затем нажмите на SQL Server Upgrade Wizard, чтобы появился стартовый экран мастера SQL Server Upgrade Wizard (рис. 7.8). Для продолжения процесса обновления нажмите на Next.
  2. Появится экран Data and Object Transfer (Перенос данных и объектов) мастера SQL Server Upgrade Wizard (рис. 7.9). По умолчанию, мастер SQL Server Upgrade Wizard выполнит конвертацию (преобразование) всех объектов и данных базы данных SQL Server 6.5 в формат SQL Server 2000. Чтобы убедиться в успешности этой конвертации, установите флажок Validate Successful Object Data Transfer (Проверить успешность переноса объектов данных). Эта проверка может занять много времени, но лучше ее все-таки выполнить.

    Стартовый экран мастера SQL Server Upgrade Wizard


    Рис. 7.8.  Стартовый экран мастера SQL Server Upgrade Wizard

    Экран Data and Object Transfer (Перенос данных и объектов)


    Рис. 7.9.  Экран Data and Object Transfer (Перенос данных и объектов)

    Если вы беспокоитесь о целостности конвертированных данных, то установите флажок Exhaustive Data Integrity Verification (Исчерпывающая верификация целостности данных). Из-за этой опции процесс конвертации данных еще более замедлится, но зато будет обеспечен наивысший уровень целостности. Если вы уже давно не запускали SQL Server 6.x DBCC (модуль для проверки непротиворечивости базы данных), то нужно выбрать применение этой опции, чтобы избежать влияния повреждения базы данных на процесс конвертации. Если на вашем компьютере имеется ленточный накопитель, то будет иметься также опция для использования в качестве метода передачи данных не именованных каналов, а ленточного накопителя. Для продолжения нажмите на Next.

  3. Появится экран Logon мастера SQL Server Upgrade Wizard (рис. 7.10). Вы должны выбрать имя сервера из выпадающего списка и ввести с клавиатуры пароль системного администратора для конвертируемой базы данных SQL Server 6.5. Вы также должны ввести пароль системного администратора для целевой базы данных SQL Server 2000. Если вы хотите, чтобы любой из SQL Server работал с какими-либо аргументами запуска (startup arguments), то введите с клавиатуры эти аргументы в соответствующее текстовое поле Optional Startup Arguments (Необязательные аргументы запуска). Здесь можно задать флаги трассировки. Если вы не пожелаете применять аргументы запуска, то оставьте эти текстовые поля пустыми. (Для дополнительной информации обратитесь к Books Online и посмотрите в разделе "stаrtup options"). Для продолжения нажмите на Next.
  4. Экран мастера SQL Server Upgrade Wizard выдаст предупредительное сообщение о том, что мастер SQL Server Upgrade Wizard должен остановить и перезапустить ваши базы данных SQL Server 6.5 и SQL Server 2000 и что никто из пользователей не должен входить ни на какой из серверов баз данных, пока не будет завершена конвертация базы данных. Для продолжения нажмите на Yes.

    Экран Logon мастера SQL Server Upgrade Wizard


    Рис. 7.10.  Экран Logon мастера SQL Server Upgrade Wizard

    Примечание. C этого момента система будет переключаться между SQL Server 6.5 и SQL Server 2000.
  1. Появится экран Code Page Selection (Выбор кодовой страницы), при помощи которого вы сможете задать кодовую страницу сценариев (scripting code page), используемую при конвертации, определяющую набор символов. Всегда выбирайте стандартную настройку, за исключением случаев, когда вы хотите применять другой набор символов, отличающийся от того, который уже был у вас установлен. Для продолжения нажмите на Next.
  2. Мастер SQL Server Upgrade Wizard, во взаимодействии с базой данных SQL Server 6.5, определит, какие базы данных можно конвертировать в новый формат, а затем покажет список этих баз данных в экране Upgrade Databases to SQL Server 2000 (Обновлять базы данных к SQL Server 2000) (рис. 7.11).

    Те базы данных, которые будут конвертироваться в новый формат, будут показаны в списке в правом поле. Чтобы исключить базу данных из процесса конвертации в новый формат, выберите ее имя в списке в поле Include these databases и нажмите на экранную кнопку Exclude. Эта исключенная база данных появится в списке в левом поле. Не нужно исключать базы данных из процесса конвертации, единственной причиной такого решения может быть лишь случай, когда вы больше не собираетесь пользоваться этой базой данных. Для продолжения нажмите на Next.

  3. Появится экран Database Creation (Создание баз данных) (рис. 7.12). При помощи этого экрана вы можете указать, как будут создаваться базы данных. Обычно выбирают конфигурацию, предлагаемую по умолчанию. Если вы хотите указать другое местоположение файлов данных, то измените конфигурацию. Для продолжения нажмите на Next.

    Экран Upgrade Databases to SQL Server 2000 (Обновлять базы данных к SQL Server 2000)


    Рис. 7.11.  Экран Upgrade Databases to SQL Server 2000 (Обновлять базы данных к SQL Server 2000)

    Экран Database Creation (Создание баз данных)


    Рис. 7.12.  Экран Database Creation (Создание баз данных)

    Примечание.В стандартной конфигурации SQL Server 6.5 создает файлы, достаточно большие, чтобы в них могли бы храниться конвертируемые данные и объекты (в том виде, как они хранятся в базах данных SQL Server 6.5). Однако свободное место для этих файлов не выделяется. Для каждой конвертируемой базы данных также создается файл журнала. При помощи экранной кнопки Edit вы можете изменить: имена и местоположения файлов журналов, начальный размер файла и величину приращения размера файла.

    Вторая опция для создания баз данных – это Use databases already created in SQL Server 2000 (Применять базы данных, уже созданные в SQL Server 2000). С ее помощью вы можете создать в SQL Server 2000 файлы данных и журналов еще до того, как запустите мастер обновления, и SQL Server будет применять эти базы данных для хранения конвертированных данных.

    Третья опция – использовать сценарий SQL для создания файлов баз данных. Этот сценарий должен содержать оператор CREATE DATABASE, необходимый для создания файлов баз данных и журналов, используемых при конвертации. Чтобы найти и указать нужный сценарий, нажмите на экранную кнопку Browse.

    Мы не рекомендуем пользоваться второй и третьей опциями, потому что вы должны использовать в SQL Server 2000 такие же имена баз данных, что были и в SQL Server 6.5, а файлы SQL Server 2000 могут занимать на диске больше места, чем исходные файлы SQL Server 6.5. Если вы воспользуетесь опцией, применяемой по умолчанию, то SQL Server произведет для вас оценку увеличения места на диске, занимаемого данными.

  4. Появится экран System Configuration (Конфигурация системы)( рис. 7.13). При помощи этого экрана вы можете задать, какие системные объекты и настройки должны передаваться в новую базу данных. Если установить флажок Server Configuration (Конфигурация сервера), то будут конвертированы все регистрационные данные для обычных и дистанционных входов в систему. Если установить флажок SQL Executive Settings (Настройки исполнения SQL), то будут конвертированы все запланированные задания (scheduled tasks). Если установить флажок Replication Settings (Настройки репликации), то будет конвертироваться и поддержка репликации. В нашем примере флажок Replication Settings отключен, потому что для наших баз данных SQL Server 6.5 репликация не применялась, поэтому и конвертировать нечего. (О репликации баз данных см. лекцию 26.)

    Экран System Configuration (Конфигурация системы)


    Рис. 7.13.  Экран System Configuration (Конфигурация системы)

    При помощи группы селективных кнопок Advanced settings (Дополнительные настройки) вы можете задать настройки ANSI Nulls (Нули ANSI) и Quoted Identifiers (Идентификаторы в кавычках). Настройка ANSI Nulls влияет на работу операций сравнения, использующих нулевые значения. Если установить эту настройку на On (Включить), то операции сравнения ( = и <> ) будут всегда возвращать результат NULL, если один из аргументов операции сравнения будет NULL. Если установить эту настройку на Off (Выключить), то операции сравнения будут возвращать TRUE, если оба аргумента будут NULL, и возвращать FALSE, если один аргумент будет NULL, а другой – не NULL.

    Настройка Quoted Identifiers задает, каким образом SQL Server 2000 будет обрабатывать символы двойных кавычек. Если установить эту настройку на On, то символы двойных кавычек будут обозначать идентификаторы, например имена колонок. Если установить эту настройку на Off, то символы двойных кавычек будут обозначать символьные строки, как и символы одинарных кавычек. Если нажать на Mixed (Смесь), то SQL Server 2000 конвертирует объекты с применением той настройки Quoted Identifiers, какая была и в SQL Server 6.5. Если вы не знаете точно, как следует установить эту настройку, то лучше нажать на Mixed. Для продолжения нажмите на Next.

    Экран Completing the SQL Server Upgrade Wizard (Завершение мастера обновления SQL Server)


    Рис. 7.14.  Экран Completing the SQL Server Upgrade Wizard (Завершение мастера обновления SQL Server)

  5. После некоторой задержки появится экран Completing the SQL Server Upgrade Wizard (Завершение мастера обновления SQL Server) (рис. 7.14). При помощи этого экрана вы можете посмотреть все выбранные вами настройки конвертации. Если вы захотите внести в них какие либо изменения, то нажмите на Back и поменяйте настройки. Если ничего менять не надо, то нажмите на Finish, чтобы продолжить процесс конвертации.
  6. Появится диалоговое окно SQL Server Upgrade Script Interpreter (Интерпретатор сценария обновления SQL Server) (рис. 7.15). В этом диалоговом окне отображается исполняющийся список обновляемых объектов, благодаря чему администратор может в какой-то степени участвовать в ходе процесса обновления.

    Диалоговое окно SQL Server Upgrade Script Interpreter (Интерпретатор сценария обновления SQL Server)


    Рис. 7.15.  Диалоговое окно SQL Server Upgrade Script Interpreter (Интерпретатор сценария обновления SQL Server)

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

После завершения процесса обновления появится диалоговое окно Upgrade Complete (Обновление завершено). Нажмите на OK, чтобы убрать его с экрана, а затем нажмите на Close, чтобы закрыть диалоговое окно интерпретатора сценария обновления SQL Server.

Поздравляем! Вы только что обновили свои базы данных SQL Server 6.5 к формату SQL Server 2000.

Инсталляция клиентских компонент

Инсталляция клиентских файлов SQL Server так же проста, как и инсталляция самого SQL Server. Для установки клиентских файлов SQL Server на компьютере-клиенте нужно выполнить следующие действия:

  1. Выполните пункты 1-9 из последовательности действий для локальной инсталляции.
  2. Когда появится диалоговое окно Installation Definition, нажмите на Client Tools Only (Только клиентские инструментальные средства), а затем, чтобы продолжить работу, нажмите на Next.
  3. В появившемся окне Select Components (Выбор компонент) нажмите на нужные опции, а затем нажмите на Next. Вы можете выбрать Management Tools, Client Connectivity, Books Online, Development Tools, Code Samples либо любое сочетание этих опций. По умолчанию выбраны опции Management Tools, Client Connectivity, Books Online и Development Tools.
  4. Когда появится диалоговое окно Start Copying Files, нажмите на Next, чтобы продолжить работу.

Заключение

Теперь вам, наверно, понятно, что небольшие усилия по планированию окупятся благодаря "гладкой" инсталляции SQL Server 2000. Конвертация из старой версии SQL Server также пройдет быстро и беспроблемно, если вы воспользуетесь инструментальными средствами, имеющимися в SQL Server 2000. Теперь, когда СУБД SQL Server 2000 установлена, вам нужно научиться создавать базы данных и управлять ими. Для начала следует освоить SQL Server Enterprise Manager. В лекции 8 вы узнаете, как конфигурировать и администрировать службу SQL Server и процессы сервера, а также как запускать, останавливать и приостанавливать службу SQL Server.

Лекция 8. Работа со службами Microsoft SQL Server Services

Управлять службами SQL Server – дело очень тонкое и требующее специфических знаний о принципах работы компонентах службы: – SQL Server Agent, Microsoft Distributed Transaction Coordinator и Microsoft Search. Рассматриваются доступ к часто изменяющимся параметрам системы. Инструментальные средства SQL Server Service Manager, SQL Server Enterprise Manager и Windows 2000 Service Control Manager позволяют расширить возможности управления службами. Приводятся примечания, защищающие администраторов от некорректных действий.

Установив Microsoft SQL Server 2000, вы можете начать им пользоваться. Но до того, как вы сможете входить в систему и начнете строить свою базу данных, нужно научиться запускать службу SQL Server и ее компоненты – SQL Server Agent, Microsoft Distributed Transaction Coordinator и Microsoft Search. Эти компоненты, описанные в данной лекции, исполняются как отдельные службы, дополняющие службу SQL Server. В данной лекции мы также расскажем, как запускать, останавливать и управлять этими службами при помощи трех инструментальных средств – SQL Server Service Manager, SQL Server Enterprise Manager и Windows 2000 Service Control Manager.

Примечание. В данной лекции сделан упор на описание работы SQL Server 2000 в операционной системе Microsoft Windows 2000, хотя SQL Server 2000 может работать и в Microsoft Windows NT 4. В операционной системе Microsoft Windows 98 SQL Server запускается как исполняемый файл, потому что Windows 98 не поддерживает службы.

Важно, чтобы вы научились управлять службой SQL Server 2000 при помощи Enterprise Manager. Обратите внимание, что данная лекция дает лишь краткое знакомство с Enterprise Manager. Многие задачи, решаемые с помощью Enterprise Manager, будут рассмотрены в следующих лекциях. Это, например, такие задачи, как создание баз данных и объектов, конфигурирование настроек сервера, конфигурирование репликации и управление репликацией, управление резервным копированием. А в другой лекции основное внимание будет уделено применению Enterprise Manager для управления службой SQL Server и другими службами.

Службы SQL Server

Служба – это программа или процесс, выполняющие специфические функции поддержки других программ. Когда вы запускаете SQL Server, в операционной системе Windows NT или Windows 2000 запускается служба SQL Server. Эта служба управляет файлами баз данных, исполняет операторы Transact-SQL (T-SQL), распределяет ресурсы среди пользовательских соединений, исполняющихся одновременно, проверяет непротиворечивость данных и выполняет еще много других задач. Если вы инсталлируете один или несколько экземпляров SQL Server, то службы для отдельных экземпляров SQL Server будут иметь имена MSSQL$ИмяЭкземпляра, где ИмяЭкземпляра – имя экземпляра, назначенное вами при инсталляции. Соответственно, службы SQL Server Agent для экземпляров SQL Server будут иметь имена SQLAGENT$ИмяЭкземпляра. Однако для всех экземпляров SQL Server будет только по одной инсталляции Microsoft Distributed Transaction Coordinator и Microsoft Search.

Программные компоненты этих трех служб вы получаете в рамках лицензии на копию SQL Server. Инсталляция SQL Server Agent производится по умолчанию при инсталляции SQL Server. Если у вас не инсталлированы Microsoft Distributed Transaction Coordinator и Microsoft Search, то вы можете снова запустить инсталляционную программу SQL Server, чтобы установить эти компоненты, которые имеют там названия DTC Client Support и Full-Text Search, соответственно. А сейчас мы расскажем, что делает каждая из этих трех служб.

SQL Server Agent осуществляет планирование и исполнение заданий, оповещений, извещений и планов обслуживания базы данных. Без этой службы работа администратора баз данных станет гораздо более трудной, а может, вообще невозможной. Благодаря SQL Server Agent можно автоматизировать рутинные процедуры по обслуживанию базы данных. Например, вы можете создать задание, которое будет автоматически выполнять резервное копирование базы данных ежесуточно в 1 час пополуночи, и другое задание, которое будет автоматически выполнять резервное копирование журнала транзакций каждые полчаса. Чтобы следить за производительностью вашей системы, можно создать оповещение о состоянии производительности, которое будет информировать вас, если загруженность центрального процессора сервера превысит 90%. Для решения подобных задач нужно запускать службу SQL Server Agent, которую можно сконфигурировать на автоматический запуск при запуске SQL Server, а можно запускать и вручную. Вам следует сконфигурировать ее на автоматич еский запуск, что будет гарантировать исполнение ваших запланированных заданий, оповещений и извещений. В лекции 30 будет рассказано, как создать план обслуживания базы данных, а в лекции 31 – как при помощи SQL Server Agent назначать задания, оповещения и извещения.

Microsoft Distributed Transaction Coordinator – это администратор транзакций (transaction manager), при помощи которого в транзакции ваших приложений можно включать данные из различных источников, в том числе данные из баз данных с удаленных компьютеров. Это значит, что при помощи одной транзакции можно обновлять данные на многих серверах, доступных через сеть. Администратор транзакций гарантирует, что все обновления станут постоянными для всех источников данных (если транзакция зафиксирована) или, в случае ошибки, что для всех источников данных будет произведен откат всех изменений. (Об администраторе транзакций Microsoft Distributed Transaction Coordinator см. лекцию 25.)

Запускайте службу Microsoft Search, когда вам нужна поддержка полнотекстного индексирования и поиска. Благодаря полнотекстному индексированию возможно выполнение более сложного поиска среди данных, содержащих текстовые строки. Например, вы можете искать слова, близкие к заданному слову, или можете искать определенную фразу.

Как мы уже говорили, имеется несколько инструментальных средств для остановки и запуска служб SQL Server: SQL Server Service Manager, SQL Server Enterprise Manager и Windows 2000 Service Control Manager. Давайте сначала рассмотрим SQL Server Service Manager, при помощи которого можно управлять службами SQL Server, SQL Server Agent, Microsoft Distributed Transaction Coordinator и Microsoft Search.

Применение SQL Server Service Manager

Для запуска или остановки служб SQL Server при помощи SQL Server Service Manager, выполните следующие действия (а ещё, как вы увидите, службу SQL Server можно и приостанавливать).

  1. Нажмите на экранную кнопку Start, наведите курсор на Programs, затем наведите курсор на Microsoft SQL Server, а затем выберите Service Manager, чтобы открылось приложение Service Manager (рис. 8.1).
  2. В выпадающих списках Server и Services будут показаны локальное имя сервера и название службы SQL Server. В ниспадающем списке Server нужно выбрать имя сервера, службами которого вы хотите управлять. (Обратите внимание, что вы можете применять Service Manager для управления серверами через сеть.) В ниспадающем списке Services выберите службу, которой вы хотите управлять: SQL Server (MSSQLSERVER), Microsoft Distributed Transaction Coordinator (Distributed Transaction Coordinator), Microsoft Search (Microsoft Search) или SQL Server Agent (SQLSERVERAGENT).

    SQL Server Service Manager


    Рис. 8.1.  SQL Server Service Manager

  3. Теперь, нажимая на соответствующие экранные кнопки, вы можете запустить или остановить выбранную службу. А если вы выбрали службу SQL Server, то вы сможете еще и приостанавливать ее (pause). Символ в кружочке, несколько левее и ниже центра диалогового окна, показывает текущее состояние выбранной службы. Если служба SQL Server находится в приостановленном состоянии, то для её возобновления нажмите на кнопку Start/Continue (Запустить/Продолжить). Приостановка (pausing) SQL Server запрещает пользователям входить в систему, и вы можете попросить пользователей завершить свои работы и выйти из системы в течение некоторого времени, пока вы не остановите SQL Server. Если остановить SQL Server без приостановки, то все процессы SQL Server будут завершены немедленно. Остановка (stopping) запрещает новые соединения и отсоединяет пользователей, которые соединены в данный момент.
  4. Когда Service Manager запущен, его окно обновляется через каждые 5 секунд. Чтобы изменить интервал обновления, нажмите на маленький значок-иконку в левом верхнем углу диалогового окна, тогда появится меню System, в котором нужно выбрать Options, в результате чего появится диалоговое окно SQL Server Service Manager Options (рис. 8.2).

    Диалоговое окно SQL Server Service Manager Options


    Рис. 8.2.  Диалоговое окно SQL Server Service Manager Options

    В поле Polling interval (Интервал опроса) можно задать другой интервал опроса для служб (в секундах). Если вы установите флажок Verify service control action (Подтверждать действия по управлению службой), то Service Manager будет проверять все ваши действия по запуску, остановке и приостановке служб, запрашивая в диалоговом окне ваше подтверждение на выполнение действия. Настройки интервала опроса и подтверждения действий задаются одинаковыми для всех четырех служб.

    Примечание. Если службы SQL Server и SQL Server Agent не сконфигурированы на автоматический запуск, то вы должны запускать их вручную.

Применение Windows 2000 Service Control Manager

Службы SQL Server можно запускать и останавливать также при помощи Windows 2000 Service Control Manager, как локально, так и через сеть. Вы можете даже сконфигурировать службы SQL Server на автоматический запуск при каждом запуске вашего компьютера. Чтобы службы SQL Server запускались автоматически из Windows 2000 Service Control Manager, выполните следующие действия.

  1. Нажмите на экранную кнопку Start, наведите курсор на Programs, затем наведите курсор на Administrative Tools, а затем выберите Services, чтобы запустить Service Control Manager (рис. 8.3).

    Windows 2000 Service Control Manager


    Рис. 8.3.  Windows 2000 Service Control Manager

  2. Прокрутите список служб и найдите в нем Distributed Transaction Coordinator, Microsoft Search, MSSQLSERVER и SQLSERVERAGENT. Нажмите правой кнопкой мыши на ту службу, настройки запуска которой вы хотите конфигурировать, а затем выберите Properties в контекстном меню, в результате чего появится окно Properties (Свойства) (рис. 8.4).
  3. В ниспадающем списке Startup type (Тип запуска) выберите Automatic, Manual (Вручную) или Disabled (Выключена). Если выбрать Automatic, то служба будет запускаться автоматически всякий раз при включении компьютера. При выборе Manual потребуется запускать эту службу вручную всякий раз, когда вы хотите ее использовать. Выбор Disabled служить для предотвращения запуска службы (как автоматического, так и ручного). Для сохранения выбранной конфигурации нажмите на OK.

    Окно свойств SQL Server Agent


    Рис. 8.4.  Окно свойств SQL Server Agent

  4. В окне Properties имеются еще три вкладки. Вкладка Log On позволяет задать учетную запись, под которой данная служба будет входить в систему. Вкладка Recovery позволяет задать настройки на случай отказа выбранной службы. При помощи вкладки Dependencies (Зависимости) можно посмотреть, от каких служб зависит выбранная служба и какие службы зависят от нее (если таковые имеются). Например, служба SQL Server Agent зависит от службы SQL Server. Служба SQL Server Agent не может быть запущена, если служба SQL Server остановлена.

Применение SQL Server Enterprise Manager

Enterprise Manager – это часть Microsoft Management Console (MMC), "Консоли Управления Microsoft". MMC является основным приложением, служащим для управления всеми аспектами работы компьютера под управлением Windows 2000 Server. В Windows 2000 и в последующих версиях Windows, MMC будет иметь гораздо более важную роль при управлении приложениями Microsoft BackOffice, такими как Microsoft Exchange Server, Microsoft Proxy Server, Microsoft Site Server, Microsoft Systems Management Server и Microsoft SNA Server.

Управление SQL Server

Для конфигурирования и управления инсталляцией SQL Server чаще всего применяется Enterprise Manager. В то время как Service Manager позволяет только запускать, приостанавливать и останавливать службы, Enterprise Manager может останавливать и запускать сервер, а также выполнять следующие действия.

Enterprise Manager (рис. 8.5) является как бы "универсальным средством" для решения всех этих и других задач. В оставшейся части данной лекции мы поможем вам начать пользоваться средством Enterprise Manager. А в других лекциях мы расскажем, как применять Enterprise Manager для решения более сложных задач по управлению SQL Server.

SQL Server Enterprise Manager


Рис. 8.5.  SQL Server Enterprise Manager

Ниже перечислены четыре задачи, которые можно выполнять при помощи Enterprise Manager. Эти задачи нужно выполнить, когда вы впервые начинаете пользоваться некоторой инсталляцией SQL Server. Затем, в последующих разделах, мы более подробно расскажем о каждой из этих задач.

Создание групп сервера

При помощи Enterprise Manager вы можете создавать группы серверов, которые окажутся полезными для решения ваших административных задач. Группы серверов позволяют организовать наборы взаимосвязанных серверов для удобного доступа, подобно тому, как папки позволяют организовывать наборы взаимосвязанных файлов. После этого вы сможете одной командой выполнять действия, которые будут оказывать влияние на все серверы группы, а не повторять одну и ту же команду для каждого сервера*. По умолчанию, при инсталляции SQL Server, создается группа с названием SQL Server Group. Чтобы создать группу серверов, выполните следующие действия.

  1. Нажмите на экранную кнопку Start, наведите курсор на Programs, наведите курсор на Microsoft SQL Server 2000, а затем выберите Enterprise Manager, чтобы запустить приложение Enterprise Manager.
  2. В левой части окна Enterprise Manager будут показаны папки групп серверов (как подпапки Microsoft SQL Server), а в правой части окна будут показаны значки-иконки групп серверов. Чтобы создать группу серверов SQL Server, нажмите правой кнопкой мыши на папку Microsoft SQL Server, а затем выберите New SQL Server Group в появившемся контекстном меню.
  3. Появится диалоговое окно Server Groups, введите в него с клавиатуры имя новой группы серверов (рис. 8.6). Если вы нажмете на селективную экранную кнопку Sub-group of (Подгруппа в ...), то сможете выбрать группу, для которой новая группа серверов будет подгруппой. Если вы нажмете на Top level group (Группа высшего уровня), то ваша новая группа серверов будет группой SQL Server самого высшего уровня, того же уровня, что и группа SQL Server Group. Чтобы сохранить свою новую группу, нажмите на OK.
Регистрация сервера

После того как вы создадите группу SQL Server, вам надо будет зарегистрировать свои локальные или удаленные серверы в качестве членов этой группы. Чтобы зарегистрировать сервер, выполните следующие действия.

Диалоговое окно Server Groups


Рис. 8.6.  Диалоговое окно Server Groups

  1. Нажмите правой кнопкой мыши на значок-иконку группы серверов в правой панели окна Enterprise Manager. (Если заголовок Microsoft SQL Server раскрыт, то вы можете также нажать правой кнопкой мыши на имя папки группы в левой панели окна.) В появившемся контекстном меню выберите New SQL Server Registration.
  2. Появится стартовый экран мастера Register SQL Server Wizard (Мастер регистрации SQL Server). Этот мастер поможет вам в прохождении процесса выполнения многих рутинных административных задач, решаемых с помощью Enterprise Manager. Для продолжения регистрации сервера нажмите на Next.
  3. Появится экран Select а SQL Server (Выберите SQL Server) (рис. 8.7). В списковом поле Available Servers (Доступные серверы) будут показаны инсталляции SQL Server, доступные через сеть. Выберите серверы, которые вы хотите зарегистрировать (или наберите с клавиатуры имя сервера в текстовом поле), а затем нажмите на Add, чтобы переместить имя сервера в списковое поле Added Servers (Добавленные серверы). Завершив действия по выбору, нажмите на Next.

    Экран Select а SQL Server (Выберите SQL Server)


    Рис. 8.7.  Экран Select а SQL Server (Выберите SQL Server)

  4. Появится экран Select An Authentication Mode (Выберите режим аутентификации). Выберите тип защиты, которую вы хотите применять при соединении с вашей инсталляцией SQL Server. (О защите SQL Server см. лекцию 34.) (Если вы выполнили "типичную" инсталляцию, то SQL Server уже сконфигурирован на применение режима аутентификации Windows NT.) Для продолжения нажмите на Next.
  5. Появится экран Select SQL Server Group (Выберите группу SQL Server) (рис. 8.8). Вы можете выбрать уже существующую группу, в которую добавите свой сервер, а можете создать для своего сервера группу высшего уровня. Если вы хотите добавить свой сервер в существующую группу, то нажмите на первую селективную кнопку экрана, а затем выберите имя группы в выпадающем списке. А если вы хотите создать группу, то нажмите на вторую, а затем введите с клавиатуры имя группы в текстовое поле. Для продолжения нажмите на Next.

    Экран Select SQL Server Group (Выберите группу SQL Server)


    Рис. 8.8.  Экран Select SQL Server Group (Выберите группу SQL Server)

  6. Появится экран Completing The Register SQL Server Wizard (Завершение мастера регистрации SQL Server). Серверы, показанные в списке, будут зарегистрированы. Если вы хотите внести какие-либо изменения, то нажмите на Back, а если изменения не нужны, то нажмите на Finish, и тогда запустится процесс регистрации.
  7. Появится диалоговое окно Register SQL Server Messages (Сообщения регистрации SQL Server) (рис. 8.9), являющееся подтверждением успешности вашей регистрации. Чтобы закрыть это окно, нажмите на Close.

    Диалоговое окно Register SQL Server Messages (Сообщения регистрации SQL Server)


    Рис. 8.9.  Диалоговое окно Register SQL Server Messages (Сообщения регистрации SQL Server)

Доступ к свойствам сервера

После успешной регистрации вашего сервера с помощью Enterprise Manager вы получаете доступ ко всем его свойствам, базам данных и объектам. Чтобы посмотреть свойства и объекты только что зарегистрированного сервера, сначала раскройте имя группы сервера в левой панели окна Enterprise Manager. Появится список всех серверов из этой группы. Затем раскройте имя сервера, чтобы стали видны его свойства (рис. 8.10). (В последующих лекциях будет подробно объяснено, как управлять этими свойствами и как их конфигурировать.)

 Свойства и объекты сервера


Рис. 8.10.  Свойства и объекты сервера

Изменение стандартного пароля

Все инсталляции SQL Server имеют встроенную административную учетную запись, "sa" ("sa" расшифровывается как system administrator, системный администратор). У новых инсталляций SQL Server, пользовательской учетной записи не назначается никакого пароля. Чтобы обеспечить наивысший уровень защищенности ваших инсталляций SQL Server, учетной записи sa надо назначить пароль. Для этого выполните следующие действия.

  1. Получите доступ к свойствам сервера, у которого вы хотите изменить свойства учетной записи sa (в соответствии с описанием в предыдущем разделе).
  2. Раскройте папку Security, а затем нажмите на Logins, чтобы в правой панели появились бы установленные пользовательские учетные записи SQL Server (рис. 8.11).
  3. Нажмите правой кнопкой мыши на учетную запись sa, а затем выберите Properties в появившемся контекстном меню. Откроется окно SQL Server Login Properties (Свойства входа в систему SQL Server) (рис. 8.12).В окне SQL Server Login Properties можно задать и некоторые другие настройки (см. лекцию 34).
  4. Введите с клавиатуры новый пароль в текстовое поле Password, а затем нажмите на OK. Откроется диалоговое окно Confirm Password для проверки введенного пароля на отсутствие опечаток.

    Установленные пользовательские учетные записи SQL Server


    Рис. 8.11.  Установленные пользовательские учетные записи SQL Server

     Окно SQL Server Login Properties (Свойства входа в систему SQL Server)


    Рис. 8.12.  Окно SQL Server Login Properties (Свойства входа в систему SQL Server)

  5. Повторите ввод пароля и затем нажмите на OK. Вы только что выполнили действие, критически важное для обеспечения защиты вашей инсталляции SQL Server.
    Предупреждение.Вы должны надежно запомнить выбранный пароль. Если вы его забудете, то придется переинсталлировать SQL Server*.
Управление другими службами

Enterprise Manager можно также применять для управления другими службами-компонентами SQL Server: SQL Server Agent, Microsoft Distributed Transaction Coordinator и Microsoft Search. Как мы уже говорили раньше, он является единственным инструментальным средством, при помощи которого можно управлять этими службами, так как при помощи Service Control Manager и SQL Server Service Manager службы-компоненты можно только запускать и останавливать.

SQL Server Agent

Enterprise Manager имеет удобный пользовательский интерфейс для управления службой SQL Server Agent. Для доступа к свойствам службы SQL Server Agent выполните следующие действия.

  1. Находясь внутри Enterprise Manager, раскройте обозначение сервера, доступ к которому вы осуществляете, а затем раскройте папку Management (рис. 8.13).

     Папка Management в Enterprise Manager


    Рис. 8.13.  Папка Management в Enterprise Manager

  2. Нажмите правой кнопкой мыши на SQL Server Agent в левой панели или на значок-иконку SQL Server Agent в правой панели, в результате чего появится контекстное меню. При помощи этого меню вы можете: останавливать или запускать службу SQL Server Agent; просматривать журнал ошибок; запускать мастеры, чтобы данный сервер был основным (master) либо целевым (target) для выполнения заданий; создавать задания, оповещения и операторы; просматривать окно свойств (см. лекцию 31).
  3. В этом контекстном меню выберите Properties (Свойства). Появится окно свойств SQL Server Agent, показанное на рис. 8.14.
  4. В этом окне вы можете сконфигурировать различные настройки для службы SQL Server Agent, имеющиеся на многочисленных вкладках – General (Общие), Advanced (Дополнительно), Alert System (Система оповещений), Job System (Система заданий) и Connection (Соединение). В нижней части окна имеется кнопка Help, с помощью которой можно получить подробные объяснения обо всех настройках, имеющихся на открытой вкладке.

 Окно свойств для SQL Server Agent


Рис. 8.14.  Окно свойств для SQL Server Agent

Microsoft Distributed Transaction Coordinator

Что касается службы Microsoft Distributed Transaction Coordinator, то Enterprise Manager может только запускать ее и останавливать. Для этого раскройте обозначение нужного сервера, а затем раскройте папку Support Services (Поддержка служб) (рис. 8.15).

Нажмите правой кнопкой мыши на Distributed Transaction Coordinator в левой или в правой панели. Для запуска или остановки службы выберите Start либо Stop в контекстном меню.

  Папка Support Services (Поддержка служб)


Рис. 8.15.  Папка Support Services (Поддержка служб)

Microsoft Search

Чтобы получить доступ к меню с настройками для службы Microsoft Search, раскройте папку Support Services, как было рассказано в предыдущем разделе, а затем нажмите правой кнопкой мыши на Full-Text Search (Полнотекстный поиск) в левой или в правой панели. Из этого меню вы можете запускать и останавливать службу Microsoft Search, очищать каталоги полнотекстного поиска, а также просматривать свойства службы.

Заключение

В качестве основных средств управления все администраторы применяют SQL Server Service Manager и Enterprise Manager. В данной лекции мы дали обзор основных действий, необходимых для управления и конфигурирования вашей инсталляции SQL Server и служб SQL Server. (Более сложные вопросы администрирования будут рассмотрены в нашем курсе далее.) Теперь вы уже сможете начать создавать свои собственные базы данных и таблицы. Как вы увидите в следующих двух лекциях, SQL Server Enterprise Manager является важной компонентой, нужной для создания баз данных и таблиц и управления ими.

Лекция 9. Создание баз данных

Обзор всех тонкостей работы при создании баз данных: от теории к практическим действиям. Первичные и вторичные файлы данных, файлы журналов транзакций, группы файлов – все это необходимые знания, помогающие более эффективно организовать работу базы данных, способную к масштабируемости, устойчивости и быстрой работе. Всевозможные правила и рекомендации ограничивают администратора от неправильных действий. Обзор четырех системных баз данных (master, tempdb, model, msdb). Примеры использования Create Database Wizard, Enterprise Manager, T-SQL позволяет выбрать более эффективный для вас способ создания базы данных. Особое внимание уделено T-SQL, т.к. его использование в следующих лекциях станет намного шире.

После того как вы инсталлировали Microsoft SQL Server 2000, а затем спроектировали размещение баз данных и дисков, можно приступить к созданию баз данных. SQL Server 2000 применяет усовершенствованные методы хранения данных и управления дисковой памятью, появившиеся в SQL Server 7. В более ранних версиях продукта для размещения данных использовались логические устройства и сегменты фиксированного размера, но SQL Server 2000 использует файлы и группы файлов, которые могут быть сконфигурированы на автоматический рост или уменьшение. В данной лекции будет подробно рассказано о файлах и группах файлов, а также рассказано, как управлять ростом базы данных. Вы также познакомитесь с тремя методиками создания баз данных, узнаете, как просматривать информацию о базах данных и как удалять ненужные базы данных.

Структура базы данных

Каждая база данных SQL Server состоит из набора файлов операционной системы. Эти файлы могут группироваться в группы файлов, что облегчает их администрирование, помогает в размещении данных и повышает производительность. В данном разделе вы познакомитесь с файлами и группами файлов SQL Server и узнаете об их значении для создания баз данных.

Файлы

Как мы уже сказали, база данных SQL Server состоит из набора файлов операционной системы. Файл базы данных может быть либо файлом данных, либо файлом журнала. Файлы данных служат для хранения данных и объектов, таких как таблицы, индексы, представления, триггеры и хранимые процедуры. Имеется два типа файлов данных: первичные и вторичные. Файлы журналов служат только для хранения информации из журналов транзакций. Место на диске, отводимое для файлов журналов всегда должно администрироваться отдельно от места, отводимого для данных, и никогда не должно быть частью файла данных.

Каждая база данных должна создаваться хотя бы с одним файлом данных и с одним файлом журнала; файлы не могут быть использованы более чем в одной базе данных – т.е., базы данных не могут разделять файлы (использовать файлы совместно). В приведенном ниже перечне указаны три типа файлов, которые могут быть использованы в базах данных:

Примечание. Максимальный размер файлов базы данных SQL Server составляет 32 терабайта для файлов данных и 4 терабайта для файлов журналов.

Простая база данных может иметь один первичный файл данных, достаточно большой, чтобы в него могли поместиться все данные и объекты и один файл – журнал транзакций. Более сложная база данных может иметь один первичный файл данных, пять вторичных файлов данных и два файла – журнала транзакций.

Но как же данные смогут размещаться по многим файлам данных? А вот для этого и применяются группы файлов.

Группы файлов

При помощи групп файлов можно группировать файлы, это нужно для администрирования и размещения данных. (Группы файлов похожи на сегменты в Microsoft SQL Server 6.5 и в более ранних версиях.) Применение групп файлов позволяет повысить производительность базы данных, т.к. становится возможным создание базы данных, размещенной на многих дисках, на многих контроллерах и на RAID-массивах. (Про RAID-массивы см. лекцию 5.) При помощи групп файлов можно создавать таблицы и индексы, размещаемые на заданных физических дисках, контроллерах и массивах дисков. В данной лекции мы рассмотрим некоторые примеры такой работы.

Имеются три типа групп файлов со следующими основными свойствами:

Чтобы повысить производительность, вы можете управлять размещением данных, создавая таблицы и индексы в разных группах файлов. Так, вы можете пожелать поместить таблицу, доступ к которой бывает часто, в группу файлов на большом массиве дисков (например, составленным из 10 дисков), а другую таблицу, доступ к которой бывает реже, поместить в другую группу файлов, расположенную на отдельном, меньшем массиве дисков (например, из 4 дисков). Таким образом, можно размещать таблицы, доступ к которым происходит чаще, по большему количеству дисков, позволяя этим дискам осуществлять параллельный ввод-вывод. Если вы не применяете массивы RAID и у вас имеется несколько дисковых накопителей, то у вас остается возможность применения групп файлов. Например, вы можете создать по отдельному файлу для каждого дискового накопителя, разместив каждый файл в отдельную пользовательскую группу файлов. Тогда вы сможете поместить каждую таблицу или индекс в отдельный файл (и на отдельный диск), назначив группу файлов при создании этой таблицы или индекса. Пример размещения файлов показан на рис. 9.1: один первичный файл данных размещен в первичной группе файлов на диске C, по одному вторичному файлу данных размещено в каждой из пользовательских групп файлов (FG1 и FG2) на дисках E и F и один файл-журнал размещен на диске G. После этого вы можете создавать таблицы и индексы в каждой из пользовательских групп файлов – FG1 или FG2.

Применение групп файлов для управления размещением данных


Рис. 9.1.  Применение групп файлов для управления размещением данных

А может быть, вы будете применять пользовательскую группу файлов для распределения данных по нескольким дискам. На рис. 9.2 показана пользовательская группа файлов FG1, состоящая из двух вторичных файлов данных, один из которых находится на диске E, а другой – на диске F (диске G размещен файл-журнал, а на C – первичный файл). В этом примере мы снова предполагаем, что каждый файл базы данных создан на отдельном физическом дисковом накопителе, и у нас нет аппаратной реализации RAID. Таблицы и индексы, созданные в этой пользовательской группе файлов, будут размещены сразу на двух дисках, потому что SQL Server применяет стратегию пропорционального расходования ресурсов.

Применение одной группы файлов для распределения данных по нескольким дискам


Рис. 9.2.  Применение одной группы файлов для распределения данных по нескольким дискам

Если вы применяете RAID-систему, то вам может потребоваться распределить данные из большой таблицы по нескольким логическим дискам-массивам, сконфигурированным на двух или на нескольких RAID-контроллерах. Для этого вам надо будет создать пользовательскую группу файлов, с файлами, соответствующими каждому из этих контроллеров. Допустим, вы создали два вторичных файла данных, каждый – на своем массиве дисков, а каждый логический массив состоит из восьми физических дисков и сконфигурирован как RAID 5. Эти два массива обслуживаются двумя отдельными RAID-контроллерами. Чтобы создать таблицу или индекс, располагающуюся на обоих этих контроллерах (т.е. на всех 16 дисковых накопителях), создайте одну пользовательскую группу файлов, в которую поместите оба файла, а затем создайте таблицу или индекс в этой группе файлов. Пользовательская группа файлов FG1 распределена по 16 физическим дискам (двум логическим дискам – RAID-массивам) (см. рис. 9.3). Там также показаны первичный файл данных на другом контроллере (с RAID 1) и файл журнала еще на одном контроллере (с RAID 10).

SQL Server позволяет оптимизировать распределение ваших данных по дисковым накопителям, за счет автоматического пропорционального расслоения (распределения) данных по всем файлам группы файлов. "Расслоение" (striping) – это термин, применяемый для описания распределения данных по нескольким файлам базы данных. Расслоение файлов SQL Server работает независимо от расслоения дисков RAID-массивов и, как вы видели из наших примеров, может применяться как в сочетании с RAID, так и самостоятельно.

Чтобы обеспечить расслоение данных, SQL Server записывает данные в файлы в объемах, пропорциональных свободному месту, остающемуся в файлах (относительно свободному месту в других файлах). Место для таблиц и индексов распределяется в виде экстентов (extents). Экстент – это единица для измерения места на диске, один экстент состоит из 8 страниц, а одна страница состоит из 8 Кб, так что один экстент состоит из 64 Кб. Допустим, нужно распределить 5 экстентов на файл F1, в котором свободно 400 Мб, и на файл F2, в котором свободно 100 Мб; тогда 4 экстента будут распределены на файл F1 и один экстент распределен на файл F2. Оба файла заполнятся до конца примерно одновременно, благодаря чему операции ввода-вывода будут распределяться по дискам более равномерно. Пропорциональное заполнение будет применяться и для пользовательских, и для первичных групп файлов. Если задать все файлы в группе файлов имеющими одинаковый начальный размер, то данные, по мере их загрузки, будут распределяться по файлам равномерно. Этот метод, когда в группах создаются файлы одинакового начального размера, можно порекомендовать для равномерного распределения данных по дисковым накопителям и, одновременно с этим, для равномерного распределения операций ввода-вывода.

 Распределение пользовательской группы файлов по нескольким RAID-контроллерам


Рис. 9.3.  Распределение пользовательской группы файлов по нескольким RAID-контроллерам

Другая польза от применения групп файлов состоит в том, что SQL Server может выполнять резервные копирования базы данных файлами или группами файлов. Если ваша база данных слишком велика, чтобы ее можно было скопировать за один раз, то вы можете копировать ее по частям. (О методике такого резервного копирования см. лекцию 32.)

Правила и рекомендации

Прежде чем создавать базу данных, вы должны выработать тщательно продуманную стратегию использования файлов и групп файлов. Для этого вам нужно знать следующие правила SQL Server:

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

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

Автоматический рост файлов

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

Файлы создаются имеющими некоторый начальный размер. После того как этот начальный размер заполнится, SQL Server увеличит размер файла на некоторую заданную величину, называющуюся приращение роста (growth increment). Когда это добавленное свободное место заполнится, SQL Server добавит еще одно приращение роста. При необходимости, файл продолжит свой рост с заданным темпом до тех пор, пока не заполнится весь диск или пока его размер не достигнет ограничения на максимальный размер файла (если таковое ограничение задано).

Примечание. Автоматический рост файла и пропорциональное заполнение – это разные вещи. При помощи автоматического роста файла SQL Server автоматически увеличивает размер файла, когда файл становится заполненным. А при помощи пропорционального заполнения SQL Server размещает данные в файлах пропорционально свободному месту, имеющемуся в этих файлах, но не увеличивает размеры файлов.

Максимальный размер файла означает именно это – максимальный размер, до которого разрешается расти файлу. Эта величина тоже задается при создании файла, но может быть изменена впоследствии при помощи Enterprise Manager или команды ALTER DATABASE. Если максимальный размер файла не задан, то SQL Server будет увеличивать размер файла до тех пор, пока не заполнится все место на диске. Чтобы не истратить все место на диске (а в этом случае произойдет ошибка в работе SQL Server), задавайте максимальный размер для каждого файла. Если даже файл дорастет до максимального размера, вы сможете увеличить этот максимальный размер при помощи оператора ALTER DATABASE. Вы также можете создать еще один файл на том же (если там имеется свободное место) или на другом диске. Новый файл должен обязательно быть в той же самой группе файлов, что и первоначальный файл. Если позволить файлу расти без ограничений, как это задано по умолчанию, то вам придется создавать файл на другом диске, имеющем свободное место.

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

Системные базы данных

При инсталляции SQL Server создаются четыре системных базы данных: master (главная), tempdb (временная), model (модель) и msdb.

Каждая из этих системных баз данных имеет свои собственные первичный файл данных и файл журнала. Системные базы данных хранятся в папке для хранения системных файлов, назначенной вами при инсталляции SQL Server.

Создание баз данных

SQL Server предлагает три метода для создания баз данных: воспользоваться мастером Create Database Wizard, создать базу данных при помощи SQL Server Enterprise Manager или применить команду CREATE DATABASE, которую можно сохранить в файле и запускать как сценарий. Эти три метода будут описаны ниже, в следующих трех подразделах. Вы должны знать, что мастер Create Database Wizard обладает некоторыми ограничениями. Так, он помещает все созданные им файлы данных на один дисковый накопитель, в одну заданную вами папку. При использовании этого мастера вы не сможете поместить файлы данных в другое физическое местоположение (ни на другие дисковые накопители, ни в другие папки). Вы можете поместить файлы журналов на диск или в папку, отличающуюся от диска или папки для файлов данных, но, опять таки, только в одно физическое местоположение. Нельзя задать пользовательские группы файлов, и все файлы получат одинаковые настройки для роста. Из-за этих ограничений мастер Create Database Wizard является наилучшим решением, когда вам нужно создать в базе данных только один первичный файл данных и один файл для журнала транзакций. (С другой стороны, в дальнейшем вы всегда можете добавить в базу данных файлы и группы файлов, если они вам понадобятся.)

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

Применение мастера Create Database Wizard

Для тех, кто еще не имеет достаточного опыта, применение мастера Create Database Wizard может оказаться наиболее простым способом создания баз данных. Если его ограничения, о которых говорилось выше, не влияют на требования вашей задачи то, конечно, следует пользоваться этим методом создания баз данных. Для создания базы данных при помощи мастера Create Database Wizard, выполните следующие действия.

  1. Запустите SQL Server Enterprise Manager и выберите сервер, на котором вы хотите создать базу данных. Чтобы выбрать сервер, сначала раскройте папку Microsoft SQL Servers (для этого нажмите на значок "+" слева от имени папки). Раскройте папку SQL Server Group, а затем нажмите на имя нужного вам сервера. В меню Tools выберите Wizards. Раскройте Database (см. рис. 9.4).

    Экран Select Wizard (Выбор мастера)


    Рис. 9.4.  Экран Select Wizard (Выбор мастера)

  2. Чтобы запустить мастер Create Database Wizard, дважды щелкните на Create Database Wizard. Откроется стартовый экран мастера (рис. 9.5).

    Стартовый экран мастера Create Database Wizard


    Рис. 9.5.  Стартовый экран мастера Create Database Wizard

  3. Нажмите на Next, и вы перейдете к экрану Name the Database and Specify its Location (Дайте имя для базы данных и укажите ее местоположение) (рис. 9.6). Введите с клавиатуры имя создаваемой базы данных и местоположение для файлов данных и файлов журналов. Местоположение должно правильно указывать на диск и папку, которые уже должны иметься в системе (локально). Если нажать на кнопку с многоточием ("..."), то вы сможете поискать и выбрать нужную папку. После того как вы зададите имя базы данных и местоположения пути к файлам данных и журналов, нажмите на Next, чтобы продолжить работу мастера.

    Экран Name the Database and Specify its Location (Дайте имя для базы данных и укажите ее местоположение)


    Рис. 9.6.  Экран Name the Database and Specify its Location (Дайте имя для базы данных и укажите ее местоположение)

    Примечание. На остальных рисунках этого раздела показано создание базы данных с именем MyDB, имеющей первичный файл данных в C:\mssql2k\MSSQL\data и один файл журнала в F:\mssql2k\MSSQL\data.
  4. Появится экран Name the Database Files (Дайте имена файлам базы данных) (рис. 9.7). В этом экране вы можете ввести с клавиатуры имена и начальные размеры для каждого из файлов вашей базы данных. Первичный файл базы данных создается автоматически и получает в качестве префикса своего имени имя базы данных. Вы можете либо согласиться с этим именем, либо ввести с клавиатуры другое имя. Первичный файл данных имеет расширение .mdf. Если вы имеете какое-либо представление о будущем размере вашей базы данных, то введите сейчас этот размер в поле для задания начального размера (Initial Size). Если вы не знаете будущий размер вашей базы данных, то оставьте размер, указанный по умолчанию; вы сможете изменить его позднее при помощи команды ALTER DATABASE. Любые файлы, которые вы создадите в дополнение к первому файлу (первичному), будут являться вторичными файлами и автоматически получат расширения .ndf. Все созданные здесь файлы будут помещены в первичную группу файлов. Пользуясь мастером Create Database Wizard, пользовательские группы файлов создавать невозможно.

    Экран Name the Database Files (Дайте имена файлам базы данных)


    Рис. 9.7.  Экран Name the Database Files (Дайте имена файлам базы данных)

    В нашем примере мы оставили заданный по умолчанию первичный файл MyDB_Data и добавили вторичный файл, MyDB_Data2. Оба этих файла будут помещены в одно и то же место, которое вы указали на шаге 3. (Если вы не хотите, чтобы все файлы данных размещались на одном диске и в одной и той же папке и группе файлов, не продолжайте работу мастера, а создайте базу данных одним из методов, описанных в следующих разделах.) Для продолжения работы мастера нажмите на Next.
  5. Появится экран Define the Database File Growth (Настройте рост файлов базы данных) (рис. 9.8). Как уже говорилось в данной лекции, SQL Server может по мере необходимости автоматически увеличивать размер вашей базы данных, что снимает с администратора часть работы по обслуживанию. Вообще говоря, рекомендуется включать опцию для автоматического роста файлов (Automatically grow the database files), потому что она совсем немного расходует ресурс производительности системы, а если ее не задать, то вам в случае необходимости придется вручную настраивать размер базы данных. Если вы нажмете на Automatically grow the database files, то можно будет задать способ, которым будет выполняться рост файла базы данных: добавками фиксированного размера (задаваемого в мегабайтах) либо как некоторая доля от текущего размера (задаваемая в процентах). Помните, что файл базы данных будет расти только в случае необходимости. Кроме того, вы должны либо ограничить возможный рост базы данных (задать максимальный размер), либо позволить ей расти без ограничений. Настройки, заданные в этом экране, применяются ко всем файлам базы данных, созданным на шаге 4. Вы не можете применять мастер Create Database Wizard для конфигурирования индивидуальных настроек роста отдельных файлов. Для продолжения работы мастера нажмите на Next.

    Экран Define the Database File Growth (Настройте рост файлов базы данных)


    Рис. 9.8.  Экран Define the Database File Growth (Настройте рост файлов базы данных)

  6. Появится экран Name the Transaction Log Files (Дайте имена файлам журнала транзакций). Этот экран выглядит так же, как и экран Name the Database Files, но он относится к файлу журнала. (Помните, что журнал транзакций хранит записи обо всех изменениях базы данных, которые понадобятся при восстановлении базы данных при отказе системы.) Первый файл журнала транзакций создается автоматически и получает в качестве префикса имени имя, заданное для базы данных. Вы можете согласиться с этим именем, а можете ввести с клавиатуры и другое. Данные журнала транзакций хранятся в файле с расширением .ldf. Если надо, вы можете добавить дополнительные файлы журналов. Если вы имеете какое-либо представление о будущем размере журнала транзакций, то введите сейчас этот размер, а если не знаете, то оставьте размер, указанный по умолчанию (вы сможете изменить его позднее при помощи команды ALTER DATABASE ). Для продолжения нажмите на Next.
  7. Появится экран Define the Transaction Log File Growth (Настройте рост файлов журнал транзакций). Этот экран выглядит так же, как и экран Define the Database File Growth, но в нем задаются настройки роста для файла журнала. Как и в шаге 5, вы можете выбрать автоматический рост файлов и, если хотите, задать настройки роста и максимальный размер файла. Для продолжения нажмите на Next.
  8. Появится экран Completing the Create Database Wizard (Завершение работы мастера Create Database Wizard) (рис. 9.9). Ознакомьтесь с настройками, заданными для вашей новой базы данных. Если все хорошо, то нажмите на Finish, чтобы завершить создание базы данных, а если нет, то нажмите на Back и внесите необходимые изменения.

    Экран Completing the Create Database Wizard (Завершение работы мастера Create Database Wizard)


    Рис. 9.9.  Экран Completing the Create Database Wizard (Завершение работы мастера Create Database Wizard)

  9. Как только ваша база данных будет создана, появится информационное окно мастера Create Database Wizard, с сообщением, что база данных была успешно создана. Нажмите на OK, чтобы закрыть это окно.
  10. Появится еще одно информационное окно с вопросом, не желаете ли вы создать план обслуживания (maintenance plan) для новой базы данных. Рекомендуется создать план обслуживания, потому что благодаря ему обеспечивается хорошая производительность вашей базы данных, регулярное резервное копирование в случае отказа системы и проверки базы данных на непротиворечивость. Но планы обслуживания мы рассмотрим только в лекции 30, поэтому пока что нажмите на No, чтобы завершить создание базы данных.
Применение Enterprise Manager

При помощи SQL Server Enterprise Manager вы можете создавать более сложные базы данных, чем те, которые можно создать с помощью мастера Create Database Wizard. Вы можете задать разные настройки роста для каждого из создаваемых файлов, а не одинаковые для всех файлов. Вы также можете создавать пользовательские группы файлов. Для создания базы данных при помощи Enterprise Manager выполните последовательность шагов, которые будут перечислены ниже. В нашем примере мы создадим базу данных с именем MyDB, имеющую первичный файл данных, три вторичных файла данных (находящихся в той же самой пользовательской группе файлов) и один файл-журнал.

  1. Откройте Enterprise Manager. В левой панели раскройте группу SQL Server, в которой находится имя сервера, на котором вы хотите создать базу данных, а затем раскройте узел самого этого сервера. Затем нажмите правой кнопкой мыши на папку Databases и выберите New Database.
  2. Откроется окно свойств базы данных (Database Properties) с открытой вкладкой General (Общие) (рис. 9.10). Введите с клавиатуры имя базы данных в поле Name.
  3. Откройте вкладку Data Files (см. рис. 9.11). Как видите, Enterprise Manager автоматически создает первичный файл данных, с именем вашей базы данных в качестве префикса и PRIMARY в качестве имени группы файлов. Вы можете изменить имя, местоположение и размер первичного файла, но вы не сможете изменить группу файла для первичного файла данных. Введите с клавиатуры имя файла (логическое имя), местоположение (физическое имя), размер и группу для каждого из создаваемых вами файлов. Для каждого файла данных, кроме первичного файла, вы можете задать имя пользовательской группы файлов, и, в соответствии с вашим желанием, эта группа файлов будет создана. В нашем примере мы создали вторичный файл данных MyDB_Data2 в группе файлов My_FG.

    Вкладка General окна свойств базы данных


    Рис. 9.10.  Вкладка General окна свойств базы данных

    Вкладка Data Files окна свойств базы данных


    Рис. 9.11.  Вкладка Data Files окна свойств базы данных

    По умолчанию, каждый файл располагается на диске в папке, в которой инсталлирован SQL Server. Вы можете изменить эту настройку, задав другой путь с клавиатуры или при помощи экранной кнопки для его поиска ("...").
  4. В области File Properties (Свойства файла) в нижней части окна вы можете задать настройки автоматического роста для отдельных файлов. Выделите имя файла, для которого вы хотите задать настройки роста. Чтобы разрешить автоматический рост этого файла, установите флажок Automatically grow file. Затем вы можете задать приращение файла, выраженное в мегабайтах или в процентах от свободного места, оставшегося в файле. Нажав на селективную кнопку Restrict file growth (Ограничить рост файла), вы также можете задать максимальный размер файла, указав предел роста, выраженный в мегабайтах, а можете и не ограничивать рост файла. Эти настройки можно задавать при создании каждого из файлов, а можете оставить настройки, применяемые по умолчанию, и задать их позднее при помощи окна Enterprise Manager Database Properties. Если вам понадобится удалить файл из списка, то выделите имя этого файла и нажмите на экранную кнопку Delete.
  5. Завершив конфигурацию всех файлов данных, откройте вкладку Transaction Log и сконфигурируйте файлы журнала транзакций. Файлы журнала конфигурируются точно так же, как и файлы данных, за исключением того, что вы не сможете задать для них группу файлов, потому что они не принадлежат ни одной из групп файлов. Задайте с клавиатуры имя файла (логическое имя), местоположение (физическое имя) и начальный размер для одного или нескольких файлов журнала. Кроме того, задайте настройки автоматического роста файлов журнала, так же как это было описано в п.4 для файлов данных.
  6. После того как вы настроите все файлы так, как вам это нужно, нажмите на OK, и SQL Server создаст базу данных. Вернитесь в Enterprise Manager и нажмите на папку Databases сервера, в который вы только что добавили новую базу данных. Вы увидите в правой панели Enterprise Manager, что SQL Server добавил значок-иконку для этой базы данных.
Применение операторов T-SQL

Возможно, вы пожелаете создавать или изменять свои базы данных при помощи операторов T-SQL, не пользуясь графическим пользовательским интерфейсом (GUI). Вы можете создавать свои собственные сценарии, которые пригодятся при создании баз данных. Допустим, вы создали базу данных, а потом обнаружили, что задали неверное местоположение какого-либо файла. Можно уничтожить эту базу данных и начать все снова. Если для создания базы данных вы применяете сценарий T-SQL, то вы сможете быстро его поправить и запустить снова, а не задавать повторно все данные в графическом пользовательском интерфейсе. Если вам надо создать такую же базу данных на другом компьютере (например, на "горячем" резервном компьютере), то вы можете запустить на нем тот же самый сценарий.

С другой стороны, Enterprise Manager можно применить для генерации сценариев T-SQL, применяемых для создания баз данных (а также сценариев для создания любых объектов баз данных), но только после того, как база данных будет создана. Сценарии, сгенерированные Enterprise Manager, будут содержать все настройки текущей базы данных, что может быть полезно, поэтому вы можете захотеть пользоваться сгенерированным сценарием. Но независимо от того, будете ли вы писать свои сценарии или пользоваться сгенерированными, это окажется полезным для понимания кода T-SQL, применяемого для создания баз данных. В данном разделе мы рассмотрим операторы T-SQL для создания баз данных. Эти команды можно набрать с клавиатуры в файл и создать сценарий. (О создании и запуске сценариев см. лекцию 13.)

Практические советы.

Простая база данных

В данном примере мы создадим базу данных с именем MyDB, содержащую: первичный файл данных (MyDB_root); один вторичный файл данных (MyDB_data1), который по умолчанию останется в первичной группе файлов и один файл журнала транзакций (Log_data1). Ниже показаны операторы SQL, которые создадут базу данных MyDB:

CREATE DATABASE MyDB 
ON 
(NAME = MyDBroot,  --Первичный файл данных 
FILENAME = 'c:\mssql2k\MSSQL\data\mydbroot.mdf', 
SIZE = 8MB, 
MAXSIZE = 9MB, 
FILEGROWTH = 100KB), 
(NAME = MyDBdata1,   --Вторичный файл данных
FILENAME = 'c:\mssql2k\MSSQL\data\mydbdata1.ndf', 
SIZE = 1000MB, 
MAXSIZE = 1500MB, 
FILEGROWTH = 100MB) 
LOG ON 
(NAME = Logdata1, --Файл журнала
FILENAME = 'e:\log_files\logdata1.ldf', 
SIZE = 1000MB, 
MAXSIZE = 1500MB, 
FILEGROWTH = 100MB)

Обратите внимание, что в приведенном выше примере первичный и вторичный файлы данных оба расположены на диске C, а файл журнала расположен на диске E. Мы уже говорили, что файлы данных и файлы журналов нужно всегда размещать на физически разных устройствах, чтобы повысить производительность ввода-вывода при доступе к дискам. Кроме того, обратите внимание, что были использованы рекомендуемые расширения имен файлов – .mdf, .ndf, и .ldf. Настройки SIZE (Размер), MAXSIZE (Максимальный размер) и FILEGROWTH (Рост файла) могут быть заданы в Кб либо в Мб (по умолчанию применяются Мб).

Дополнительная информация. Более подробное описание оператора CREATE DATABASE вы найдете в Books Online, в теме "Create Database" (Создание базы данных).
Практические советы.

Этот пример базы данных относится к системе с несколькими дисковыми накопителями или с несколькими массивами дисков в RAID-системе. Мы будем употреблять термин "диск", когда будем говорить и об отдельных дисковых накопителях, и о массивах дисковых накопителей, работающих как том RAID. Будут созданы несколько файлов, каждый на своем отдельном диске. Каждый файл помещается в одну из двух групп файлов. Наша база данных получит имя Sales и будет содержать следующие файлы:

Ниже показан текст скрипта, который создаст базу данных Sales. Так как будут создаваться пользовательские группы файлов, то в команде CREATE DATABASE будет содержаться ключевое слово FILEGROUP.

CREATE DATABASE Sales 
ON PRIMARY             	     --Явное задание первичной
                                     --группы файлов (не обязательно) 
(NAME = Sales_root,       --Первичный файл данных
FILENAME = 'c:\mssql2k\MSSQL\data\salesroot.mdf', 
SIZE = 8MB, 
MAXSIZE = 10MB, 
FILEGROWTH = 1MB), 
FILEGROUP customers_group    --Группа файлов для следующих файлов 
(NAME = customerdata1,          --Вторичный файл данных
FILENAME = 'd:\mssql2k\MSSQL\data\customerdata1.ndf', 
SIZE = 800MB, 
MAXSIZE = 1000MB, 
FILEGROWTH = 100MB), 
(NAME = customerdata2,           --Вторичный файл данных
FILENAME = 'e:\mssql2k\MSSQL\data\customerdata2.ndf', 
SIZE = 800MB, 
MAXSIZE = 1000MB, 
FILEGROWTH = 100MB), 
(NAME = customerdata3,           --Вторичный файл данных
FILENAME = 'f:\mssql2k\MSSQL\data\customerdata3.ndf', 
SIZE = 800MB,
MAXSIZE = 1000MB, 
FILEGROWTH = 100MB), 
FILEGROUP products_group   	--Группа файлов для следующих файлов 
(NAME = productdata1,            	--Вторичный файл данных
FILENAME = 'g:\mssql2k\MSSQL\data\productdata1.ndf', 
SIZE = 500MB, 
MAXSIZE = 700MB, 
FILEGROWTH = 100MB), 
(NAME = productdata2,           	--Вторичный файл данных
FILENAME = 'h:\mssql2k\MSSQL\data\productdata2.ndf', 
SIZE = 500MB, 
MAXSIZE = 700MB, 
FILEGROWTH = 100MB) 
LOG ON 
(NAME = logdata1,                    	--Файл журнала
FILENAME = 'i:\log_files\logdata1.ldf', 
SIZE = 800MB, 
MAXSIZE = 1000MB, 
FILEGROWTH = 200MB)

Из комментариев к этому примеру видно, что перед заданием первичного файла можно в явном виде задать первичную группу файлов. Но явное задание не обязательно, т.к. по умолчанию считается, что происходит задание первичной группы файлов. Две другие группы файлов, customers_group и products_group, задаются непосредственно перед определениями размещаемых в них файлов. Все файлы, перечисленные после определения группы файлов, будут помещаться в эту группу файлов до тех пор, пока не появится определение новой группы файлов или не появится предложение LOG ON.

Обратите внимание на обозначения дисков для файлов. Каждый из файлов создается на своем диске, чтобы при создании таблиц и индексов в группах файлов данные могли бы равномерно распределяться по многим дискам. Например, данные из таблицы, созданной в группе файлов customers_group разместятся на нескольких дисках, на которых будут располагаться файлы customer_data1.ndf, customer_data2.ndf и customer_data3.ndf. Файл журнала тоже располагается на отдельном диске, на котором не располагаются никакие файлы данных, благодаря чему становится возможной запись файла журнала с последовательным вводом-выводом (перемещением записывающих головок дискового накопителя только на соседние дорожки).

Если вы не хотите, чтобы SQL Server производил автоматический рост файла, то задайте FILEGROWTH=0, тогда файлу будет разрешено заполнять только первоначально отведенное для него пространство. Эту настройку можно задать, когда происходит работа со статическими таблицами, т.е. с таблицами, которые не растут. В этом случае в операторе не требуется задавать MAXSIZE, максимальный размер файла будет совпадать с начальной настройкой SIZE.

Примечание. Те, кто хорошо знаком с SQL Server версии 6.5 или более ранними версиями, заметят, что перед созданием базы данных больше не применяется команда DISK INIT для создания логических устройств. Вместо логических устройств теперь используются файлы.

Просмотр баз данных

После того как вы создали базу данных, вы можете применять Enterprise Manager для поиска и просмотра имеющихся в ней объектов. Вы также можете просматривать информацию о базе данных, исполняя команды SQL из средства OSQL с интерфейсом командной строки. Сейчас мы расскажем вам об обоих этих способах просмотра баз данных.

Применение Enterprise Manager

Для просмотра информации в базе данных при помощи Enterprise Manager, выполните следующие действия:

  1. Находясь в Enterprise Manager, нажимая на значки-плюсы, раскройте списки для группы SQL Server, имя сервера, на котором находится база данных, и папку Databases (см. рис. 9.12).

    Enterprise Manager с раскрытой папкой Databases


    увеличить изображение

    Рис. 9.12.  Enterprise Manager с раскрытой папкой Databases

  2. Нажмите на имя нужной базы данных, и тогда отобразятся находящиеся в ней объекты (см. рис. 9.13).

    Объекты из базы данных Northwind


    увеличить изображение

    Рис. 9.13.  Объекты из базы данных Northwind

Применение команд SQL

Информацию о базах данных можно просматривать, также запуская команды T-SQL, при помощи окна с приглашением командной строки или из Query Analyzer. Чтобы посмотреть информацию о базе данных при помощи команды SQL, выдаваемой из командной строки, откройте окно с приглашением командной строки и осуществите соединение с SQL Server через OSQL, при помощи, например, такой команды:

OSQL   -U<имя_пользователя>   -P<пароль>   -S<имя_сервера>

Когда вы будете набирать эту команду, подставьте в нее вместо слов в угловых скобках свои имя пользователя, пароль и имя сервера (сами угловые скобки вводить не надо).

Для применения Query Analyzer нажмите на экранную кнопку Start, укажите на Programs, укажите на Microsoft SQL Server, а затем выберите Query Analyzer.

Теперь вводите команды T-SQL либо в окне Query Analyzer, либо в командной строке OSQL. Для просмотра информации о базах данных запустите такие команды:

Use MyDB--Задает контекст используемой базы данных
GO 
Sp_helpfile--Показывает информацию для всех файлов базы данных
GO--Чтобы посмотреть информацию только для некоторого файла, укажите его имя 
Sp_helpdb MyDB--То же самое, но выдается также информация о месте на диске, 
    выделенном  для базы данных 
GO 
Sp_helpfilegroup--Показывает информацию о группах файлов данной базы данных 
GO--Чтобы посмотреть информацию только о некоторой группе файлов, --укажите ее имя
Sp_helpdb--Показывает информацию обо всех базах данных
GO
Дополнительная информация.Подробности об использовании этих команд и о том, как расшифровывать выдаваемую ими информацию, вы найдете в SQL Server Books Online.

Удаление баз данных

Когда-нибудь вам может понадобиться удалить какую-либо базу данных. Помните, что это – "дорога в одну сторону"; удалив базу данных, вы сможете восстановить ее только из резервной копии. Поэтому безопаснее всего будет перед удалением базы данных выполнить ее резервное копирование, на случай, если эта база данных снова понадобится в будущем. Базы данных можно удалять как при помощи Enterprise Manager, так и командами T-SQL.

Применение Enterprise Manager

Как уже говорилось в лекции 8, при помощи Enterprise Manager можно не только просматривать информацию, но и администрировать базы данных. Чтобы полностью удалить базу данных и все ее файлы, выполните следующие действия.

  1. Находясь в Enterprise Manager, раскройте группу SQL Server, а затем раскройте имя сервера, на котором установлена база данных.
  2. Раскройте папку Databases, чтобы стали видны имеющиеся базы данных.
  3. Нажмите правой кнопкой мыши на имя удаляемой базы данных, а затем выберите Delete в контекстном меню. Появится сообщение Delete Database об удалении базы данных (рис. 9.14). В нем спрашивается также, желаете ли вы вместе с базой данных удалить и историю ее резервных копирований и восстановлений. Если флажок Delete backup and restore history for the database будет установлен, то вся информация о резервных копированиях и восстановлениях, хранящаяся в базе данных msdb, будет удалена. Если вы желаете сохранить эту информацию, то снимите флажок Delete backup and restore history for the database. Для подтверждения своего решения удалить базу данных, нажмите на Yes.

     Окно сообщения Delete Database


    Рис. 9.14.  Окно сообщения Delete Database

Примечание. Вы не сможете удалить базу данных master (главную системную базу данных).
Применение команд SQL

Администрировать базы данных можно и при помощи команд T-SQL. Как мы уже говорили ранее, команды T-SQL можно запускать из Query Analyzer или из окна с приглашением командной строки. Чтобы удалить базу данных при помощи команды T-SQL, откройте или Query Analyzer (мы уже объясняли, как это сделать), или окно с приглашением командной строки, и осуществите соединение с SQL Server через OSQL, при помощи такой команды:

OSQL   -U<имя_пользователя>   -P<пароль>   -S<имя_сервера>

Помните, что удаление базы данных является неотменяемым действием. Для удаления баз данных применяется T-SQL-команда DROP DATABASE. Ниже показаны команды, которые удалят базу данных MyDB и все ее файлы:

USE master--Для запуска команды DROP DATABASE вы должны 
GO  --применять базу данных master 
DROP DATABASE MyDB --Единственным параметром этой команды является имя удаляемой базы данных. 
GO

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

Заключение

Прочитав эту лекцию, вы приобрели более широкие знания о файлах данных, файлах журналов и о группах файлов SQL Server 2000, а также об автоматическом росте файлов. Теперь вы знаете, как создать базу данных, применяя мастер Create Database Wizard, SQL Server Enterprise Manager и команды T-SQL. Вы также знаете два способа для просмотра информации о базах данных и о файлах и знаете, как удалять базы данных. Теперь вы можете начать создавать таблицы внутри своих баз данных – этой теме посвящена лекция 10.

Лекция 10. Создание таблиц баз данных

Создание таблиц – следующий наиболее важный этап при проектировании базы данных. От результата работы на данном этапе в большей степени зависит быстродействие будущей системы. Обзор системных типов данных позволяет определить область их применения. Обязательно следует прочесть справочное руководство по типам данных (Books Online), поставляемое вместе с SQL Server 2000. Неправильное использование параметров при создании таблиц приводит к различным ошибкам, отображенным в лекции. Примеры использования оператора CREATE TABLE, использование системных хранимых процедур sp_addtype и sp_droptype, применение NULL-значений, использование свойства IDENTITY. Уделяется немало внимания созданию таблиц с помощью Enterprise Manager, что, в свою очередь, позволяет выбрать наиболее приемлемый для вас путь создания и управления таблицами и ограничениями.

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

В данной лекции вы познакомитесь с системными и пользовательскими типами данных, узнаете, как помещать таблицы в группы файлов, узнаете, что такое null -значения и свойство IDENTITY. Вы также научитесь создавать таблицы при помощи Enterprise Manager и команд Transact SQL (T-SQL). Мы также вкратце затронем здесь другие важные вопросы, относящиеся к созданию таблиц, такие как ограничения, значения по умолчанию и индексы, о которых будет рассказано более подробно в последующих лекциях.

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

Создание основы структуры таблиц

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

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

Основные понятия, относящиеся к таблицам

В данном разделе вы познакомитесь с некоторыми простыми, но важными понятиями, относящимися к таблицам. Мы рассмотрим пример базы данных, в котором вы познакомитесь с основными элементами таблиц и узнаете о системных типах данных и о том, как создавать и удалять пользовательские типы данных.

Создание таблицы базы данных

Таблица – это объект базы данных, который хранит данные в виде совокупности строк и колонок. Таблица определяется содержащимися в ней колонками. Данные организованы в форме, похожей на электронные таблицы Excel (см. пример таблицы Product_Info, показанный в табл. 10.1). Таблица Product_Info, используемая в наших примерах, будет создана в базе данных MyDB.

Таблица Product_Info применяется для хранения информации обо всех продуктах, продаваемых в магазине. Когда продукт становится готов к продаже, данные о нем добавляются в новую строку таблицы Product_Info. Эта таблица состоит из пяти колонок: Product_ID (Идентификатор продукта), Product_Name (Название продукта), Description (Описание), Price (Цена) и Brand_ID (Название торговой марки). В табл. 10.1 показаны в качестве примера три строки данных из таблицы Product_Info. Оператор T-SQL, применявшийся для создания этой таблицы (пустой, без данных) показан в разделе "Создание таблицы Product_Info с использованием системных типов данных" далее в этой лекции. (Об использовании оператора INSERT, применяемого для вставки данных в таблицы см. лекцию 20.)

Таблица 10.1. Таблица Product_Info
Product_IDProduct_NameDescriptionPriceBrand_ID
1Пятифутовый тентДля одного-двух человек80.0012
2Мини-печьРаботает на керосине20.0033
3РюкзакСо стальным каркасом60.0015

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

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

Применение системных типов данных

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

Типы данных могут также применяться к колонкам для представлений, параметров в хранимых процедурах и в функциях T-SQL, возвращающих одно или несколько значений данных. Встроенные типы данных, имеющиеся в SQL Server, перечислены в табл. 10.2. В SQL Server 2000 появились три новых типа данных: bigint, sql_variant и table. (Кроме нескольких исключений, явно указанных в табл. 10.2, для всех указанных объектов применяются те же самые типы данных.)

Таблица 10.2. Системные типы данных SQL Server 2000
Тип данныхОписаниеСколько места занимает
tinyintЦелочисленные данные в диапазоне от 0 до 255.1 байт
unique-identifierХранит 16-байтное двоичное значение, являющееся глобальным уникальным идентификатором (GUID)16 байт
varbinaryДвоичные данные переменной длины, состоящие из n байтов, где n может принимать значение от 1 до 8000. Применяйте тип varbinary, если предполагаете, что элементы данных, хранимые в колонке, будут сильно отличаться по своим размерамФактическая длина введенных данных плюс 4 байта
varchar[(n)]Данные переменной длины не в кодировке Unicode, длиной в n символов, где n может принимать значение от 1 до 8000Фактическая длина введенных данных
Как правильно выбрать тип данных

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

Выбор подходящего типа данных является довольно понятным процессом. Данные, которые будут вводиться в колонку, должны соответствовать типу данных, заданному для этой колонки. Поэтому вам следует выбрать такой тип данных, который лучше всего охватит диапазон значений, которые могли бы храниться в колонке для всего срока эксплуатации вашего приложения, и в то же время стремясь ограничить ненужный расход места на диске. Ненужный расход места на диске – это место на диске, выделенное для элементов данных, хранящихся в колонке, но не используемое. Например, предположим, у вас есть колонка, в которой нужно хранить одно целое число в диапазоне от 1 до 100. Очевидно, что эти значения могут храниться в типе integer, но каждое целое число типа integer занимает 4 байта. Данные с типом tinyint могут хранить значения от 0 до 255 и для них нужен только 1 байт места. В данном случае tinyint будет наилучшим выбором, потому что это экономит место на диске, необходимое для хранения данных из таблиц.

Затем вы должны определить, какой тип данных следует использовать – с фиксированной либо с переменной длиной. Если все значения данных из колонки будут иметь приблизительно одинаковые размеры, то более эффективным станет применение типа данных с фиксированной длиной, так как обработка данных, имеющих типы переменной длины, вызывает повышенную нагрузку. Вообще говоря, типы данных с переменной длиной следует применять, только если вы предполагаете значительные различия в длине данных, хранимых в данной колонке, и когда данные из колонки обновляются редко. К данным с переменной длиной относятся varchar, nvarchar, varbinary, text, ntext и image.Применение типов данных с переменной длиной может привести к значительной экономии места для хранения данных. Например, если вы зададите тип данных с фиксированной длиной, достаточной для хранения значений в колонке с наибольшей возможной длиной, то для всех значений, занимающих меньше места, истратиться столько же места, как и для этого самого объемного значения. Результатом этого станут огромный ненужный расход места на диске, потому что лишь немногие строки будут расходовать все максимально допустимое место для данных. В большинстве строк будет использовано меньше места, а все неиспользуемое место станет потерянным. А если вы зададите, что будет применяться тип данных с переменной длиной, то короткие значения будут расходовать лишь то место, которое им действительно нужно. Но опять-таки, применение типов данных с переменной длиной повышает нагрузку на процессор. Поэтому, если вам не требуется тип данных с переменной длиной, то применяйте тип данных с фиксированной длиной. Если из соображений расходования места для хранения данных нужно применять тип данных с переменной длиной, то, конечно, применяйте его.

Итак, как же выбрать нужные для ваших таблиц типы данных и их длины? Следуйте уже принятым ранее основным решениям и делайте выбор, который наилучшим образом будет соответствовать потребностям вашего приложения. Вообще говоря, определяясь с размерами колонок таблиц, старайтесь не тратить зря место на диске и не забывайте о потребностях в будущем.

Создание таблицы Product_Info с использованием системных типов данных

Прежде чем продолжить наше изложение, давайте рассмотрим T-SQL-оператор CREATE TABLE, которую можно применить для создания таблицы Product_Info, показанной в этой лекции ранее в табл. 10.1. В этом примере мы применим только системные типы данных и колонки с фиксированной длиной. Когда вы создаете таблицу при помощи оператора T-SQL, она создается в базе данных, которой вы пользуетесь в текущий момент. Если вы хотите создать таблицу в какой-либо конкретной базе данных, то надо применить оператор USE имя_базы_данных, как показано в примере кода (в нашем примере база данных имеет имя MyDB). Ключевое слово GO означает, что все предыдущие операторы должны быть теперь выполнены. (Об использовании T-SQL см. лекцию 13.)

USE MyDB 
GO 
CREATE TABLE Product_Info 
( 
Product_ID    smallint,
Product_Name    char(20), 
Description  char(30), 
Price   smallmoney, 
Brand_ID	smallint 
) 
GO

Давайте посмотрим, что произойдет при исполнении этого кода. После оператора CREATE TABLE следует спецификация таблицы с именем Product_Info. Между открывающей и закрывающей скобками заданы имена колонок и их типы данных. Длины для двух типов данных заданы равными 20 и 30, потому что большинство названий продуктов уместятся в 20 символов, а большинство описаний продуктов уместятся в 30 символов. Для Product_ID и Brand_ID применяется тип данных smallint, а не tinyint, потому что мы предполагаем, что количество разновидностей как продуктов, так и торговых марок, превысит 255 (максимальное значение для типа tinyint ), хотя и будет меньше, чем 32767 (максимальное значение для типа smallint ). Так как значения больше, чем 32767, нам не понадобятся, то при использовании типа int мы напрасно тратили бы место на диске.

Работа с пользовательскими типами данных

Пользовательские типы данных (типы данных, задаваемые пользователями, user-defined data types) или, как их еще называют, "псевдонимные", "алиасные" типы данных (alias data types)являются индивидуально настроенными системными типами данных. Индивидуальная настройка типов данных (задание типов данных) полезна, когда вы имеете несколько таблиц, в колонках которых должны храниться данные одинаковых типов, а вы хотите гарантировать точное соответствие колонок каждой из таблиц по типу, длине и возможности применения null-значений. Вы можете создать тип данных с осмысленным именем, что упростит программирование и улучшит согласованность таблиц. Затем вы сможете применять этот тип данных при создании многих других таблиц.

Например, предположим, что у нас имеется еще одна таблица, с именем Brands (торговые марки) в той же базе данных, в которой находится таблица Product_Info. Пусть в таблице Brands имеется колонка Brand_ID, соответствующая колонке Brand_ID таблицы Product_Info. Пусть в таблице Brands хранятся названия торговых марок и другая информация, относящаяся к торговым маркам. Чтобы гарантировать, что колонки Brand_ID в обеих таблицах имеют одинаковый тип данных и не допускают null -значений, вы можете создать пользовательский тип данных и присвоить его обеим колонкам. А теперь представьте, что у вас имеется несколько таблиц с колонками, которые должны иметь одинаковые атрибуты. Вы можете не помнить, применяли ли вы в одной таблице тип smallint, или же tinyint, или было ли позволено применять null -значения. Если создать тип данных с понятными именем, то вам не придется беспокоиться о правильности применяемых атрибутов, и вы получите гарантию согласованности данных для всех таблиц.

Примечание. Когда вы задаете тип данных для некоторой базы данных, он может применяться только для этой базы данных. Однако если вы создадите его для базы данных model, являющейся шаблоном для создания всех остальных баз данных, то этот тип данных будет иметься во всех новых базах данных.
Создание пользовательских типов данных при помощи Enterprise Manager

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

Как только вы определитесь с этим, можно будет создать тип данных. Для создания пользовательского типа данных с помощью Enterprise Manager выполните следующие действия.

  1. Находясь в Enterprise Manager, нажимая на значок-плюс рядом с папкой, раскройте группу SQL Server, а затем раскройте сервер.
  2. Раскройте папку Databases, а затем раскройте базу данных. Ваше окно Enterprise Manager будет выглядеть примерно как на рис. 10.1.

    Определение типа данных при помощи Enterprise Manager


    увеличить изображение

    Рис. 10.1.  Определение типа данных при помощи Enterprise Manager

  3. Нажмите правой кнопкой мыши на User Defined Data Types (Пользовательские типы данных) и выберите New User Defined Data Type (Новый пользовательский тип данных) в контекстном меню. Появится окно свойств пользовательского типа данных.
  4. В поле Name введите имя нового типа данных. Для нашего примера мы задали имя brand_type (рис. 10.2).
  5. Затем вы должны задать системный тип данных SQL Server и длину поля вашего пользовательского типа данных. В нашем примере мы задали тип данных для колонки Brand_ID, поэтому мы выбрали тип данных smallint, имеющий стандартную длину, равную 5. (Если бы мы создали символьный тип данных, то тогда можно было бы задать его длину.)

     Окно свойств пользовательского типа данных


    Рис. 10.2.  Окно свойств пользовательского типа данных

  6. Если ваш тип данных позволяет использовать null -значения, то установите флажок Allow NULLs. (См. раздел "Применение null-значений" далее в этой лекции.)
  7. Если ваш тип данных должен использовать какие-либо предопределенные правила или значения по умолчанию, то выберите их в соответствующих полях со списками. (О правилах и значениях по умолчанию см. лекцию 16.)
  8. Чтобы сохранить ваш новый тип данных, нажмите на OK.
Удаление пользовательских типов данных при помощи Enterprise Manager

Если вы создали когда-то пользовательский тип данных, а он больше не будет применяться (или вы ошиблись при его создании и хотите создать его снова), то можно удалить этот тип данных. Для удаления пользовательского типа данных выполните следующие действия:

  1. Находясь в Enterprise Manager, выберите пользовательский тип данных, который нужно удалить (раскройте группу SQL Server, раскройте сервер, раскройте папку Databases, а затем раскройте базу данных, в которой содержится удаляемый тип данных).
  2. Нажмите на папку User Defined Data Types. В правой панели станут видны пользовательские типы данных, имеющиеся в базе данных (рис. 10.3).
  3. Нажмите правой кнопкой мыши на пользовательский тип данных, который вы хотите удалить, и выберите Delete (Удалить) в появившемся контекстном меню. Появится диалоговое окно Drop Objects (Удалить объекты) (рис. 10.4).
  4. Прежде чем удалить тип данных, нажмите на Show Dependencies (Показать зависимости), в результате чего появится диалоговое окно Dependencies (Зависимости) (рис. 10.5).

    В поле-списке в левой части диалогового окна Dependencies показаны объекты базы данных, которые зависят от вашего пользовательского типа данных, а в поле-списке в правой части диалогового окна показаны объекты, от которых зависит ваш пользовательский тип данных. Если этот тип данных используется в каких-либо таблицах или объектах (как тип данных в нашем примере), то вам не будет позволено удалить его – при попытке удаления (если вы перейдете к шагу 5) появится сообщение об ошибке (рис. 10.6).

     Папка User Defined Data Types (Пользовательские типы данных)


    увеличить изображение

    Рис. 10.3.  Папка User Defined Data Types (Пользовательские типы данных)

     Диалоговое окно Drop Objects (Удалить объекты)


    Рис. 10.4.  Диалоговое окно Drop Objects (Удалить объекты)

  5. Если у вашего типа данных не возникает проблем с тем, что он где-то используется, то закройте диалоговое окно Dependencies, а затем нажмите на экранную кнопку Drop All (Удалить все) в диалоговом окне Drop Objects, чтобы удалить этот тип данных. Не волнуйтесь, удалены будут только типы данных, показанные в диалоговом окне Drop Objects, а не все ваши пользовательские типы данных.

     Диалоговое окно Dependencies (Зависимости)


    Рис. 10.5.  Диалоговое окно Dependencies (Зависимости)

     Сообщение об ошибке, появляющееся при попытке удалить тип данных, находящийся в использовании


    Рис. 10.6.  Сообщение об ошибке, появляющееся при попытке удалить тип данных, находящийся в использовании

Создание и удаление пользовательских типов данных при помощи T-SQL

Системная хранимая процедура sp_addtype является командой T-SQL, применяемой для создания пользовательских типов данных. При помощи запуска этой команды в то время, когда вы работаете с модельной базой данных (базой данных model), можно организовать применение нового типа данных во всех вновь создаваемых пользовательских базах данных, потому что эти базы данных создаются с такими же атрибутами, как и у базы данных model. Запуск этой команды при работе с пользовательской базой данных позволит применять новый тип данных только в этой базе данных. (Помните, что для работы с конкретной базой данных вы должны запускать команду USE имя_базы_данных.) Ниже дан пример команд T-SQL, создающих пользовательский тип данных brand_type в базе данных model:

USE model 
GO 
sp_addtype brand_type, 'smallint', 'NOT NULL' 
GO

Три параметра у sp_addtype – это имя пользовательского типа данных, системный тип данных, на котором основывается новый тип данных и возможность использования null -значений в новом типе данных. Новый тип данных, brand_type, появится во всех вновь создаваемых пользовательских базах данных. Если вы создадите пользовательский тип данных в пользовательской базе данных и захотите посмотреть новый тип данных через Enterprise Manager, то выберите команду Refresh в меню Action Enterprise Manager’а.

Чтобы удалить ненужный пользовательский тип данных, запустите команду sp_droptype в базе данных, в которой этот тип данных был определен. Ниже дан пример команд T-SQL, удаляющих пользовательский тип данных brand_type из базы данных model. (Напомним, что если вы создали этот тип данных в пользовательской базе данных и хотите, чтобы в Enterprise Manager было видно, что этот тип данных был удален, то выберите в Enterprise Manager команду Refresh в меню Action.)

USE model 
GO 
sp_droptype brand_type 
GO
Создание таблиц Product_Info и Brands с применением пользовательских типов данных

Давайте вернемся к нашему примеру базы данных. Мы создадим заново таблицу Product_Info, пользуясь новым пользовательским типом brand_type, а затем создадим таблицу Brands. Эта таблица, как и таблица Product_Info, будет иметь колонку Brand_ID и мы применим для этих колонок одинаковый пользовательский тип данных brand_type. Сначала нам надо будет удалить старую таблицу Product_Info, чтобы мы смогли бы создать ее снова. Ниже показан код, который выполнит все необходимые действия:

USE MyDB 
GO
DROP TABLE Product_Info
GO 
CREATE TABLE Product_Info 
( 
Product_ID     		smallint,
Product_Name   	char(20), 
Description    		char(30), 
Price          			smallmoney, 
Brand_ID       		brand_type 
) 
GO
CREATE TABLE Brands
(
Brand_ID       		brand_type,
Brand_Name     		char(30),
Supplier_ID    		smallint
)
GO

Задав одинаковый тип данных brand_type для колонок Brand_ID в обеих таблицах, мы гарантируем одинаковость атрибутов обеих колонок. Нам не надо помнить об особенностях типа данных, на котором основывается тип данных brand_type, мы можем просто применять новый тип данных для всех колонок Brand_ID.

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

Создание таблиц в заданной группе файлов

При помощи SQL Server вы можете задать, в какой именно группе файлов будут размещаться те или иные таблицы и данные из этих таблиц (если вы создали одну или несколько пользовательских групп файлов). Если при создании таблицы группа файлов не была задана, то таблицы будут размещаться в первичной группе файлов, если только другая группа файлов не будет задана в качестве применяемой по умолчанию. (Группы файлов применяются для размещения файлов и индексов на заданных дисках или массивах дисков. Более подробно о них и о том, как и зачем таблицы данных размещаются в файлах и в группах файлов, было рассказано в лекции 9.)

Создание таблицы Product_Info в заданной группе файлов

Предположим, что в созданной нами базе данных MyDB имеется группа файлов с именем product_group, содержащая один вторичный файл данных, который размещен на другом диске (E), чем диск, на котором размещена первичная группа файлов (С). Применяя эту методику, вы можете физически отделить свои таблицы данных от системных таблиц SQL Server. Еще мы создадим на отдельном диске (F) файл журнала, чтобы отделить ввод-вывод журнала. (Про создание баз данных и применение групп файлов см.лекцию 9.) Необходимые команды могут выглядеть так:

USE master 
GO 
CREATE DATABASE MyDB 
ON PRIMARY                         		-- Явное задание первичной 
                                   		-- группы файлов (не обязательно) 
(NAME = MyDBroot,               			-- Первичный файл данных
FILENAME = 'c:\mssql2k\MSSQL\data\mydbroot.mdf', 
SIZE = 8MB, 
MAXSIZE = 10MB, 
FILEGROWTH = 1MB),
FILEGROUP product_group        		-- Группа файлов для следующего файла
(NAME = MyDBdata1,                 		-- Вторичный файл данных
FILENAME = 'e:\mssql2k\MSSQL\data\mydbdata1.ndf', 
SIZE = 1000MB, 
MAXSIZE = 1500MB, 
FILEGROWTH = 100MB) 
LOG ON 
(NAME = Logdata1,                     			-- Файл журнала
FILENAME = 'f:\log_files\logdata1.ldf', 
SIZE = 1000MB, 
MAXSIZE = 1500MB,
FILEGROWTH = 100MB)
GO

А теперь мы можем создать таблицу Product_Info в группе файлов product_group, пользуясь командой CREATE TABLE, как показано ниже.

USE MyDB 
GO 
CREATE TABLE Product_Info 
( 
Product_ID     		smallint,
Product_Name   	char(20), 
Description    		char(30), 
Price          			smallmoney, 
Brand_ID       		brand_type 
) 
on product_group 
GO

Таблица и все данные, которые будут вставлены в таблицу, разместятся на диске E, диске, на котором была задана группа файлов product_group. Поэтому данные из таблицы Product_Info будут иметь свой дисковый накопитель, предназначенный для их ввода-вывода до тех пор, пока в этой же группе файлов не будут созданы другие таблицы.

Применение null-значений

Null-значение (null value) – это неизвестное значение, для которого применяется обозначение NULL. Способность хранить null-значения (nullability) – это свойство, благодаря которому колонка способна либо хранить null -значения, либо отвергать их. Null -значение в колонке обычно означает, что для данной строки этой колонки нет данных, потому что значение неизвестно, либо не имеет смысла, либо не задано или будет задано в будущем. Null -значения – это не пустые значения и не значения числа 0, их настоящие значения неизвестны (unknown), поэтому никакие два null -значения не являются равными.

Колонки, способные хранить null -значения, могут оказаться полезными в случаях, когда необходимая информация пока что недоступна для вас (это может быть, например, инициал для среднего имени покупателей). Что должно храниться в этой колонке для записи о некотором покупателе, который не имеет среднего имени, и поэтому не имеет среднего инициала? Если в этой колонке разрешено применять значения NULL, то null -значение будет правильным выбором и будет иметь смысл – благодаря этому вы поймете, что информация из данной колонки не имеет смысла.

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

Дополнительная информация. Более подробную информацию вы можете получить, открыв заголовок Null Values индекса Books Online, а затем выбрав тему "Comparison Search Conditions" (Условия для поиска по сравнению). Также прочитайте раздел "Добавление свойства IDENTITY" далее в данной лекции.

Прекрасной альтернативой применению null -значений в колонке является задание значения по умолчанию (default value) для этой колонки. Если значение не было задано при вводе строки, то в колонку записывается значение по умолчанию. (Более подробно о применении значений по умолчанию написано в лекции 16.) Если вы определите эту колонку, как способную хранить null -значения, т.е. два случая, когда колонка получит значение NULL:

Создание таблицы Product_Info с применением null-значений

Давайте вернемся к нашему примеру с таблицей Product_Info и зададим для каждой колонки возможность хранить null -значения. Если вы хотите, чтобы в колонке разрешалось хранить null -значения, то после типа данных надо добавить слово NULL. Если вы не хотите, чтобы разрешалось хранить null -значения, то после типа данных надо добавить слово NOT NULL. Мы рекомендуем всегда указывать, разрешается ли хранить в колонке null -значения, за исключением лишь случаев, когда применяются пользовательские типы данных (они уже заданы NULL или с NOT NULL ). Это поможет вам выработать привычку обращать внимание на необходимость способности к хранению null -значений в тех или иных колонках.

Дополнительная информация. Чтобы узнать, какова будет применяемая по умолчанию способность хранить null -значения, когда NULL или NOT NULL не заданы, обратитесь к теме "CREATE TABLE" в Books Online и, пользуясь "прокруткой", перейдите к разделу "Nullability Rules Within a Table Definition" (Задание таблиц: правила, определяющие способность к хранению null -значений). Явное задание NULL или NOT NULL будет иметь преимущество по отношению к этим правилам.

Пускай в нашем примере с таблицей Product_Info null -значения будет разрешено применять только в колонке для описаний продуктов. Мы не указали способность к хранению null-значений для типа данных brand_type, так как его способность к хранению null -значений уже была задана (как NOT NULL ) при создании этого пользовательского типа данных. Новый оператор CREATE TABLE будет выглядеть так:

USE MyDB 
GO
DROP TABLE Product_Info
GO 
CREATE TABLE Product_Info 
( 
Product_ID         		smallint NOT NULL,
Product_Name   	char(20) NOT NULL, 
Description         		char(30) NULL, 
Price                   smallmoney NOT NULL, 
Brand_ID            		brand_type 

) 
GO

Теперь, если описание продукта (Description) не будет задано, а значения остальных четырех полей – заданы, то в таблицу будет введена новая строка со значением NULL для элемента данных, находящегося в колонке Description. Вы должны будете ввести значения для четырех остальных колонок, не допускающих ввода значений NULL (колонок Product_ID, Product_Name, Price и Brand_ID ). Если данные для какой-либо из этих колонок не ввести, то попытка ввести новую строку будет неуспешной.

Добавление свойства IDENTITY

Когда вы создаете таблицу, вы можете задать одну из колонок как идентифицирующую колонку (identity column), добавив к определению колонки свойство IDENTITY. Если колонка создается со свойством IDENTITY, то SQL Server автоматически генерирует для этой колонки значение строки, рассчитываемое по начальному значению (seed value) и значению приращения (increment value). Начальное значение (seed) является значением идентификации для первой строки, вставленной в таблицу. Приращение (increment) – это величина, на которую SQL Server увеличивает значение идентификации для последовательно вводимых строк. Каждый раз при вводе строки SQL Server присваивает текущее значение идентификации элементу данных в колонке идентификации, вводимому в новую строку. Следующая введенная строка получит значение идентификации, большее, чем текущее максимальное значение идентификации на величину приращения. Таким образом, каждая вводимая строка получит уникальное значение идентификации. Свойство идентификации полезно для создания колонок, в которых каждая строка должна иметь уникальный идентификатор, например, для колонки Product_ID. Если вы разрешите SQL Server генерировать идентифицирующие значения для вводимых строк, то это окажется проще, чем следить за правильностью ввода последовательных значений. Идентифицирующие колонки обычно применяются в ограничениях первичного ключа в таблицах, благодаря которым возможна уникальная идентификация строк. (Про ограничения первичного ключа см. лекции 16.)

Например, если вы зададите IDENTITY(0, 10), то значение идентифицирующей колонки для первой введенной строки будет равно 0, для второй строки будет равно 10, для третьей строки – 20, и т.д. Если начальное значение или приращение не задать, то для них будут применяться значения по умолчанию, равные 1 и 1. Вы можете задать как оба этих параметра, так и один из них. Идентифицирующие колонки не могут содержать значения по умолчанию и для них не разрешено применение null -значений. В каждой из таблиц может иметься только одна идентифицирующая колонка.

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

SET IDENTITY_INSERT имя_таблицы ON

При помощи этого оператора можно вставить строку и назначить нужное вам значение идентифицирующей колонки. Закончив ввод строки, нужно отменить возможность вставки в идентифицирующую колонку при помощи такого оператора:

SET IDENTITY_INSERT имя_таблицы OFF

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

Добавление свойства IDENTITY для таблицы Product_Info

Давайте добавим свойство IDENTITY в таблицу Product_Info. Вместо того, чтобы вводить данные в колонку Product_ID , мы сделаем ее идентифицирующей колонкой, и пусть SQL Server автоматически генерирует ее значения, обеспечивая их уникальность. Ниже показан код T-SQL, который создаст такую таблицу:

USE MyDB 
GO 
DROP TABLE Product_Info
GO 
CREATE TABLE Product_Info 
( 
Product_ID         		smallint IDENTITY(1, 1) NOT NULL,
Product_Name   	char(20) NOT NULL, 
Description         		char(30) NULL, 
Price                   	smallmoney NOT NULL, 
Brand_ID            		brand_type 
 
) 
GO

Колонка Product_ID теперь будет получать значения, начинающиеся с 1 и имеющие приращение 1 для каждой последующей строки, вставляемой в таблицу. Благодаря свойству IDENTITY, гарантируется, что каждому продукту будет назначено уникальное число-идентификатор, без необходимости какого-либо ввода со стороны пользователя. Выбор числа 1 в качестве приращения является произвольным. Какое бы приращение вы не применили, идентифицирующее значение будет уникальным.

Создание таблиц с помощью Enterprise Manager

Теперь, когда вы понимаете основные элементы, относящиеся к созданию таблиц при помощи SQL Server, давайте разберем пример создания таблицы при помощи Enterprise Manager. Однако прежде чем начать этот процесс, вы обязательно должны помнить, что проектирование всех ваших таблиц баз данных и их взаимоотношений должно производиться до того, как вы приступите к их фактическому созданию. Для создания таблицы базы данных с помощью SQL Server Enterprise Manager выполните следующие действия.

  1. Находясь в Enterprise Manager, раскройте группу SQL Server, а затем раскройте сервер.
  2. Раскройте папку Databases, чтобы стали видны имеющиеся базы данных.
  3. Раскройте базу данных, в которой вы хотите работать (в нашем примере – MyDB).
  4. Нажмите правой кнопкой мыши на папку Tables (Таблицы) и в появившемся контекстном меню выберите New Table (Новая таблица). Появится окно New Table (рис. 10.7).

     Окно New Table (Новая таблица)


    увеличить изображение

    Рис. 10.7.  Окно New Table (Новая таблица)

    Окно New Table содержит таблицу, похожую на электронную таблицу Excel. Каждая строка таблицы в окне New Table обозначает одну колонку таблицы базы данных. Каждая колонка таблицы в окне New Table обозначает какой-либо атрибут колонки таблицы – тип данных, длину или способность хранить null -значения.
    Примечание. При именовании колонок таблиц базы данных следует придерживаться некоторых стандартов. На самом деле, не важно, какую именно систему для наименований вы выберите, но вы должны придерживаться принятых правил. Всякий раз, когда вы используете такую же колонку в другой таблице, применяйте точно совершенно одинаковые имена. Такое единообразное использование имен поможет вам не запутаться, когда вы будете выполнять запросы.
  5. Задайте каждую из колонок вашей таблицы базы данных, заполняя поочередно строки таблицы окна: введите имена таблиц в колонке Column Name, выберите тип данных в выпадающих меню в колонке Data Type и выберите длину типа данных (если это допустимо, например, можно выбрать длину для символьных типов данных). Для переключения флажков в колонке Allow Nulls (Разрешаются null -значения) пользуйтесь клавишей Shift или нажимайте там мышью. В результате будет разрешаться или запрещаться применение null -значений. Заполнение для таблицы Product_Info показано на рис. 10.8. Обратите внимание, что для колонки Brand_ID мы выбрали пользовательский тип данных brand_type. Также обратите внимание, что по умолчанию флажок Allow Nulls (Разрешаются null -значения) в этой колонке установлен, даже для нашего типа данных brand_type, который был создан без разрешения применять null -значения. Вам следует снять этот флажок, чтобы обеспечить согласованность со способностью этого типа к хранению null -значений.

      Задание колонок при помощи окна New Table (Новая таблица)


    увеличить изображение

    Рис. 10.8.  Задание колонок при помощи окна New Table (Новая таблица)

    Данные в строках таблицы базы данных будут физически храниться в порядке, в котором вы задали колонки. Если вы пожелаете вставить в окно New Table строчку с определением колонки между двух уже имеющихся определений, то нажмите правой кнопкой мыши на строчку окна, под которой вы хотите вставить новую строчку, и в появившемся контекстном меню выберите команду Insert Column (Вставить колонку). Чтобы удалить строчку, нажмите правой кнопкой мыши на эту строчку и выберите Delete Column (Удалить колонку) в контекстном меню. В нашем примере с таблицей Product_Info мы зададим колонку Product_ID как колонку первичного ключа, нажав на ее имя правой кнопкой мыши и выбрав Set Primary Key (Задать первичный ключ) в контекстном меню. Рядом с именем колонки появится изображение ключа (рис. 10.9). (Про первичные ключи и другие ограничения см. лекцию 16.)

    Обозначение для первичного ключа


    увеличить изображение

    Рис. 10.9.  Обозначение для первичного ключа

  6. В нижней части окна New Table имеется вкладка с названием Columns, при помощи которой можно менять некоторые атрибуты колонки, выбранной в верхней части окна. Например, мы выбрали колонку Brand_ID, а затем во вкладке Columns задали ее назначение и значение по умолчанию, равное 0 (рис. 10.10).

      Вкладка Columns


    увеличить изображение

    Рис. 10.10.  Вкладка Columns

  7. Вы можете создавать другие ограничения и индексы для таблицы, нажимая на имена колонок правой кнопкой мыши и выбирая в контекстном меню Indexes/Keys (Индексы/Ключи), Relationships (Взаимоотношения), Constraints (Ограничения) или Properties (Свойства), либо нажав на значок-иконку Table and Index Properties (Свойства таблиц и индексов) рядом со значком-иконкой Save (Сохранить) в панели инструментов. Независимо от выбранного способа, появится окно свойств таблиц и индексов (рис. 10.11). Имя вашей таблицы будет обозначаться как Table1 или Table2 и т.д. Наша таблица получила имя Table2. При сохранении таблицы это имя можно изменить, см. описание следующего шага. Окно Properties имеет четыре вкладки, их подробные описания будут даны далее в материале нашей книги.

     Окно свойств таблиц и индексов


    Рис. 10.11.  Окно свойств таблиц и индексов

  8. Чтобы дать имя этой новой таблице, нажмите на значок-иконку Save. Появится диалоговое окно, в котором вы можете задать имя таблицы. Введите с клавиатуры нужное имя и нажмите на OK, и тогда спроектированная вами таблица будет создана, а заданная информация сохранится. Теперь вы можете закрыть окно New Table, и имя вашей таблицы появится в правой панели Enterprise Manager.

Заключение

В этой лекции вы изучили основы создания таблиц, научились применять и задавать типы данных, размещать таблицы в группах файлов, применять null -значения и добавлять свойство IDENTITY. Желательно привести таблицы в их окончательную форму до того, как вы будете заполнять их данными. В лекции 15 показаны несколько способов для изменения таблиц при помощи T-SQL. В нескольких следующих лекциях вы узнаете об инсталляции и настройке сети и о Microsoft Cluster Server. Эти лекции помогут вам выполнить завершающие стадии настройки SQL Server.

Лекция 11. Конфигурирование Microsoft SQL Server в сети

Очень трудно представить базу данных вне работы в сети. Для обеспечения данной функциональности требуются некоторые теоретические знания о работе сетевых служб, сетевых библиотек, знания уровней коммуникации SQL Server. Разобраться в этом множестве новых технологий поможет данная лекция. Рассказывается обо всех положительных и отрицательных сторонах использования того или иного интерфейса (DB-LIB, ODBC, OLE DBI и др.) взаимодействия с SQL Server. Описываются принципы работы в SQL Server 2000 Server/Client Network Utility. Понимание концепции уровня программного обеспечения и уровня аппаратуры поможет грамотно сконфигурировать свою сеть.

После того как вы инсталлировали Microsoft SQL Server 2000, нужно сконфигурировать вашу систему для работы в сети. К этому моменту вы или администратор операционной системы Microsoft Windows NT или Microsoft Windows 2000, вероятно, уже сконфигурировали нужный сетевой протокол. Если сетевой протокол до сих пор еще не сконфигурирован, то вы можете без труда сконфигурировать его при помощи панели управления (Control Panel). Выбор протокола обычно определяется решениями на уровне всей вашей фирмы либо другими компьютерами, уже сконфигурированными в вашей сети. Хоть разные протоколы и имеют некоторые различия в производительности и функциональности, но большинство протоколов будут соответствовать вашим потребностям.

В данной лекции вы узнаете, как конфигурировать разнообразные сетевые компоненты для SQL Server, в том числе на уровне сетевого оборудования, на уровне сетевого протокола и на уровне сетевых библиотек SQL Server. В дополнение к этому материалу вы познакомитесь с компонентами для соединения с базами данных – DB-LIB и ODBC (Open Database Connectivity, открытый интерфейс доступа к базам данных), а также со средствами пулинга соединений ODBC. И в заключение вы изучите, как нужно наблюдать за сетью, чтобы выявлять в ней "узкие места", которые могут возникнуть при работе SQL Server (т.е. как осуществлять мониторинг сети).

Обзор сетевых служб

Для коммуникации между клиентами и серверами SQL Server применяются многие уровни работы программного обеспечения и оборудования. Каждый из этих уровней служит для выполнения присущих ему задач. Давайте вкратце рассмотрим все эти уровни; более подробное их описание будет дано далее в данной лекции. Высшим уровнем является интерфейс прикладного программирования для SQL Server (API, application programming interface). В качестве уровня API применяется что-либо из следующего списка:

API функционируют на вершине уровня сетевых библиотек, в котором содержатся одна или несколько сетевых библиотек (net-libraries, net libs). Сетевые библиотеки преобразуют команды и данные SQL Server в системные запросы, которые взаимодействуют с нижележащим уровнем сетевого протокола. Сетевые библиотеки являются компонентами SQL Server, а вот уровень сетевого протокола является компонентой операционной системы. Вы можете выбрать какую-либо из следующих сетевых библиотек:

Точно так же, как уровень сетевых библиотек может содержать более одной сетевой библиотеки, уровень сетевого протокола может содержать более одного протокола, причем каждая сетевая библиотека взаимодействует с одним или с несколькими протоколами. Уровень сетевого протокола является компонентой операционной системы, "разговаривающей" на языке сетевого протокола. Вызовы и данные SQL Server помещаются внутрь сетевых вызовов, которые могут быть переданы на этом уровне через сеть. За исключением "multiprotocol", каждый сетевой протокол поддерживает одну из сетевых библиотек (имеющую имя, такое же, как имя протокола). При выборе "multiprotocol" производится поддержка средства для дистанционного вызова процедур Windows 2000 и Windows NT (RPC, remote procedure call), при этом происходит поддержка сокетов TPC/IP, протокола NWLink IPX/SPX, и именованных каналов (named pipes) одновременно.

Довольно часто в Windows NT или Windows 2000 запускают сразу по несколько сетевых протоколов. Про эти протоколы мы расскажем более подробно в разделе "Сетевые библиотеки" далее в данной лекции.

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

Уровни коммуникации должны иметься как на стороне клиента, так и на стороне сервера (рис. 11.1). Как можно видеть, при переходе от вызовов ODBC к фактической передаче данных требуется некоторая обработка данных. В данной лекции мы изучим не только соответствие функций различным уровням, но также и вопросы диагностики.

Уровни коммуникации SQL Server


Рис. 11.1.  Уровни коммуникации SQL Server

API для SQL Server

Для коммуникации с SQL Server ваши приложения должны уметь "разговаривать" на его языке. Это значит, что при коммуникации должно применяться одно из инструментальных средств, поставляемых вместе с SQL Server, например, командная строка OSQL или ISQLW (анализатор запросов SQL Server). Эти инструментальные средства могут быть полезными для простых запросов, но они не подходят для обработок, ежедневно выполняемых приложениями. Например, люди, работающие с информацией о запасах товаров на складе, со счетами кредиторов и со счетами к получению, трудятся более эффективно, когда пользуются графическим интерфейсом, а не когда набирают с клавиатуры операторы SQL. На самом деле, большинство из пользователей таких приложений вообще не знают SQL. Как правило, для создания приложений, взаимодействующих с SQL Server, разработчики применяют API (Application Programming Interface), интерфейсы прикладного программирования. Благодаря API можно вызывать разнообразные функции для работы с базами данных.

Вместе с SQL Server поставляется множество разных API, в том числе DB-LIB, ODBC и OLE DB. DB-LIB – это первоначальный, "родной" интерфейс API для SQL Server, он доступен и для Microsoft SQL Server и для продуктов Sybase. ODBC – новее и гибче и может применяться для коммуникации с любым количеством реляционных СУБД. Для работы с SQL Server программистам доступны для применения также OLE DB и еще несколько других API. В данном разделе вы найдете описания различных API.

Соединения DB-LIB

Интерфейс DB-LIB был частью SQL Server начиная с первых версий SQL Server, еще с 1988 года. DB-LIB является первоначальным, исконным API для программирования SQL Server. Хотя DB-LIB всегда был составной частью SQL Server, происходит постепенный отказ от него в пользу ODBC, так что ODBC становится основным API. Языки C и C++, а также Microsoft Visual Basic поддерживают DB-LIB. Вызовы DB-LIB производятся из кода приложений, а затем отправляются через сетевую библиотеку, через уровень сетевого протокола и затем на уровень сетевого оборудования.

Соединения ODBC

ODBC – это стандартный API-интерфейс, разработанный фирмой Microsoft для упрощения соединения компьютеров под управлением Windows с различными реляционными СУБД. Благодаря программированию при помощи API-интерфейса ODBC, вы можете применять одно и то же приложение для коммуникации с любым количеством систем. ODBC обладает многофункциональностью, но может оказаться не самым эффективным API для некоторых реляционных СУБД. Как правило, "родные" API поддерживают большую функциональность и оптимизированы для работы со своими реляционными СУБД.

ODBC применяется для поддержки дополнительных возможностей соединения через Интернет с применением "активных серверных страниц" ASP (Active Server Pages). Также там имеется поддержка ActiveX, MFC (Microsoft Foundation Classes) и XML (Extensible Markup Language). За последние несколько лет поддержка ODBC выросла очень значительно, благодаря чему ODBC стал основным API для продуктов, поддерживающих много реляционных СУБД.

API ODBC имеет одинаковую форму независимо от того, с какой реляционной СУБД вы соединяетесь, но это не относится к драйверам ODBC. Вам придется приобретать по драйверу ODBC для каждой используемой реляционной СУБД. Эти драйверы преобразуют ODBC в "родной" сетевой протокол реляционной СУБД. Для оптимальной работы новых версий реляционных СУБД обычно требуются и новые драйверы ODBC, хотя обратная совместимость, как правило, поддерживается. В DB-LIB обычно применяется специфическая сетевая библиотека, а в ODBC – многопротокольная сетевая библиотека. Эта библиотека упрощает соединение приложений ODBC с сервером и избавляет от необходимости выбирать какой-либо определенный протокол.

Пулинг соединений ODBC

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

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

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

Когда поток завершает свою работу с соединением ODBC, приложение делает вызов для освобождения этого соединения. И снова ODBC Connection Manager берет на себя управление над соединением. А если какое-либо соединение простаивает в течение некоторого периода времени, то ODBC Connection Manager может закрыть его.

Дополнительная информация. Более подробную информацию о пулинге соединений ODBC вы найдете в Microsoft ODBC Software Development Kit (SDK).
Другие API

Имеется множество других API, при помощи которых ваши приложения могут соединяться с SQL Server. Это, например, OLE DB, ODS, SQL-DMF (SQL-Distributed Management Framework), SQL-DMO (SQL-Distributed Management Objects) и SQL-NS (SQL-Namespace). Как правило, каждый из этих протоколов поддерживает те или иные специфические функции или сегмент рынка, для которого требуется свой собственный интерфейс программирования.

Дополнительная информация. Для дополнительной информации о специализированных API обратитесь к SQL Server 2000 Books Online.

Сетевые библиотеки

Уровень сетевых библиотек SQL Server преобразует вызовы API в вызовы, специфичные для протоколов, а затем передает их ниже, на уровень сетевого протокола. На клиентских компьютерах администрирование уровня сетевого протокола производится при помощи утилиты Client Network Utility, а на сервере – при помощи утилиты Server Network Utility. Благодаря этим утилитам вы можете добавлять или удалять сетевые библиотеки как на сервере, так и на любом из компьютеров-клиентов. Чтобы взаимодействие с SQL Server было возможным, сетевые библиотеки, имеющиеся на компьютерах-клиентах, должны быть доступны и на сервере. В одной сети могут работать одновременно сразу несколько протоколов. Например, некоторые из компьютеров-клиентов могут взаимодействовать с SQL Server при помощи именованных каналов (named pipes), а другие клиенты в той же сети могут взаимодействовать с SQL Server при помощи TCP/IP.

Утилита SQL Server 2000 Server Network Utility

Как правило, на одном компьютере-сервере конфигурируют несколько протоколов. По умолчанию на сервере инсталлируются сетевые библиотеки для именованных каналов и TCP/IP. Чтобы сконфигурировать на сервере дополнительные сетевые библиотеки, выполните следующие действия:

  1. Запустите Server Network Utility, нажав на экранную кнопку Start, укажите курсором мыши на Programs, затем укажите на Microsoft SQL Server и, наконец, выберите Server Network Utility. Появится диалоговое окно SQL Server Network Utility (рис. 11.2).

     Вкладка General диалогового окна SQL Server Network Utility


    Рис. 11.2.  Вкладка General диалогового окна SQL Server Network Utility

  2. Диалоговое окно SQL Server Network Utility имеет две вкладки: General (Общие) и Network Libraries (Сетевые библиотеки). Вкладка General служит для включения и отключения сетевых протоколов. Включенные протоколы показаны в правом списке в порядке, в котором SQL Server будет пытаться применять их. При помощи вкладки General можно выполнять следующие операции:
    • включать новые протоколы, выбрав сначала один или несколько протоколов из списка отключенных протоколов, а затем нажав на кнопку Enable;
    • отключать протоколы, выбрав один или несколько протоколов из списка включенных протоколов, а затем нажав на кнопку Disable;
    • изменять свойства включенного протокола, выбрав имя протокола, а затем нажав на кнопку Properties;
    • включить шифрование протокола с помощью SSL (Secure Sockets Layer);
    • включить поддержку WinSock Proxy.
    Вкладка Network Libraries служит только для просмотра информации. Благодаря ей можно посмотреть номера версий и даты последних изменений сетевых библиотек (рис. 11.3).

    Вкладка Network Libraries диалогового окна SQL Server Network Utility


    Рис. 11.3.  Вкладка Network Libraries диалогового окна SQL Server Network Utility

Утилита SQL Server 2000 Client Network Utility

На другой стороне сетевого соединения находится компьютер-клиент, который конфигурируется довольно-таки похоже на компьютер-сервер. Чтобы сконфигурировать компьютер-клиент, выполните на нем следующие действия:

  1. Запустите Client Network Utility, нажав на экранную кнопку Start, указав на Programs, затем указав на Microsoft SQL Server, и, наконец, выбрав Client Network Utility. Появится диалоговое окно SQL Server Client Network Utility (рис. 11.4), которое выполняет некоторые функции, такие же, как у диалогового окна SQL Server Network Utility, а также еще и многие другие функции.

    В то время как диалоговое окно SQL Server Network Utility просто показывает список сетевых библиотек и параметров их соединений, при помощи окна SQL Server Client Network Utility можно указывать, какие протоколы на клиентах должны применяться по умолчанию, а также задать алиас сервера (псевдоним). Включенные протоколы показаны на вкладке General в том порядке, в котором они должны применяться. Например, на рис. 11.4 заданы следующие протоколы: сначала именованные каналы (named pipes), а затем TCP/IP. В нашем примере клиент сначала попытается соединиться с сервером через именованные каналы. Если это не получится, то клиент тогда попытается соединиться с сервером при помощи TCP/IP. Если и это не получится, то клиент выдаст сообщение об ошибке соединения.

    Вкладка General диалогового окна SQL Server Client Network Utility


    Рис. 11.4.  Вкладка General диалогового окна SQL Server Client Network Utility

    Алиас сервера (псевдоним) позволяет отказаться от списка включенных протоколов и дает возможность пользоваться только каким-либо определенным протоколом. Если соединение при помощи этого протокола не получится, то попыток применить другие протоколы не последует. Если у вас имеется несколько серверов, не применяющих общий протокол, то нужно поместить наиболее употребительный протокол на верхнюю строчку списка включенных протоколов. Это минимизирует длительность времени, которое потратилось бы на попытки повторных соединений. Включать и отключать протоколы несложно. Для включения протокола просто выберите нужный протокол в списке отключенных протоколов, а затем нажмите на кнопку Enable. Чтобы отключить протокол, выберите нужный протокол в списке включенных протоколов, а затем нажмите на кнопку Disable.

    Вы можете изменять свойства включенных протоколов, выбрав протокол в списке Enabled protocols by order, а затем нажмите на кнопку Properties. Но надо заметить, что значения, применяемые по умолчанию, оптимально подходят почти для всех сетей.

    Из вкладки General можно также включить шифрование протоколов, что защитит данные при передаче через сеть. Эта возможность доступна только для протокола multiprotocol.

  2. Чтобы задать алиас сервера, откройте вкладку Alias. В этой вкладке перечислены все существующие алиасы. Чтобы добавить новый алиас, нажмите на Add. Появится диалоговое окно Add Network Library Configuration (Добавить конфигурацию сетевой библиотеки) (рис. 11.5).
  3. В этом диалоговом окне вы можете добавить алиас, задающий нужный протокол. Этот сетевой протокол должен быть сконфигурирован на компьютере-клиенте и должен быть задан здесь, тогда клиент сможет осуществлять коммуникацию при помощи этого протокола. При попытках соединения с алиасом, клиент SQL Server будет применять сетевую библиотеку и параметры соединения, заданные вами здесь. Если приложение будет пытаться соединиться с сервером не через алиас, то будет применяться протокол, используемый по умолчанию.

     Диалоговое окно Add Network Library Configuration


    Рис. 11.5.  Диалоговое окно Add Network Library Configuration

  4. Во вкладке DB-Library Options диалогового окна SQL Server Client Network Utility (рис. 11.6) показана информация о DB-Lib и имеются флажки Automatic ANSI to OEM conversion и Use international settings. При помощи первого флажка можно включить автоматическое преобразование от кодировки символов ANSI к кодировке OEM при коммуникации с SQL Server. При помощи второго флажка можно задать, чтобы форматы дат, времени и денежных единиц применялись бы те, что заданы для текущего компьютера, а не пользоваться жестко заданными настройками этих форматов.

    Эти флажки, как правило, снимать не нужно. Установленные флажки вызывают некоторую дополнительную нагрузку на компьютер, но зато и повышают функциональность.

     Вкладка DB-Library Options диалогового окна SQL Server Client Network Utility


    Рис. 11.6.  Вкладка DB-Library Options диалогового окна SQL Server Client Network Utility

  5. В диалоговом окне SQL Server Client Network Utility имеется также вкладка Network Libraries (рис. 11.7). Как и одноименная вкладка из утилиты SQL Server Network Utility, эта вкладка просто показывает список доступных сетевых библиотек и информацию о номерах их версий.

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

      Вкладка Network Libraries диалогового окна SQL Server Client Network Utility


    Рис. 11.7.  Вкладка Network Libraries диалогового окна SQL Server Client Network Utility

Сетевые библиотеки и протоколы SQL Server

Как мы уже говорили, SQL Server поддерживает множество сетевых библиотек: именованные каналы (named pipes), TCP/IP, multiprotocol, NWLink IPX/SPX, AppleTalk, Banyan VINES, VIA (Giganet) и VIA (ServerNet II). Каждая сетевая библиотека соответствует своему сетевому протоколу или набору протоколов. В этом разделе мы дадим краткий обзор каждой из сетевых библиотек.

Сетевой протокол, с помощью которого вы запускаете SQL Server, будет определяться, скорее всего, исходя из стандартов, принятых в вашей фирме, или в зависимости от того, что применяется на остальных компьютерах. Все команды и функции SQL Server могут передаваться через все сетевые протоколы, однако некоторые протоколы работают быстрее других. Кроме того, некоторые протоколы поддерживают маршрутизацию и службы имен, а некоторые – не поддерживают.

Named Pipes – именованные каналы

Протокол named pipes (именованные каналы) был разработан фирмой Microsoft несколько лет тому назад. В named pipes поддерживаются два режима: локальный и удаленный (дистанционный). Протокол local named pipes применяется в случаях, когда и клиент, и сервер находятся на одном и том же компьютере, а remote named pipes применяется, когда клиент и сервер находятся на разных компьютерах. Если соединение установлено через named pipes, сетевые утилиты SQL Server распознают, как оно осуществлено – с помощью локальных именованных каналов (local named pipes) или же с помощью удаленных (дистанционных) именованных каналов (remote named pipes).

Именованные каналы – это клиентский протокол, применяемый по умолчанию, и он является протоколом, применяемым по умолчанию в операционных системах Windows NT 4 Server и Windows 2000. В операционных системах Microsoft Windows 95 и Microsoft Windows 98 именованные каналы применяться не могут. В этих системах на стороне сервера применяются протоколы TCP/IP, multiprotocol и shared memory. Хотя протокол "именованные каналы" работает эффективно, он обычно не используется в больших сетях, потому что он не поддерживает маршрутизацию и шлюзы. Также не рекомендуется его применение на медленных сетях, т.к. по сравнению с другими протоколами, например, TCP/IP, для него требуется передача значительно большего объема информации между сервером и клиентом.

TCP/IP

Протокол TCP/IP является одним из наиболее популярных сетевых протоколов, из-за очень большого количества компьютеров, на которых он работает, из-за того, что его применение принято в качестве стандарта, и из-за его высокой скорости. Он также является сетевым протоколом, применяемым в Интернете. Сетевая библиотека TCP/IP является одной из наиболее высокопроизводительных сетевых библиотек SQL Server. Благодаря высокой скорости и богатым возможностям TCP/IP станет хорошим выбором.

Multiprotocol

Сетевая библиотека multiprotocol – это новинка, появившаяся в SQL Server 7 и сохранившаяся в SQL Server 2000. Эта сетевая библиотека на самом деле является совокупностью нескольких сетевых библиотек. Поэтому она не так эффективна, как одиночные сетевые библиотеки, но зато обеспечивает большую гибкость. Сетевая библиотека multiprotocol поддерживает протоколы TCP/IP, NWLink IPX/SPX и именованные каналы (named pipes). При использовании сетевой библиотеки multiprotocol обычно используется первый из протоколов, имеющихся на клиенте и на сервере. Так как клиент может соединяться с разными серверами при помощи разных протоколов, то multiprotocol является идеальным выбором.

NWLink IPX/SPX

Протокол NWLink IPX/SPX идеально подходит для интеграции (встраивания) систем SQL Server 2000 в сети Novell NetWare, потому что интеграция в нем реализована гладко, "без швов". Протокол IPX/SPX известен уже долгое время и обладает высокой производительностью и надежностью.

AppleTalk

AppleTalk – это сетевой протокол, разработанный фирмой Apple Computer и применяемый в компьютерах Apple. Windows NT и Windows 2000 поддерживают AppleTalk, благодаря чему серверы и клиенты Windows NT и Windows 2000 могут гладко, "без швов", интегрироваться в окружение AppleTalk.

Banyan VINES

Сетевая библиотека Banyan VINES служит для поддержки компьютеров, работающих в сети VINES. С помощью этой сетевой библиотеки можно интегрировать клиенты и серверы Windows в окружение VINES.

VIA (Virtual Interface Architecture)

Этот протокол поставляется в двух вариантах – Giganet и ServerNet II. Он хорошо подходит для кластеризованных серверов.

Выбор сетевой библиотеки

Выбор сетевой библиотеки должен осуществляться исходя из того, какие протоколы применяются в вашей сети. Проблемы с соединениями обычно возникают, когда сетевые библиотеки на сервере не синхронизованы с сетевыми библиотекам на клиенте. Если при соединении с сервером возникают трудности, то проверьте, как заданы сетевые библиотеки на обеих сторонах соединения. Также попробуйте соединиться с сервером при помощи другой программы, например, при помощи PING или Проводника Windows (Microsoft Windows Explorer), чтобы понять, относится ли проблема к работе SQL Server или же не работает сама сеть.

Сетевые компоненты и производительность SQL Server

Сеть состоит из двух уровней: уровня программного обеспечения, реализованного сетевыми протоколами, и уровня оборудования (аппаратуры). В рамках нашей книги к уровню оборудования будут отнесены также драйверы сетевого оборудования, необходимые для работы этого оборудования. Данные уровни независимы друг от друга и каждый из них может содержать много компонент. Например, можно запускать одновременно TCP/IP и IPX/SPX "поверх" одной и той же сетевой платы, а можно и применять одновременно много сетевых плат, работающих с одним и тем же протоколом (рис. 11.8).

  Уровни сети


Рис. 11.8.  Уровни сети

Каждый сетевой уровень имеет свои собственные характеристики и показатели производительности. Как уже говорилось, имеются разные причины для выбора тех или иных протоколов и компонент сетевого оборудования. Обычно выбор диктуется правилами, принятыми в вашей фирме, и тем, с каким другим сетевым оборудованием ваши системы будут соединяться через сеть. В нашем курсе вы не найдете призывов применять тот или иной сетевой протокол или какое-либо определенное сетевое оборудование. В данном разделе мы оценим относящиеся к программному обеспечению и к оборудованию факторы, которые могут повлиять на функциональность и производительность SQL Server.

Уровень программного обеспечения (сетевые протоколы)

Как уже говорилось, к сетевым протоколам относятся именованные каналы (named pipes), TCP/IP, NWLink IPX/SPX, AppleTalk и Banyan VINES. Важно отметить, что все сетевые протоколы функционируют примерно одинаковым образом, по крайней мере, с точки зрения SQL Server. Если сеть не функционирует или работает не так, как вам надо, то эта проблема, скорее всего, связана с уровнем оборудования.

С другой стороны, проблемы с соединениями обычно возникают либо на уровне сетевых библиотек, либо на уровне сетевого протокола. Если у вас имеются проблемы с соединением клиента SQL Server с сервером SQL Server 2000, то попробуйте соединиться как-либо по-другому, например, через Проводник Windows. Если вы можете соединиться через Проводник Windows, но не можете через SQL Server, то ваша проблема, видимо, связана с SQL Server. Проверьте, что попытки соединения производятся через правильный сетевой протокол. Если сконфигурировано много протоколов, то будет сложнее определить, какой именно протокол используется. Если вы можете соединяться с сервером через PING, Internet Explorer или через какой-либо другой внешний источник, то проблема связана, скорее всего, с вашим выбором сетевых библиотек.

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

Уровень оборудования (аппаратный уровень)

Вы должны понимать работу уровня оборудования (аппаратного уровня), чтобы уметь найти причину возникновения проблем с производительностью. Уровень физического оборудования и уровень протоколов независимы друг от друга, это значит, что вы можете запускать разные сетевые протоколы на любом количестве устройств сетевого оборудования. Производительность сети можно оценить в зависимости от выбранного вами сетевого оборудования. Объем трафика, который может быть обработан сетью, зависит как от типа сети, так и от ее скорости.

Пропускная способность сети

Пропускная способность сети – это показатель объема данных, которые могут быть переданы через сеть за заданный промежуток времени. Иногда пропускная способность указывается в названии сетевого оборудования, например, 10BaseT или 100BaseT, что означает, соответственно, пропускную способность 10 и 100 Мбит/с.

Однако, измерение пропускной способности сети может привести к обманчивым результатам. Для большинства сетевых адаптеров скорость, с которой этот сетевой адаптер может передавать данные, уменьшается при уменьшении объема передаваемых данных, потому что каждая передача через сеть вызывает некоторую дополнительную нагрузку на компьютер. Например, нагрузка, вызываемая передачей 64 Kб данных приблизительно равна нагрузке, необходимой для передачи 2 Кб данных. Реляционные СУБД, в том числе и SQL Server, обычно передают небольшие объемы данных. Поэтому объем данных, который может быть обработан вашим сервером, может оказаться меньше, чем пропускная способность сетевого оборудования.

Ethernet

Хотя существует много разных стандартов сетевого оборудования, но, наверное, самым популярным из них является Ethernet. За последние несколько лет скорость Ethernet выросла и продолжает расти. Ethernet был разработан фирмами Xerox, DEC и Intel в 1976 году. В то далекое время применялся коаксиальный кабель (coaxial cable, сокращенно – "coax") и пропускная способность Ethernet составляла около 3 Mбит/с. После появления технологии 10BaseT пропускная способность выросла до 10 Mбит/с, а после появления технологии 100BaseT – до 100 Mбит/с. Вскоре ожидается появление Gigabit Ethernet, и тогда пропускная способность увеличится до 1 Гбит/с. Показатели пропускной способности Ethernet приведены ниже в таблице:

СетьПропускная способность
Coax Ethernet3 Mбит/с
10BaseT10 Mбит/с
100BaseT100 Mбит/с
Gigabit Ethernet1000 Mбит/с

Несмотря на стремительный рост производительности, Ethernet страдает от серьезной проблемы: иногда сетевые адаптеры Ethernet пытаются передавать данные одновременно. Если два или несколько сетевых адаптеров Ethernet осуществляют передачу данных полностью одновременно, то возникнет коллизия передачи данных. Каждый из адаптеров-участников коллизии должен подождать, а затем снова попытаться передать данные. Хотя вызванные этим потери времени и невелики, но эти задержки все же замедляют передачу данных. Чем больше коллизий будет происходить, тем дольше придется ждать повторных попыток передачи данных. При увеличении объема сетевого трафика вероятность коллизий возрастает. Если объем трафика приближается к пропускной способности сети, то вероятность коллизий становится довольно высокой (рис. 11.9). Коллизии снижают производительность. Поэтому важно следить за сетевым трафиком и наблюдать за коллизиями. Например, можно придерживаться практического правила, согласно которому пропускная способность сети не должна расходоваться более чем на 75%. Конечно, ваша сеть будет переживать кратковременные периоды интенсивного использования, когда трафик будет превышать это значение, но речь идет о том, что превышения 75% уровня не должны длиться долго.

 Взаимосвязь между вероятностью коллизий и загруженностью сети


Рис. 11.9.  Взаимосвязь между вероятностью коллизий и загруженностью сети

Token Ring

В сетях Token Ring (Маркерное кольцо) каждый член "кольца" (member of the ring) имеет возможность общаться с другими членами, передавая "маркер" (token). Этот маркер разрешает передавать данные только одному компьютеру в сети – тому, кто имеет его в данный момент. Применяя этот тип архитектуры, вы можете расходовать почти полностью всю пропускную способность сети, без возникновения чрезмерных задержек коммуникации.

Token Ring, как и Ethernet, содержит в себе множество технологий, каждая из которых имеет свою пропускную способность, как показано в таблице ниже. Но поскольку Token Ring является последовательностью соединений "от точки к точке", то коллизии здесь возникнуть не могут, даже при использовании полностью пропускной способности. Как и технология Ethernet, Token Ring тоже постоянно совершенствуется.

СетьПропускная способность
IEEE 802.3 Token Ring1, 4 или 16 Mбит/с
IEEE 802.5100 Mбит/с
Gigabit Token Ring1000 Mбит/с

Кроме Ethernet и Token Ring существуют и многие другие стандарты сетевого оборудования, в том числе ATM и "fiber optics".

Мониторинг сети

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

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

Мониторинг производительности

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

Во-первых, может быть так, что не все серверы и клиенты базы данных в вашей физической сети применяют одинаковые протоколы. Например, компьютер, исполняющий TCP/IP на Ethernet, сможет обнаруживать (на уровне операционной системы) только трафик, который по своей природе является трафиком TCP/IP. Пакеты IPX/SPX будут отбрасываться уже на уровне драйверов. Как правило, для программного обеспечения мониторинга сетей потребуются нестандартные драйверы устройств и компоненты сетевого уровня.

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

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

Диагностика причин проблем

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

Можно рекомендовать не допускать трафика, превышающего 75% от пропускной способности сети. Если большинство данных, передаваемых через сеть, имеют небольшие объемы, то этот процент можно и снизить, т.к. обработка большого количества передач данных малого объема вызывает большую загруженность, чем обработка малого количества объемистых передач данных. В сети Ethernet такое уменьшение порогового процента также уменьшит и количество коллизий. Время отклика для сетевых запросов уменьшится, а сеть станет более быстрой.

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

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

Способы решения проблем с сетями

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

Один из способов снижения загруженности сети заключается в увеличении пропускной способности сети. Переход от 10BaseT к 100BaseT повышает пропускную способность десятикратно. Такое решение – простое и быстрое, но может оказаться дорогостоящим. Давайте рассмотрим альтернативные способы.

Если вы видите, что объем трафика, передаваемого через сеть, очень велик, то, может быть, наступила пора разделить сеть на подсети, выделив подсети для отделов и рабочих групп вашей фирмы. Разделяя сеть на подсети, вы создаете отдельные сети для каждого подразделения и отдела, вместо того, чтобы помещать всю фирму в одну сеть. Благодаря этому количество компьютеров в отдельных сетях уменьшится и трафик тоже уменьшится. Иногда сети растут медленно в течение длительного времени, и вы можете не замечать дополнительный трафик до тех пор, пока не начнутся проблемы с производительностью. Применение подсетей может оказаться наилучшим решением для преодоления перегрузки сетей.

Другое решение – рассмотреть применение сети с точки зрения функциональности. Есть ли серьезные причины для использования сети? Быть может, приложения возвращают слишком большие объемы данных? Всегда полезно посмотреть на клиентские приложения SQL Server и проверить, не запрашивают ли они больше строк, чем это нужно пользователям. Если у вас много пользователей, то возврат минимально возможного количества строк станет простым способом уменьшить сетевой трафик.

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

Заключение

В этой лекции вы изучили основы работы и конфигурирования SQL Server в сетях. Вы познакомились с применяемыми в SQL Server уровнями сетей, от API до сетевых библиотек, сетевых протоколов и, наконец, до сетевого оборудования. Каждый из этих уровней является независимым, но все они взаимно подходят друг к другу в различных конфигурациях. У вас имеется очень много свободы при выборе различных API, сетевых библиотек, протоколов и даже аппаратных решений. И не забывайте периодически проверять сетевой трафик, что поможет избежать проблем с производительностью еще до того, как они возникнут. (О типичных проблемах с производительностью см.лекцию 36, а о том, как следует конфигурировать SQL Server со службой Microsoft Cluster Services, чтобы получить высоконадежную систему, см.лекцию 12.)

Лекция 12. Microsoft SQL Server и Microsoft Cluster Services

Все большие объемы информации способствуют переориентации системы SQL Server 2000 из систем для настольных компьютеров в системы больших групп компьютеров. Такими группами становится труднее управлять и следить за их работой. Технология MSCS позволяет справиться с данной проблемой и снизить уровень нагрузки на системных администраторов по управлению кластером. Диаграммы, графики и подробное описание технологий, свойств, и примеров реализации технологии MSCS позволит очень быстро освоить новые методы управления группой компьютеров. Отличительной особенностью лекции является в большей степени практическая направленность текста, что способствует применять полученные знания в конкретных задачах.

В последние годы системы Microsoft SQL Server 2000 превратились из систем для настольных компьютеров сначала в системы для рабочих групп, а теперь и в системы для внутренних офисов. Эти системы теперь стали крупнее и их важность для бизнеса повысилась, поэтому повысились и требования к их стабильности, к возможностям дистанционного администрирования и их отказоустойчивости. Чтобы добиться удовлетворения этих требований, фирма Microsoft затратила очень много времени и усилий на поиск ошибок в программах и на улучшение поддержки пользователей. Microsoft усовершенствовала инструментальные средства для администрирования и улучшила возможности дистанционного администрирования, были созданы такие технологии, как "Службы Кластеризации", MSCS (Microsoft Cluster Services). Кластером называется группа компьютеров, которые обеспечивают друг для друга взаимное резервное копирование на случай отказов. В этой лекции вы узнаете, как работает служба MSCS и как их конфигурировать, а также научитесь планировать действия в случае возможных отказов и узнаете, как выполнять восстановление после отказов. Служба MSCS сама по себе не может обеспечить отказоустойчивость вашей системы; чтобы ваша система могла быть восстановлена после отказов, эта технология должна применяться в сочетании с тщательным планированием.

Примечание. MSCS входит в состав Microsoft Windows 2000 Advanced Server, Windows 2000 Datacenter Server и Microsoft Windows NT 4 Enterprise Edition.

Разновидности отказов

Главной обязанностью администратора базы данных является поддержание базы данных в рабочем состоянии в течение требуемых периодов времени, которые обычно указываются в соглашении об уровне обслуживания (service level agreement). В этом соглашении об уровне обслуживания обычно указывается объем периодов работоспособности системы, а также показатели производительности и длительность времени восстановления в случаях отказов в работе. Применение MSCS может увеличить длительность периодов работоспособности системы и сократить длительность времени восстановления. Несмотря на то, что аппаратура сервера, Windows 2000, Windows NT и SQL Server обычно стабильны и надежны, отказы все равно иногда случаются. На самом деле, в сложной компьютерной системе могут случаться разнообразные типы отказов, в том числе следующие:

Отказы будут случаться неизбежно. Вопрос в том, как следует наилучшим образом подготовиться к некоторым из них; этому и посвящена данная лекция.

Обзор MSCS

MSCS является встроенной службой Windows 2000 Advanced Server, Windows 2000 Datacenter Server и Windows NT Enterprise Edition. MSCS применяется для формирования кластера серверов, который, как уже говорилось, является группой независимых серверов, работающих совместно как единая система. Кластер служит для обеспечения готовности (availability, этот термин может переводиться и как "доступность") клиентов к обслуживанию приложений в ситуации возникновения отказа или при запланированных отключениях. Если один из серверов кластера по какой-либо причине является недоступным, то ресурсы и приложения перемещаются на другой узел кластера.

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

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

Основные понятия

MSCS сокращает длительность простоев, осуществляя переходы по отказу между отдельными компьютерами, применяя при этом взаимосвязь между серверами и дисковую систему с общим доступом (рис. 12.2). В качестве взаимосвязи между серверами может применяться любое высокоскоростное соединение, например, сеть Ethernet или другое сетевое оборудование. Эта взаимосвязь функционирует как канал коммуникации между серверами, благодаря которому возможна двусторонняя передача информации о состоянии кластера и о конфигурации. Благодаря разделяемой дисковой системе возможен равноправный доступ всех серверов кластера к базе данных и к другим файлам с данными. Такая разделяемая дисковая система может быть реализована при помощи SCSI, SCSI поверх Fibre Channel, а также при помощи какого-либо нестандартного оборудования. Разделяемые диски могут быть как одиночными дисками, так и RAID-системой. (Про RAID-системы см.лекцию 5.)

Кластер Windows 2000


Рис. 12.2.  Кластер Windows 2000

Внимание. Если разделяемая дисковая система не обладает отказоустойчивостью, то в случае отказа дисковой подсистемы MSCS не сможет переключиться на другой сервер, потому что новый сервер все равно должен пользоваться этой же самой отказавшей дисковой подсистемой. Обязательно защищайте свои дисковые накопители при помощи технологии RAID, потому что они являются механическими устройствами и вероятность отказов для них наиболее высока.

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

Виртуальный сервер существует как элемент сети и ему сопоставлен IP-адрес, применяемый в протоколе TCP/IP. Этот IP-адрес может передаваться от одного компьютера к другому, благодаря чему пользователи продолжают "видеть" виртуальный сервер независимо от того, на каком именно оборудовании он работает. На самом деле, этот IP-адрес переходит от одного компьютера к другому, что обеспечивает одинаковое представление виртуального сервера для наружного наблюдателя. Приложение, направленное по некоторому адресу, все равно получит доступ, соответствующий этому адресу, даже если конкретный сервер, соответствующий этому адресу, и откажет (однако этот адрес теперь будет соответствовать другому серверу). Виртуальный сервер прячет от пользователя операции перехода по отказу, поэтому пользователь может продолжать свою работу, не зная о событиях, происходящих "за кулисами".

Компоненты кластера

Для создания кластера нужны некоторые компоненты: программное обеспечение для управления кластером, взаимосвязь между серверами и разделяемая дисковая система. Чтобы образовать кластер, эти компоненты должны быть сконфигурированы согласованно с приложениями, которые будут предназначены для работы на нем. В данном разделе вы познакомитесь с этими компонентами и узнаете, как они совместно работают, образуя кластер. Затем, в разделе "Конфигурирование SQL Server для работы на кластере" (далее в данной лекции) вы научитесь конфигурировать кластеры SQL Server.

Программное обеспечение MSCS для управления кластером

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

Взаимосвязь между серверами

Взаимосвязь между серверами – это просто соединение между узлами кластера. Так как для узлов кластера необходима постоянная коммуникация между ними (через Службу времени, Менеджер узлов и т.д.), то поддержка этой связи очень важна. Взаимосвязь между серверами должна быть надежным каналом коммуникации.

Во многих случаях в качестве взаимосвязи между серверами может применяться сеть Ethernet, на которой исполняется протокол TCP/IP или NetBIOS. Этого вполне достаточно, но вы можете захотеть применять нестандартную, высокоскоростную взаимосвязь между серверами, которая будет гораздо быстрее, чем Ethernet. Эти взаимосвязи можно приобрести у многих поставщиков оборудования, некоторые из них предоставляют как решения для разделяемых дисков, так и решения для коммуникации. Полный список одобренных устройств для взаимосвязи между серверами вы найдете в списке совместимого оборудования на веб-сайте фирмы Microsoft по адресу http://www.microsoft.com/hcl/

Разделяемая дисковая система

Другая ключевая компонента, необходимая для создания кластера, – разделяемая дисковая система. Если к одной и той же дисковой системе могут иметь доступ многие компьютеры, то в случае отказа узла его работу может взять на себя другой узел. Разделяемая дисковая система должна предоставлять равноправный доступ многим компьютерам к одним и тем же дискам, т.е., каждый из компьютеров должен быть способен иметь доступ ко всем дискам. В нынешней версии MSCS в каждый момент времени только один компьютер может иметь доступ к дискам, но в будущих версиях станет возможен одновременный доступ к данным для многих компьютеров.

В настоящее время доступно несколько видов разделяемых дисковых систем, разрабатываются и новые технологии для дисков. Дисковые подсистемы SCSI всегда поддерживали работу со многими инициаторами, когда можно иметь много контроллеров SCSI на одной и той же шине SCSI. Это делает SCSI идеальным выбором для применения в кластерах. Фактически, системы SCSI были первыми дисковыми подсистемами, которые могли применяться для кластеризации.

Для поддержки кластеризации были разработаны также более современные дисковые технологии, такие как Fibre Channel и некоторые нестандартные фирменные решения. Системы Fibre Channel позволяют подключать диски, находящиеся на значительном удалении от компьютеров. Большинство систем Fibre Channel поддерживает применение многих контроллеров в одном кольце Fibre Channel. Для поддержки кластеризации были спроектированы или модифицированы некоторые RAID-контроллеры. Без модификаций или без внесения изменений в конфигурацию, большинство дисковых контроллеров не будет поддерживать кластеризацию.

Вопрос о кэшах контроллеров, благодаря которым возможно кэширование записей в память, также надо решать при кластеризации, в случаях, когда кэш расположен на самом контроллере (рис. 12.3). В этом случае каждый узел имеет свой собственный кэш, и мы говорим, что он находится перед разделением дисков ("in front of" the disk sharing), потому что два кэша пользуются одними и теми же дисковыми накопителями. Если каждый контроллер имеет кэш и кэш размещается на отказавшем компьютере, то данные из кэша могут быть потеряны. Из-за этого, когда вы в конфигурации кластера применяете внутренние кэши контроллера, они должны быть настроены как применяемые только для чтения (set as read-only). (При некоторых обстоятельствах такая настройка может уменьшить производительность некоторых систем.)

Кэши контроллера перед разделением дисков


Рис. 12.3.  Кэши контроллера перед разделением дисков

В других решениях этой проблемы с разделяемыми дисками предусматривается расслоение (чередование) RAID и кэширование внутри самой дисковой подсистемы. В этой конфигурации кэш разделяется (используется совместно) узлами и в данном случае мы говорим, что кэш находится позади разделения дисков (рис. 12.4). Теперь механизмы расслоения и кэш выглядят одинаково для всех контроллеров системы, и безопасными являются как чтение из кэша, так и запись в кэш.

Кэш контроллера позади разделения дисков


Рис. 12.4.  Кэш контроллера позади разделения дисков

Последние дисковые подсистемы SCSI и Fibre Channel допускают размещение RAID- контроллеров в корпусах дисковых систем, а не в корпусах компьютеров. Такие системы обеспечивают хорошую производительность и отказоустойчивость. Фактически, многие RAID-системы этого типа предлагают контроллеры и кэши, полностью защищенные при помощи избыточности. Многие из последних RAID-систем применяют архитектуру этого типа. Давайте более подробно рассмотрим некоторые дисковые подсистемы.

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

В следующих двух разделах рассказано только о двух решениях с применением технологии RAID. Мы не рекомендуем применять решение SCSI JBOD, за исключением лишь случаев, когда кластер небольшой и главное значение имеет его стоимость.

Внутренняя RAID-система. Внутренние RAID-контроллеры спроектированы таким образом, что аппаратура, управляющая работой RAID, и кэш находятся на самом компьютере. Когда используется внутренняя RAID-система, разделяемая дисковая система разделяется до расслоения RAID, как показано на рис. 12.5.

 Внутренний RAID-контроллер


Рис. 12.5.  Внутренний RAID-контроллер

Так как кэш размещен на контроллере, который не находится в совместном использовании, все данные, которые были в кэше в момент отказа системы, станут недоступными. Это большая проблема в случае, когда работа идет с реляционными СУБД. Когда SQL Server записывает данные на диск, эти данные заносятся в журнал транзакций как записанные. Когда SQL Server пытается восстановиться после отказа системы, эти блоки данных не будут восстановлены, потому что SQL Server считает, что они уже были записаны на диск. В случае отказа при этом типе конфигурации база данных будет повреждена.

Поэтому поставщики RAID-контроллеров с кэшированием при работе их в составе кластеров сертифицируют их работу только при отключенном кэше (или, по крайней мере, при запрете записи в кэш). Если кэш был отключен, то SQL Server не получит сигнала о том, что операция записи была завершена, до тех пор, пока данные не будут действительно записаны на диск.

Примечание.SQL Server выполняет все записи на диск без буферизации и без кэширования. Независимо от размера доступного кэша файловой системы, SQL Server не станет его использовать. SQL Server полностью отказывается от кэша файловой системы, так же поступают и почти все продукты – реляционные СУБД.

В некоторых ситуациях, если пользоваться кэшем контроллера можно добиться повышения производительности. Это особенно имеет смысл при использовании конфигураций RAID 10 и RAID 5, потому что для этих уровней RAID очень велика дополнительная нагрузка, появляющаяся при записи. Чтобы пользоваться кэшем записи контроллера в кластерной конфигурации, нужно пользоваться внешней RAID-системой, в которой кэш находится в совместном пользовании и данные при переходе по отказу не теряются.

Внешняя RAID-система. Во внешних RAID-системах аппаратура RAID находится за пределами компьютеров (см. рис. 12.6). Каждый сервер содержит адаптер главной шины (HBA, host bus adapter), задачей которого является передача в RAID-систему максимально большего количества запросов ввода-вывода с наивысшей возможной скоростью. А место фактического размещения данных определяется RAID-системой.

 Внешняя подсистема RAID


Рис. 12.6.  Внешняя подсистема RAID

Внешние RAID-системы иногда называют "RAID в шкафу" или "RAID в ящике", потому что расслоение RAID производится внутри корпуса с дисками. Такие внешние подсистемы RAID обладают многими достоинствами. Они являются не только идеальным решением для MSCS, но и вообще, универсальным лучшим решением. Ниже перечислены достоинства систем "RAID в шкафу":

 Подключения кабелей внутренних RAID-систем  в сравнении  с подключением кабелей внешних RAID-систем


Рис. 12.7.  Подключения кабелей внутренних RAID-систем в сравнении с подключением кабелей внешних RAID-систем

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

Категории приложений, работающих с кластерами

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

  MSCS и категории приложений


Рис. 12.8.  MSCS и категории приложений

Режимы MSCS

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

Активно-пассивные кластеры

В активно-пассивных кластерах для работы приложений SQL Server применяется первичный узел (primary node), а сервер – вторичный узел (secondary node) является запасным, резервным сервером (рис. 12.9).

Активно-пассивный кластер


Рис. 12.9.  Активно-пассивный кластер

В этой конфигурации один из серверов практически не используется. Этот сервер может месяцами стоять без дела. Фактически, во многих случаях резервный сервер вообще никогда не будет использоваться. И поскольку он не используется, его могут расценивать как дорогостоящее оборудование, простаивающее без дела. Так как этот сервер не может выполнять другие задачи, то для удовлетворения нужд пользователей придется покупать другое оборудование, что делает активно-пассивный режим потенциально неэкономичным.

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

Настоятельно рекомендуется, чтобы аппаратура вторичного узла была точно такая же, как и первичного узла (т.е., чтобы у первичного и вторичного узлов были бы одинаковые объемы оперативной памяти, одинаковые количество и типы центральных процессоров и т.д.). Если узлы имеют одинаковую аппаратуру, то вы можете быть уверены в том, что вторичная система будет работать почти с такой же скоростью, как и первичная. А иначе вы в случае перехода по отказу можете столкнуться с потерей производительности.

Активно-активные кластеры

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

 Активно-активный кластер


Рис. 12.10.  Активно-активный кластер

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

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

Примеры кластеризованных систем

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

Пример 1 – система с высокой готовностью со статическим балансированием нагрузки

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

Кластер с высокой готовностью, со статическим балансированием нагрузки


Рис. 12.11.  Кластер с высокой готовностью, со статическим балансированием нагрузки

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

Пример 2 – система с "горячим резервированием" с максимальной готовностью

Такие системы обеспечивают максимальную готовность и производительность для всех системных ресурсов. Недостатком этой конфигурации является то, что денежные затраты в оборудование почти никогда не работают. Один из узлов работает как первичный узел и исполняет все клиентские запросы. А другой узел простаивает. Этот простаивающий узел служит для "горячего резервирования" и становится доступен только в случае перехода по отказу. Если первичный узел отказывает, то узел для горячего резервирования немедленно принимает на себя все операции и продолжает обслуживание клиентских запросов. Эта конфигурация показана на рис. 12.12.

Данная конфигурация лучше всего подходит для наиболее критически важных приложений. Если ваша фирма зависит от продаж через Интернет, то вашему серверу для веб-торговли, возможно, следовало бы работать в этой конфигурации. От наличия и работоспособности системы зависит бизнес фирмы, и это оправдывает расходы на простаивающее оборудование.

Система с "горячим резервированием" с максимальной готовностью


Рис. 12.12.  Система с "горячим резервированием" с максимальной готовностью

Пример 3 – кластеризация части сервера

Конфигурация с кластеризацией части сервера является примером того, насколько гибкой может быть MSCS. В этой системе переход по отказу разрешен лишь для некоторых приложений. Как показано на рис. 12.13, вы можете задать, чтобы некоторые приложения оставались доступными при отказе узла, а некоторые – нет.

Кластеризация части сервера


Рис. 12.13.  Кластеризация части сервера

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

Пример 4 – только виртуальные серверы, без переходов по отказам

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

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


Рис. 12.14.  Только виртуальные серверы, без переходов по отказам

Конфигурирование SQL Server для работы на кластере

После того как вы инсталлировали и сконфигурировали MSCS, следующим шагом должно стать конфигурирование SQL Server для работы на кластере. Как уже говорилось, SQL Server является приложением, рассчитанным на кластеризацию, специально спроектированным для применения кластеризации. В данном разделе сначала рассмотрим вопросы планирования кластера, а затем расскажем о ваших действиях, необходимых для конфигурирования SQL Server на кластере.

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

Планирование конфигурации

Первый шаг в планировании кластера SQL Server задает тип используемого оборудования и режим, в котором будет работать кластер. Кластер может быть составлен из компьютеров в различных аппаратных конфигурациях и может работать как в активно-пассивном, так и в активно-активном режиме. От этого режима зависят количество и тип необходимого вам оборудования.

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

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

Следующим вашим действием, которое надо будет выполнить при конфигурировании SQL Server для работы на кластере, станет проверка и, возможно, изменение некоторых настроек SQL Server. Мы расскажем про эти настройки в трех следующих разделах.

Задание времени восстановления

При настройке SQL Server вы могли задать какое-либо ненулевое значение для параметра конфигурации recovery interval (интервал восстановления) (нулевое значение задано по умолчанию). Изменение этой настройки увеличит время между контрольными точками и повысит производительность, однако снизит и время восстановления (после перехода по отказам система должна восстанавливаться). В кластеризованной системе применяемое по умолчанию нулевое значение, означающее автоматическое конфигурирование, не должно быть изменено. (Главной причиной применения MSCS является наличие компьютера, на который может быть перенесена работа другого компьютера, и это перевешивает вопросы, относящиеся к производительности.) При такой настройке контрольные точки будут происходить примерно раз в минуту, и максимальное время восстановления составит тоже около одной минуты.

Дополнительная информация. Для дополнительной информации об этом обратитесь к предметному указателю Books Online и посмотрите там "recovery interval option".
Примечание. При выполнении контрольных точек все данные, измененные в кэше SQL Server, записываются на диск. Все измененные данные, которые не были записаны на диск в момент отказа системы, SQL Server сотрет при запуске во время повтора подтвержденных транзакций и отката неподтвержденных транзакций.
Конфигурирование SQL Server для активно-пассивных кластеров

Для создания активно-пассивной конфигурации кластера вам, возможно, понадобится изменить одну из настроек SQL Server. Если вторичный сервер идентичен первичному серверу, то ничего менять не надо. Если вторичный сервер имеет меньше ресурсов, чем первичный сервер, то нужно задать значение 0 для параметра конфигурации SQL Server min server memory. Благодаря такой настройке SQL Server распределит память исходя из системных ресурсов, имеющихся в наличии.

Дополнительная информация. Для дополнительной информации об этом обратитесь к предметному указателю Books Online и посмотрите там "min server memory option".
Конфигурирование SQL Server для активно-активных кластеров

Для создания активно-пассивной конфигурации кластера вы обязательно должны задать значение 0 для параметра конфигурации SQL Server min server memory. Благодаря такой настройке SQL Server распределит память исходя и системных ресурсов, имеющихся в наличии. Если этот параметр конфигурации задан как Manual, то SQL Server может распределить слишком много памяти после перехода по отказу. Так как в операционной системе Windows 2000 применяется виртуальная память, то может случиться так, что памяти будет распределено больше имеющегося объема физической памяти. На самом деле, такая проблема возникает довольно часто и становится причиной подкачки страниц памяти. Например, если у каждого из компьютеров распределено 75% от его системной памяти и произойдет переход по отказу, то для суммарного обслуживания SQL Server потребуется 150% от доступной памяти, из-за чего работа системы практически остановится.

Инсталляция SQL Server для работы на кластере

Процесс инсталляции SQL Server для работы на кластере аналогичен процессу инсталляции SQL Server, описанному в лекции 7. Прежде чем запустить процесс инсталляции для работы на кластере, вы должны решить, где именно будет инсталлироваться SQL Server. Вы должны будете установить файлы SQL Server на разделяемом дисковом накопителе, находящемся под управлением первичного сервера. Вы должны будете задать и путь инсталляции SQL Server, и путь инсталляции главной базы данных (master database) так, чтобы они указывали на этот разделяемый дисковый накопитель. Вы также должны задать сетевой протокол, под которым будет работать кластер. Ниже кратко перечислены действия по инсталляции SQL Server для работы на кластере.

  1. Вставьте свой компакт-диск SQL Server в привод для компакт-дисков вашего сервера. Если ваша операционная система настроена на автоматический запуск компакт-дисков, то появится главное диалоговое окно начальной установки Microsoft SQL Server 2000 (рис. 12.15). Если автоматический запуск компакт-дисков не включен, то нужно вручную запустить программу Autorun.exe, находящуюся в корневой директории компакт-диска.

    Диалоговое окно начальной установки SQL Server


    Рис. 12.15.  Диалоговое окно начальной установки SQL Server

  2. Если у вас не установлены необходимые дополнительные пакеты операционной системы (service packs) или требуемая версия Microsoft Internet Explorer, или если вы просто хотите посмотреть перечень программных компонент, необходимых для инсталляции, то нажмите на SQL Server 2000 Prerequisites, и тогда откроется диалоговое окно SQL Server 2000 Prerequisites (Предварительные условия для SQL Server 2000).

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

    Примечание. Инсталляция MSCS должна быть выполнена до запуска инсталляции SQL Server.
  3. Нажмите на SQL Server 2000 Components. Появится стартовое окно мастера SQL Server 2000 Installation Wizard. Если у вас работают какие-либо другие программы Windows, то их нужно закрыть. Для продолжения процесса инсталляции нажмите на Next.
  4. В экране Computer Name нажмите на Virtual Server и введите с клавиатуры имя виртуального сервера (рис. 12.16). Для продолжения нажмите на Next.

    Экран Computer Name


    Рис. 12.16.  Экран Computer Name

  5. Появится экран User Information (Информация о пользователе). Проверьте правильность своего имени и названия вашей фирмы. Для продолжения нажмите на Next.
  6. Появится экран Software License Agreement (Лицензионное соглашение об использовании программного обеспечения). Нажмите на Yes, чтобы согласиться с условиями лицензионного соглашения и продолжить процесс инсталляции.
  7. В экране Setup введите с клавиатуры 25-символьный ключ компакт-диска, напечатанный на желтой наклейке в инструкции, прилагаемой к компакт-диску или на футляре компакт-диска. Для продолжения нажмите на Next.
  8. Затем появится экран Failover Clustering (Кластеризация с переходом по отказу) (рис. 12.17). Введите IP-адрес для виртуального сервера, а затем нажмите на Add. MSCS предоставит адрес подсети. Для продолжения нажмите на Next.
  9. В экране Cluster Management (Управление кластером) посмотрите на определение кластера, которое предлагает SQL Server. По умолчанию в качестве предпочтительного узла задается локальный компьютер. Все остальные допустимые узлы будут показаны в окне Additional Node (Дополнительный узел). Проверьте настройки и на Next для продолжения процесса инсталляции.
  10. Когда появится экран Remote Information (Информация для дистанционного доступа), введите с клавиатуры пользовательский идентификатор администратора и пароль, которые будут действительны для всех выбранных узлов этого кластера.

     Экран Failover Clustering


    Рис. 12.17.  Экран Failover Clustering

  1. В экране Instance Name (Имя экземпляра) согласитесь со стандартным именем или задайте именованный экземпляр SQL Server. Если вы хотите задать именованный экземпляр, то снимите флажок Default (По умолчанию) и введите с клавиатуры желаемое имя экземпляра. Для продолжения нажмите на Next.
    Примечание. Экземпляры не могут получать такие имена, как DEFAULT, MSSQLSERVER и любые имена, совпадающие с зарезервированными ключевыми словами SQL Server.
  2. В экране Setup Type задайте нужный вам тип инсталляции. По умолчанию программа установки SQL Server инсталлирует SQL Server в первый доступный диск – разделяемый ресурс. Если вы хотите инсталлировать SQL Server в другое место, то нажмите на Browse под заголовком Data Files и задайте путь к другому диску – разделяемому ресурсу. Для продолжения нажмите на Next.
  3. Затем появится экран Authentication Mode (Режим аутентификации) (рис. 12.18). Настройки, заданные в этом окне, задают уровень безопасности вашей инсталляции SQL Server. Вы можете выбрать использование Windows Authentication Mode (Режим аутентификации Windows) либо Mixed Mode (Смешанный режим). При выборе Windows Authentication Mode все права пользователей в отношении базы данных наследуются из настроек Windows User Security. При выборе Mixed Mode вы можете задавать и администрировать настройки безопасности пользователей для базы данных независимо от настроек для Windows. Если вы выберете Mixed Mode, то вы должны задать пароль для учетной записи sa (системного администратора SQL Server). Вы можете оставить этот пароль пустым, но это серьезно ухудшит защищенность вашей инсталляции SQL Server.
  4. В экране Start Copying Files (Запустить копирование файлов) нажмите на Next.
  5. Появится экран Licensing Mode (Лицензионный режим). Имеется два способа для лицензирования ваших клиентов SQL Server – на сервер (Per Server) или на посадочные места (Per Seat). При использовании лицензии на сервер требуется назначать каждую Лицензию клиентского доступа (Client Access License) конкретному серверу и такая лицензия допускает только одно соединение с этим сервером. Максимальное число компьютеров-клиентов, которые могут соединяться с сервером в любой момент времени равно количеству лицензий Client Access License, выданный вами этому серверу.

      Экран Authentication Mode


    Рис. 12.18.  Экран Authentication Mode

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

    Если вы не можете решить, какой режим лицензирования выбрать, нажмите на Per Server. Лицензионное соглашение разрешает возможность однократной, необратимой замены лицензии "на сервер" на лицензию "на посадочные места".

    Чтобы начать инсталляцию приложений и файлов данных SQL Server, нажмите на Continue. Программа установки SQL Server инсталлирует на ваш компьютер нужные файлы и сконфигурирует необходимые компоненты. Инсталляция может потребовать лишь нескольких минут либо может продлиться дольше (это зависит от быстродействия вашего компьютера).

  6. Когда появится экран Setup Complete (Установка завершена), выберите опцию для перезапуска вашего компьютера и нажмите на Finish.

Как видите, конфигурирование SQL Server для работы на кластере не представляет трудностей. После того как вы сконфигурируете кластер, больше вам не придется ничего конфигурировать. Клиенты будут осуществлять доступ к SQL Server при помощи IP-адресов, переназначаемых в ходе выполнения перехода по отказу. Остальные вопросы, относящиеся к программированию, на которые вы должны обратить внимание, будут рассмотрены в разделе "За рамками MSCS".

Применение трехзвенных приложений

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

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

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

За рамками MSCS

Мы с вами изучили основы работы MSCS и работы SQL Server в этой архитектуре. Также мы узнали, как SQL Server может выжить на некоторых типах катастрофических отказов оборудования и программного обеспечения, как можно выполнить резервное копирование SQL Server и быстрое исполнение транзакций. Для достижения такой степени отказоустойчивости одной лишь службы MSCS будет недостаточно, понадобятся и другие меры. Две таких важных меры – это выполнение регулярных и эффективных резервных копирований и разработка плана восстановления после чрезвычайных ситуаций, про это будет подробно рассказано в лекциях 32 и 33. Резервное копирование не может быть заменено службами кластеризации и RAID-системами. Во многих случаях, если система разрушится, а резервной копии у вас не будет, никакие эти технологии не помогут. Ниже перечислены некоторые из таких ситуаций.

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

Заключение

В этой лекции вы узнали о разных конфигурациях кластеризации, об оборудовании и программном обеспечении, необходимых для создания кластеров, а также о процессе конфигурирования SQL Server для работы на кластерах. Теперь вы понимаете, что хоть служба MSCS и поможет вам в некоторых ситуациях, но она не обеспечит полную, окончательную отказоустойчивость вашей системы. Вы должны также применять отказоустойчивую дисковую подсистему и реализовать схему резервного копирования. MSCS, в сочетании с хорошей стратегией преодоления катастроф, может обеспечить максимальную готовность и надежность системы. В следующей лекции мы рассмотрим T-SQL – усовершенствованную версию языка SQL, доступную в SQL Server 2000.

Лекция 13. Введение в Transact-SQL и SQL Query Аnalyzer

Язык SQL является стандартом для всех СУБД. SQL Server 2000 использует модифицированную версию языка – Transact-SQL (T-SQL), дополненную специфическими функциями администрирования и управления проектами. Для лекции характерно большое количество примеров, позволяющих увидеть, как в действительности работает тот или иной сценарий. Приводится описание новых типов данных (которые не рассматривались в предыдущих лекциях). Особенности работы в ISQL, OSQL, Query Analyzer представлены в лучшем виде. Рекомендуется изучать материал совместно со справочной информацией (Books Online).

В этой лекции вы познакомитесь с основными понятиями языков SQL (Structured Query Language, язык структурированных запросов) и T-SQL (Transact-SQL); также будет рассказано о различиях между этими двумя языками. Будут рассмотрены составные части SQL – язык DDL (data definition language, язык определения данных) и DML (data manipulation language, язык манипулирования данными), для каждого из этих языков будут даны примеры. Также мы кратко рассмотрим новые свойства T-SQL, имеющиеся в Microsoft SQL Server 2000. Вы узнаете, как применять различные утилиты SQL Server, в том числе утилиту командной строки T-SQL и SQL Server Query Analyzer, что позволит вам создавать объекты базы данных и управлять этими объектами. Вы также научитесь создавать сценарии, содержащие операторы T-SQL.

Что такое SQL

SQL – это язык программирования и запросов к базам данных, он применяется для осуществления доступа к данным, для запросов к реляционным СУБД, для управления базами данных и их обновления. Стандарт SQL утвержден как Американским Национальным Институтом Стандартов (ANSI, American National Standards Institute), так и Международной организацией по стандартизации (ISO, International Organization for Standardization). ANSI – это организация промышленных и деловых групп, разрабатывающая стандарты для торговли и коммуникации в Соединенных Штатах. ANSI также является членом ISO и IEC (Международной электротехнической комиссии, International Electrotechnical Commission). ANSI публикует стандарты США, которые соответствуют международным стандартам. В 1992 году ISO и IEC опубликовали международный стандарт на SQL, который принято называть SQL-92. ANSI опубликовал в Соединенных Штатах соответствующий стандарт, ANSI SQL-92, который иногда называют ANSI SQL. Хотя разные реляционные СУБД применяют несколько различающиеся версии SQL, но большинство из них соответствуют стандарту SQL-92, определенному ANSI.

Язык SQL содержит операторы, относящиеся к одному из двух основных языков программирования в составе SQL: DDL и DML, о которых мы расскажем вам в последующих разделах.

DDL

Язык DDL (data definition language, язык определения данных) применяется для определения объектов баз данных (таких как базы данных, таблиц и представления) и для управления этими объектами. (Про представления (views) будет рассказано в лекции 18.) Операторы языка DDL обычно включают в себя команды CREATE, ALTER и DROP для каждого из объектов, с которым производится работа. Например, для первоначального создания таблицы, для изменения ее свойств (скажем, для создания или для удаления колонок) и для уничтожения таблицы соответственно применяются операторы CREATE TABLE, ALTER TABLE и DROP TABLE ; мы расскажем об этих операторах в нескольких следующих разделах.

Оператор CREATE TABLE

Давайте в качестве примера применим DDL для создания в базе данных MyDB таблицы с именем Customer_Data (Сведения_о_заказчиках). Эту таблицу Customer_Data обработки мы будем использовать и в других примерах, приведенных в этой лекции. Как уже говорилось, для создания таблицы применяется оператор CREATE TABLE. Наша таблица-пример будет задана как имеющая четыре колонки, при помощи следующих операторов:

Use MyDB 
CREATE TABLE Customer_Data 
(customer_id  		smallint, 
first_name    		char(20), 
last_name     		char(20), 
phone         		char(10)) 
GO

Эти операторы создают структуру таблицы Customer_Data. Таблица Customer_Data останется пустой до тех пор, пока в нее не будут введены данные или она не будет заполнена при помощи массового копирования. (Более подробно о создании таблиц см. лекцию 10.)

Оператор ALTER TABLE

Оператор ALTER TABLE применяется для изменения определения или атрибутов таблицы. В нашем примере оператор ALTER TABLE применяется для добавления в существующую таблицу Customer_Data колонки middle_initial:

ALTER TABLE Customer_Data 
ADD middle_initial char(1) 
GO

Теперь определение таблицы содержит не четыре колонки, как было первоначально, а пять колонок. (Более подробно о применении оператора ALTER TABLE см. лекцию 15.)

Оператор DROP TABLE

Оператор DROP TABLE применяется для уничтожения определений таблиц и всех данных, индексов, триггеров, ограничений и специальных разрешений, относящихся к удаляемым таблицам. Для уничтожения нашей таблицы Customer_Data применяется команда:

DROP TABLE Customer_Data 
GO

(Подробно об операторе DROP TABLE см.лекцию 15.)

DML

Язык DML (data manipulation language, язык манипулирования данными) применяется для манипулирования данными, содержащимися в объектах базы данных, для чего применяются такие операторы, как SELECT, INSERT, UPDATE и DELETE. При помощи этих операторов можно соответственно выбирать строки с данными, вставлять новые строки, изменять имеющиеся строки и удалять ненужные строки. Ниже даны простые примеры применения этих операторов. (Более сложные примеры см. в лекциях 14 и 20.)

Оператор INSERT

Оператор INSERT применяется для вставки строки данных в таблицу или в представление. Например, если вы хотите добавить нового заказчика (customer) в нашу таблицу-пример Customer_Data, то оператор INSERT может выглядеть так:

INSERT INTO Customer_Data 
(customer_id, first_name, last_name, phone) 
VALUES (777, 'Frankie', 'Stein', '4895873900')

Обратите внимание, что во второй строке первого оператора SQL помещен список имен колонок. Этот список определяет, в какие именно колонки будут помещены данные (данные вводятся в той последовательности, как они указаны). Так, первое значение данных будет помещено в первую колонку из списка, в customer_id; второе значение будет помещено во вторую колонку из списка, и т.д. Мы перечислили значения данных в том же порядке, в каком были заданы колонки при создании таблицы, поэтому можно вообще не указывать имена колонок и применить вот такой оператор INSERT:

INSERT INTO Customer_Data 
VALUES (777, 'Frankie', 'Stein', '4895873900')
Внимание. При использовании такой формы оператора INSERT, в случае, если вводимые значения перечислены не в том порядке, как были заданы колонки при создании таблицы, значения могут попасть не в те колонки, куда надо (если вводимые данные совместимы с типами данных колонок). Если же данные будут несовместимы с типами данных колонок, то вы получите ошибку.
Оператор SELECT

Оператор SELECT применяется для извлечения данных из таблицы или из таблиц. Извлекаемые данные определяются перечисленными колонками и предложением WHERE. Предположим, например, что нам надо извлечь значения из колонок customer_id и first_name нашей таблицы Customer_Data, и эти данные нужны лишь для строк со значением Frankie в поле first_name. Тогда нужно применить такой оператор SELECT:

SELECT customer_id, first_name FROM Customer_Data 
WHERE first_name = 'Frankie' 
Если критерию из оператора SELECT будет соответствовать лишь одна строка, 
то результат может быть таким:
customer_id      		first_name 
--------------		-------------
777                    				Frankie
Оператор UPDATE

Оператор UPDATE применяется для обновления (т.е. изменения) значений в одной или нескольких строках таблицы. Например, допустим, заказчик Frankie Stein позвонил и попросил изменить его имя в записях базы данных на Franklin. Эту задачу выполнит такой оператор UPDATE:

UPDATE Customer_Data 
SET first_name = 'Franklin'
WHERE last_name = 'Stein' and customer_id=777

В предложении WHERE указан идентификационный номер заказчика ( customer_id ), чтобы не допустить изменения имен других заказчиков с такой же фамилией Stein (если такие заказчики имеются), имена будут изменены лишь у заказчика с идентификационным номером 777.

Примечание. При составлении операторов UPDATE обязательно задавайте достаточно много фильтров в предложении WHERE, чтобы не изменить ошибочно ненужные строки.
Оператор DELETE

Оператор DELETE применяется для удаления из таблицы одной или нескольких строк с данными. Можно удалить даже все строки таблицы. Чтобы удалить все строки из нашей таблицы-примера Customer_Data, можно воспользоваться каким-либо одним из двух показанных ниже операторов DELETE:

DELETE FROM Customer_Data

или

DELETE Customer_Data

Ключевое слово FROM перед именем таблицы в операторе DELETE не обязательно, эти два оператора ничем не отличаются. Для удаления из таблицы Customer_Data строк, у которых значение колонки customer_id меньше, чем 100, применяется такой оператор:

DELETE FROM Customer_Data 
WHERE customer_id < 100

Теперь, когда вы вкратце познакомились с операторами языков DDL и DML, входящих в состав SQL, давайте рассмотрим язык T-SQL.

Что такое T-SQL

T-SQL – это усовершенствование стандартного языка программирования SQL. Первоначальный, основной SQL применяется для взаимодействия между приложениями и SQL Server. В T-SQL имеются все возможности языков DDL и DML стандартного SQL, а кроме этого имеются также расширенные функции, системные хранимые процедуры и конструкции для программирования (такие, как IF and WHILE ), обеспечивающие гораздо большую гибкость программирования. По мере выхода новых версий SQL Server возможности T-SQL растут.

Обзор новых возможностей T-SQL

В T-SQL для Microsoft SQL Server 7 появились многочисленные добавления и улучшения, в том числе новые хранимые процедуры, системные таблицы, функции, типы данных, операторы и новые возможности для старых операторов. Все было сохранено и в SQL Server 2000, и мы сейчас дадим краткий обзор этих новых возможностей (если вы не знаете о них по опыту своей работы с SQL Server 7). Однако их слишком много, чтобы мы смогли дать подробные описания, поэтому мы рассмотрим лишь несколько примеров для каждой их разновидности.

Дополнительная информация. Чтобы получить полный список новых возможностей T-SQL, обратитесь к SQL Server Books Online, к теме "New Features in Transact-SQL" (Новые возможности в Transact-SQL). Чтобы открыть эту тему, нажмите на Transact-SQL Reference во вкладке Contents, а затем нажмите на New Features in Transact-SQL.
Системные хранимые процедуры

В SQL Server имеются системные хранимые процедуры, с помощью которых можно выполнять администрирование и другие задачи, требующие обновления системных таблиц и извлечения информации из системных таблиц. Системные хранимые процедуры инсталлируются вместе с SQL Server, их имена начинаются с sp_ или с xp_. Эти процедуры хранятся в базе данных master (главной системной базе данных) (а также базе msdb. – Прим. ред.), их владелец – системный администратор, но многие из них могут запускаться из любой пользовательской базы данных, извлекая при этом информацию из системных таблиц этой базы данных. Когда вы исполняете системную хранимую процедуру, она работает с системными таблицами текущей базы данных.

Дополнительная информация. Дополнительную информацию о системных хранимых процедурах вы найдете в Books Online, в теме "Extended Stored Procedures" (Расширенные хранимые процедуры).

Многие системные хранимые процедуры появились в SQL Server 7, сейчас они по-прежнему доступны и в SQL Server 2000. В табл. 13.1 перечислены некоторые из этих системных процедур, они могут вам пригодиться.

Таблица 13.1. Процедуры, появившиеся в SQL Server 7, имеющиеся и в SQL Server 2000
Системная хранимая процедураОписание
sp_cycle_errorlogЗакрывает текущий файл-журнал ошибок и переименовывает его в errorlog.1 (если необходимо, переименовывает старый errorlog.1 в errorlog.2 и так далее) и открывает новый файл-журнал ошибок >
sp_helpfileВозвращает физические имена и атрибуты файлов, сопоставленных с текущей базой данных
sp_helpfilegroupВозвращает имена и атрибуты групп файлов, сопоставленных с текущей базой данных
sp_helproleВозвращает информацию о ролях в текущей базе данных
sp_help_alertВозвращает информацию о предупреждениях, заданных для сервера
sp_start_jobПриказывает, чтобы SQL Server Agent начал выполнять задание

Некоторые из этих хранимых процедур не только немедленно выдают информацию, но могут и сохранять для дальнейшего применения важную информацию о пользовательских базах данных. Например, процедуры, возвращающие информацию о базе данных пользователя, могут оказаться полезными при исполнении в сценариях T-SQL, когда выдаваемая ими информация будет сохраняться в файле. Вы можете сохранять информацию, выдаваемую после запуска хранимых процедур sp_helpfile, sp_helpfilegroup и sp_helpdb, примененных к нужной базе данных (процедура sp_helpdb, хоть и старая, но по-прежнему пользуется популярностью). Это пригодится в случае, если придется воссоздавать базу данных и понадобится информация о первоначально созданных и сконфигурированных файлах, группах файлов и опциях базы данных. Список остальных новых системных процедур, появившихся в SQL Server 7, вы найдете в Books Online, в теме "New Features in Transact-SQL" (Новые возможности в Transact-SQL).

Системные таблицы

Системные таблицы служат для хранения информации о конфигурации SQL Server и хранения заданных для баз данных определений объектов, пользователей и полномочий доступа. Каждая пользовательская база данных имеет свои собственные системные таблицы, в которых хранится информация для этой базы данных. Системные таблицы, хранящие информацию о конфигурации на уровне сервера, хранятся только в базе данных master (главной системной базе данных). Для доступа к системным таблицам нужно применять системные хранимые процедуры, а не осуществлять доступ непосредственно. Список новых системных таблиц, появившихся первоначально в SQL Server 7, вы найдете в Books Online, в теме "New Features in Transact-SQL". Ниже перечисленные некоторые интересные системные таблицы.

Функции

При помощи встроенных функций SQL Server возможно быстрое и удобное решение некоторых задач. Некоторые новые функции появились в SQL Server 7, и они остались доступными и в SQL Server 2000. Зная об имеющихся функциях, вам будет проще программировать приложения SQL Server. Полный список новых функций вы найдете в Books Online, в теме "New Transact-SQL Functions" (Новые функции Transact-SQL). Ниже приведены описания лишь нескольких из новых функций, которые могут вам пригодиться:

Типы данных

В SQL Server 7 появилось несколько новых типов данных, а некоторые из имеющихся типов данных получили новые размеры. В SQL Server 2000 помимо этих новшеств появилось еще три новых типа данных. Про большинство типов данных было рассказано в лекции 10. Ниже дан список изменений, относящихся к типам данных, появившихся в SQL Server 7 и оставшихся и в SQL Server 2000:

А ниже перечислены три новых типа данных, появившихся в SQL Server 2000:

Операторы

В SQL Server 7 появилось много новых операторов T-SQL, а имеющиеся операторы приобрели новые возможности, и все это вошло и в SQL Server 2000. Эти операторы соответствуют некоторым из новых возможностей, появившихся в SQL Server 7. Например, оператор ALTER DATABASE получил следующие новые опции для работы с файлами и группами файлов: MODIFY FILE, ADD FILEGROUP, MODIFY FILEGROUP, REMOVE FILE и REMOVE FILEGROUP. А для групп файлов новый оператор DBCC CHECKFILEGROUP проверяет размещение и структурную целостность всех таблиц в заданной группе файлов.

В SQL Server 7 и SQL Server 2000 появилось еще два оператора DBCC – DBCC SHRINKFILE и DBCC SHRINKDATABASE. Первый из них сжимает заданный файл данных, уменьшая его размер, а второй оператор сжимает все файлы в заданной базе данных, освобождая неиспользуемое место на диске.

У SQL Server 7 и SQL Server 2000 была усовершенствована архитектура для резервного копирования и восстановления. Новый оператор BACKUP позволяет выполнять полные и частичные резервные копирования базы данных и журнала, а новый оператор RESTORE позволяет восстанавливать базы данных и журналы после этого резервного копирования. Эти операторы применяются вместо операторов DUMP и LOAD из старых версий SQL Server. Полный список новых операторов и опций, появившихся в SQL Server 7 и SQL Server 2000, вы найдете в Books Online, в теме "New Features in Transact-SQL". Более подробно о резервном копировании и о восстановлении после резервного копирования будет рассказано в лекциях 32 и 33.

Как применять T-SQL

T-SQL можно применять не только в программах ваших приложений (эта тема выходит за рамки нашей книги), вы можете также исполнять интерактивные операторы T-SQL, пользуясь какой-нибудь из трех утилит – ISQL, OSQL или Query Analyzer; кроме того, вы можете создавать и исполнять сценарии SQL.

Утилита ISQL

Утилита ISQL взаимодействует с SQL Server через API-интерфейс DB-LIB; с ее помощью можно исполнять интерактивные операторы T-SQL, хранимые процедуры и файлы сценариев. API-интерфейс DB-LIB остался на уровне функциональности SQL Server 6.5, поэтому приложение ISQL не поддерживает некоторые возможности SQL Server 2000. Например, ISQL не может извлекать данные из типа данных ntext (в кодировке Unicode).

Утилита OSQL

Утилита OSQL появилась в SQL Server 7 и осталась в SQL Server 2000 в качестве замены для ISQL. Утилиты ISQL и OSQL очень во многом сходны, но OSQL для коммуникации с SQL Server применяет API-интерфейс ODBC (Open Database Connectivity), а не DB-LIB, и OSQL поддерживает все возможности SQL Server 2000. Во всем остальном OSQL и ISQL функционируют одинаково. SQL Server 2000 поддерживает обе этих утилиты, однако, чтобы не столкнуться с проблемами, о которых мы упомянули, следует пользоваться OSQL, а не ISQL.Чтобы исполнять OSQL из окна с приглашением командной строки (из окна MS-DOS), нужно просто запустить программу OSQL.exe с соответствующими параметрами, например, так:

osql –U имя_пользователя –P пароль –S имя_сервера

Когда OSQL установит соединение с SQL Server, появится такое приглашение с номером:

1>

После этого приглашения можно вводить операторы T-SQL, например, такой оператор:

1>    		sp_helpdb master 
2>    		go

В результате его выполнения будет выдана информация о базе данных master. Ключевое слово go не является оператором T-SQL, это – команда, распознаваемая ISQL, OSQL и Query Analyzer и обозначающая завершение пакета операторов T-SQL. Вывод от исполнения таких интерактивных запросов будет выдаваться в окне с приглашением командной строки.

Если при наборе командных строк OSQL вы допустили опечатку, то, воспользовавшись командой RESET, можно снова вернуться к приглашению первой строки:

1>    		sp_helpbd 
2>    		reset 
1>    		sp_helpdb  
2>    		go

Для завершения работы с утилитой OSQL введите команду QUIT или EXIT. Команду или запрос, исполняющуюся в текущий момент времени, можно завершить, нажав Ctrl+C (выход из утилиты OSQL при этом не произойдет).

Утилита OSQL имеет и другие параметры кроме -U, -P и -S. Полное описание всех параметров и дополнительную информацию об утилите OSQL вы найдете в Books Online, в теме "osql Utility".

Query Analyzer

Query Analyzer применяется для исполнения операторов или сценариев T-SQL из графического пользовательского интерфейса и для получения результатов в форматированном виде. Query Analyzer обладает также некоторыми средствами для анализа индексов запросов. Некоторые люди предпочитают применять Query Analyzer, а не запускать операторы в окне "приглашения MS-DOS". Для работы с Query Analyzer выполните следующие действия:

  1. Запустите Query Analyzer каким-либо из следующих трех способов.
    • введите isqlw в командной строке;
    • откройте Enterprise Manager и выберите SQL Query Analyzer в меню Tools;
    • в меню кнопки Start наведите указатель мыши сначала на Programs, затем на Microsoft SQL Server, а затем выберите Query Analyzer.
    Если вы не соединены с сервером, то появится диалоговое окно Connect to SQL Server (Соединиться с SQL Server) (рис. 13.1).

    Диалоговое окно Connect to SQL Server


    Рис. 13.1.  Диалоговое окно Connect to SQL Server

  2. В ниспадающем списке SQL Server выберите сервер, с которым вы хотите соединяться. Точка, стоящая в этом поле, означает соединение с локальным сервером. Введите информацию для входа в систему и, если вы желаете, чтобы в случаях, когда SQL Server не запущен, он запускался бы автоматически, установите флажок Start SQL Server if it is stopped. Затем нажмите на экранную кнопку OK. Появится стартовое окно Query Analyzer (рис. 13.2).

    SQL Query Analyzer


    увеличить изображение

    Рис. 13.2.  SQL Query Analyzer

  3. В окне запросов введите с клавиатуры любой оператор T-SQL или вызов хранимой процедуры (рис. 13.3). Заметьте, что окно запросов на приведенном рисунке развернуто и занимает все окно Query Analyzer.

    Вызов хранимой процедуры в окне запросов


    увеличить изображение

    Рис. 13.3.  Вызов хранимой процедуры в окне запросов

  4. Чтобы выполнить введенный оператор, нажмите на кнопку Execute Query (Исполнить запрос), находящуюся на панели инструментов и выглядящую как зеленый треугольник, указывающий острием вправо, либо нажмите Ctrl+E*. Результаты исполнения запроса появятся в панели результатов (рис. 13.4).

    Query Analyzer показывает результаты исполнения запроса


    увеличить изображение

    Рис. 13.4.  Query Analyzer показывает результаты исполнения запроса

  5. Если нужно, чтобы Query Analyzer загрузил и исполнил созданный вами ранее T-SQL-сценарий, то нажмите на кнопку Load SQL Script в панели инструментов, выглядящую как желтая папка, или выберите команду Open в меню File, а затем найдите и укажите нужный файл со сценарием. Весь сценарий появится в верхней панели окна запросов. Для запуска сценария нажмите на кнопку Execute Query.
    Примечание. Query Analyzer имеет еще много других возможностей, в том числе некоторые новые возможности для SQL Server 2000. (Подробнее об этом см. лекцию 35.)
Сценарии T-SQL

Создав свои собственные сценарии, вы получите замечательную возможность для многократного запуска операторов и хранимых процедур T-SQL. Сценарий (script) – это просто файл, в котором содержатся операторы T-SQL, которые нужно запускать. В скрипте может быть как один оператор, так и последовательность операторов. Мы сразу дадим одну рекомендацию: создавая сценарии T-SQL, давайте именам их файлов расширение .sql, тогда вам будет легче находить эти файлы.

Ниже дан пример кода простого сценария:

use MyDB 
go 
sp_helpdb MyDB 
go 
sp_helpfilegroup 
go 
sp_spaceused Customer_Data 
go 
sp_spaceused Product_Info 
go

Этот сценарий вызывает несколько системных хранимых процедур, собирающих разнообразную информацию о базе данных MyDB и ее файлах, группах файлов и таблицах (Customer_Data и Product_Info).

Предположим, что этот сценарий был сохранен в файле MyDB_info.sql. Тогда, чтобы запустить его из командной строки, вы можете воспользоваться опциями  -i и -o утилиты OSQL. Опция  -i вызывает запуск сценария, находящегося во входном файле ( input ), имя которого указано после опции. Опция  -o задает выходной файл ( output ), имя которого указано после опции, в него будут помещены результаты. Пусть выходной файл у нас будет иметь имя MyDB_info.out. Давайте также применим опцию -e, тогда операторы T-SQL из входного файла будут отображаться (echo) также и в выходном файле, что облегчит понимание выходного файла. Например, чтобы исполнить наш сценарий, будучи системным администратором, надо дать следующую команду в командной строке:

osql –U sa  –P  –i MyDB_info.sql  –o MyDB_info.out  –e

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

Есть и другой способ запуска сценариев, при котором вам не понадобится каждый раз набирать с клавиатуры команду osql -u ....Надо создать .cmd-файл и поместить в него эту команду. Так, можно назвать этот файл MyDB_info.cmd и поместить в него вышеприведенную команду osql -u .... Теперь вы можете не только запустить команду MYDB_INFO из командной строки, но и дважды щелкнуть мышью на имени файла MyDB_info.cmd в Проводнике Microsoft Windows.

Сценарии можно запускать и в Query Analyzer. Чтобы запустить наш сценарий MyDB_info.sql, откройте этот файл, выбрав в Query Analyzer команду Open в меню File, после этого в верхней панели появится код сценария. Нажмите на кнопку Execute Query или нажмите клавиши Ctrl+E, и операторы сценария исполнятся. Вывод от операторов сценария будет выдаваться в соответствии с порядком исполнения операторов (рис. 13.5). Обратите внимание, что на рис. 13.5 две верхние таблицы результатов выданы хранимой процедурой sp_helpdb.

Результаты исполнения сценария Query Analyzer


увеличить изображение

Рис. 13.5.  Результаты исполнения сценария Query Analyzer

Заключение

В этой лекции вы познакомились с основами языков SQL и T-SQL, увидели примеры простых операторов DDL и DML. Теперь вы умеете запускать операторы T-SQL, причем разными способами – при помощи ISQL, OSQL, Query Analyzer и из сценариев T-SQL. (Об использовании T-SQL см. в лекциях 14, 15 и 25.)

Лекция 14. Извлечение данных при помощи Transact-SQL

Язык запросов DML предназначен для манипулирования данными. Наиболее распространенным оператором является SELECT. Узнать обо всех тонкостях использования оператора SELECT позволит данный материал. Огромное количество примеров, примечаний к ним, объяснения принципов работы – все это и многое другое вы найдете в лекции. Вводится множество новых операторов, ключевых слов и, самое главное, описываются принципы работы с данными новшествами. Агрегатные функции, описываемые в лекции, помогают решать повседневные задачи, связанные с поиском среднего арифметического значения, количеством элементов, минимального и максимального элементов, суммы значений и многого другого.

Прочитав эту лекцию, вы узнаете, как извлекать данные при помощи оператора SELECT языка Transact-SQL (T-SQL). Здесь также описаны многие необязательные предложения, условия поиска и функции, которые могут применяться в операторах SELECT. Благодаря этим элементам вы сможете составлять запросы, возвращающие лишь те данные, которые вам нужны.

Оператор SELECT

Хотя оператор SELECT обычно применяется для извлечения данных со специфическими свойствами, его можно использовать и для присваивания значений локальным переменным или для вызова функций (об этом будет рассказано в разделе "Другие применения оператора SELECT" в конце этой лекции). Оператор SELECT может быть простым или сложным (но сложные операторы SELECT не обязательно лучше). Старайтесь составлять свои операторы SELECT как можно проще, пусть они только лишь извлекают нужные данные. Например, если вам нужны данные из двух колонок таблицы, то составляйте оператор SELECT для извлечения данных только из этих двух колонок, чтобы минимизировать объем возвращаемых данных.

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

Давайте начнем изучать различные опции оператора SELECT и рассмотрим иллюстрирующие их примеры. Учебные базы данных pubs и Northwind создались автоматически при инсталляции Microsoft SQL Server 2000. Чтобы ознакомиться с этими базами данных, посмотрите их таблицы, применив SQL Server Enterprise Manager.

Синтаксически оператор SELECT состоит из нескольких предложений (clauses), большинство из которых не являются обязательными. Оператор SELECT должен обязательно иметь предложения SELECT и FROM. Эти два предложения задают соответственно колонку (или колонки) и таблицу (или таблицы), из которых будут извлекаться данные. Например, простой оператор SELECT, извлекающий имена и фамилии авторов из таблицы authors базы данных pubs, может выглядеть вот так:

SELECT   		au_fname, au_lname 
FROM     		authors

Если вы пользуетесь утилитой OSQL с командной строкой (она была описана в лекции 13), то не забывайте давать команду GO, исполняющую оператор. При использовании OSQL полный код T-SQL для вышеприведенного оператора SELECT будет таким:

USE      			pubs 
SELECT   		au_fname, au_lname 
FROM     		authors 
GO
Примечание. Ключевые слова не зависят от регистра букв (т.е. от того, какими буквами они набраны – строчными или ПРОПИСНЫМИ), поэтому для улучшения читаемости кода рекомендуется выделять их регистром букв в соответствии с какой-нибудь системой. В нашей книге, например, ключевые слова выделены ПРОПИСНЫМИ буквами.

Если вы запускаете оператор SELECT в интерактивном режиме (например, при помощи OSQL или SQL Query Analyzer), то результаты отображаются в колонках, и для удобства восприятия эти колонки даны вместе с заголовками. (О T-SQL, OSQL и Query Analyzer см.лекцию 13.)

Предложение SELECT

Предложение SELECT содержит обязательный список выборки (select list) и, возможно, несколько необязательных аргументов. Список выборки – это заданный в предложении SELECT список выражений или колонок, определяющий, какие данные должны быть извлечены. В этом разделе мы расскажем как о необязательных аргументах предложения SELECT, так и о списке выборки.

Аргументы

Для управления выдаваемыми строками в предложении SELECT могут применяться следующие аргументы:

Ниже даны три примера запуска оператора SELECT с разными аргументами. В первом из них при запуске используется аргумент DISTINCT, во втором – аргумент TOP 50 PERCENT, а в третьем – аргумент TOP 5:

SELECT   		DISTINCT au_fname, au_lname 
FROM     		authors 
GO
SELECT   		TOP 50 PERCENT au_fname, au_lname 
FROM      		authors 
GO
SELECT   		TOP 5 au_fname, au_lname 
FROM      		authors 
GO

Первый запрос вернет 23 строки, каждая из которых будет уникальной. Второй запрос вернет 12 строк (приблизительно 50%, с округлением до большего числа), а третий запрос вернет 5 строк.

Список выборки

Как уже говорилось, список выборки – это заданный в предложении SELECT список выражений или колонок, указывающий, какие данные должны выдаваться. Выражение может быть списком из имен колонок, из функций, и из констант. Список выборки может содержать несколько выражений и имен колонок, разделенных запятыми. В предыдущих примерах список выборки был таким:

au_fname, au_lname

Метасимвол "*". В списках выборки можно применять звездочку (символ "*"), являющуюся метасимволом (подстановочным символом, "джокером"), обозначающим все колонки из всех таблиц и представлений, указанных в предложении FROM запроса. Например, чтобы вернуть все колонки всех строк таблицы sales из базы данных pubs, воспользуйтесь таким запросом:

SELECT   		* 
FROM     		sales 
GO

Далее в этой лекции будет раздел "Перекрестные соединения", в котором описано, что произойдет, если в предложении FROM оператора SELECT, содержащего звездочку, указать более одной таблицы.

Выражения IDENTITYCOL и ROWGUIDCOL. Чтобы извлекать значения из идентифицирующей колонки таблицы (identity column, см. лекцию 10), вы можете применять в списках выборки просто выражение IDENTITYCOL. Ниже дан пример запроса для базы данных Northwind, у которой таблица Employees (Сотрудники) имеет идентифицирующую колонку:

USE      			Northwind 
GO 
SELECT   		IDENTITYCOL 
FROM     		Employees 
GO

Набор результатов этого запроса будет выглядеть примерно так:

EmployeeID  
-------------
3 
4 
8 
. 
. 
. 
9 
(всего 9 строк)

Обратите внимание, что заголовок колонки в наборе результатов – такой же, как имя колонки этой таблицы, обладающей свойством IDENTITY (в нашем случае – EmployeeID).

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

Алиасы колонок.В списках выборки можно применять алиасы колонок, благодаря чему можно поменять заголовок, выдаваемый в наборе результатов. Алиасы могут оказаться полезными в случаях, когда надо пояснить смысл колонки или чтобы дать заголовок колонке, используемой в функции, а также в качестве ссылки для предложения ORDER BY.

Когда в разных таблицах имеются колонки с одинаковыми именами, вы можете захотеть, чтобы в выводе в заголовках выдавались не только имена колонок, но и имена таблиц; это улучшит понимание выводимой информации. Рассмотрим теперь примеры с колонкой lname таблицы employee базы данных pubs. Можно дать такой запрос:

USE      			pubs 
GO 
SELECT   		lname 
FROM     		employee 
GO

Этот запрос выдаст такие результаты:

lname 
----------
Cruz 
Roulet 
Devon 
. 
. 
. 
O’Rourke 
Ashworth 
Latimer
(всего 43 строки)

Если вы хотите, чтобы в наборе результатов вместо имеющегося заголовка "lname" выводился бы заголовок "Фамилия сотрудника", подчеркнув тем самым, что фамилии взяты из таблицы сотрудников, то надо применить ключевое слово AS, вот так:

SELECT   		lname AS "Фамилия сотрудника"
FROM     		employee 
GO

Эта команда выдаст такой вывод:

Фамилия сотрудника 
-------------------------
Cruz 
Roulet 
Devon 
. 
. 
. 
O’Rourke 
Ashworth 
Latimer
(всего 43 строки)

Алиасы колонок можно применять в сочетании с другими типами выражений в списке выборки, а также их можно применять в предложениях ORDER BY для ссылок на колонки. Предположим, что в списке выборки имеется вызов функции. Выводу этой функции можно назначить алиас (т.е. имя), воспользовавшись ключевым словом AS после вызова функции. Если при вызове функции не пользоваться алиасом, то колонка ее вывода не будет вообще иметь никакого заголовка. Ниже дан пример оператора, назначающего заголовок "Maximum Job ID" выводу функции MAX:

SELECT   		MAX(job_id) AS "Maximum Job ID" 
FROM     		employee 
GO

Алиас колонки заключен в кавычки, потому что он состоит из нескольких слов, разделенных пробелами. Если алиас не содержит пробелов (как в следующем нашем примере), то его не нужно заключать в кавычки.

Алиас колонки, заданный в предложении SELECT, может применяться в качестве аргумента предложения ORDER BY, он позволяет предложению ORDER BY ссылаться на колонку из предложения SELECT. Это полезно, когда в списке выборки содержится функция, вывод которой должен быть отсортирован. Ниже приведен пример команды, выдающей количество проданных книг в каждом из магазинов, причем вывод отсортирован по этому количеству. В предложении ORDER BY применяется алиас Quantity_of_Books, заданный в списке выборки:

SELECT   		SUM(qty) AS Quantity_of_Books, stor_id  
FROM     		sales 
GROUP BY 	stor_id 
ORDER BY 	Quantity_of_Books 
GO

В этом примере алиас не заключен в кавычки, потому что он не содержит пробелов.

Если бы в этом запросе мы не задали бы алиас для колонки SUM(qty), то мы могли бы поместить в предложение ORDER BY не алиас, а SUM(qty), как показано в приведенном ниже примере. Вывод был бы таким же, за исключением того, что колонка сумм проданных книг выводилась бы без заголовка:

SELECT   		SUM(qty), stor_id FROM sales 
GROUP BY 	stor_id 
ORDER BY 	SUM(qty)
GO

Помните, что алиасы колонок применяются для задания заголовков колонок вывода и никак не влияют не результаты запросов.

Предложение FROM

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

Производные таблицы

Производная таблица (derived table) – набор результатов оператора SELECT, вложенный в предложение FROM. Набор результатов вложенного оператора SELECT используется как таблица, из которой извлекаются данные внешний оператор SELECT. Ниже дан пример запроса, использующего производную таблицу, чтобы найти имена всех магазинов (stores), предоставляющих хотя бы один вид скидок (discounts):

USE      			pubs 
GO 
SELECT   		s.stor_name 
FROM     		stores AS s, (SELECT stor_id, COUNT(DISTINCT discounttype) 
                         						AS d_count 
                         						FROM   	      discounts 
                         						GROUP BY   stor_id) AS d 
WHERE    		s.stor_id = d.stor_id AND 
        			d.d_count >= 1  
GO

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

Заметьте, что в этом запросе применяются сокращения для имен таблиц (s для таблицы stores (магазины) и d для таблицы discounts (скидки)). Эти сокращения называются алиасы таблиц (см. раздел "Алиасы таблиц" далее).

Примечание. Производные таблицы нельзя применять в предложениях WHERE. В качестве условия поиска в предложениях WHERE используется оператор SELECT. Об этом будет рассказано более подробно в разделе "Предложения WHERE и условия поиска" далее в этой лекции.
Соединения таблиц

Соединение таблиц (joined table) – это набор результатов от операции соединения (join operation), выполненной над двумя или несколькими таблицами. Над таблицами можно выполнять различные типы соединений: внутренние соединения, полные внешние соединения, левые внешние соединения, правые внешние соединения, перекрестные соединения. Давайте рассмотрим их более подробно.

Внутренние соединения. Внутреннее соединение (inner join) является типом соединений, принятым по умолчанию. Внутреннее соединение задает набор результатов, в который будут включены лишь те строки таблиц, которые соответствуют условию ON, а все несоответствующие строки будут отброшены. Чтобы задать соединение, применяйте ключевое слово JOIN. Для задания условия поиска, на котором основывается соединение, применяется ключевое слово ON. Ниже приведен пример запроса, в котором соединяются таблицы stores и discounts; этот запрос показывает, в каких магазинах предоставляются скидки и типы этих скидок. (Это соединение – внутреннее, потому что по умолчанию применяется внутреннее соединение; поэтому будут возвращены лишь строки, соответствующие условию поиска ON.)

SELECT   		s.stor_id, d.discounttype 
FROM     		stores s JOIN discounts d 
ON       			s.stor_id = d.stor_id 
GO

Набор результатов будет выглядеть примерно так:

stor_id  	discounttype 
------------------------------
8042     	Customer Discount

Как видите, скидки предоставляет лишь один магазин, причем скидки лишь одного типа. Выданная строка является единственной строкой с совпадающими значениями stor_id из таблицы stores и stor_id из таблицы discounts. Возвращаются это значение stor_id и соответствующее ему значение discounttype.

Полные внешние соединения. Полное внешнее соединение (full outer join) задает набор результатов, состоящий как из строк, соответствующих условию ON, так и из строк, не соответствующих условию ON. Для строк, не соответствующих условию ON, значением колонки, несоответствующей условию, станет NULL. В нашем примере NULL будет означать, что либо магазин не предоставляет никаких скидок (если некоторое значение stor_id имеется в таблице stores, но отсутствует в таблице discounts), либо этот тип скидки не предоставляется никаким магазином. Запрос в следующем примере полностью совпадает с предыдущим, за исключением того, что в нем стоят ключевые слова FULL OUTER JOIN:

SELECT   		s.stor_id, d.discounttype 
FROM     		stores s FULL OUTER JOIN discounts d 
ON       			s.stor_id = d.stor_id 
GO

Набор результатов будет выглядеть примерно так:

stor_id  		discounttype 
---------		-----------------
NULL     		Initial Customer 
NULL     		Volume Discount 
6380     		NULL 
7066     		NULL 
7067     		NULL 
7131     		NULL 
7896     		NULL 
8042     		Customer Discount

Условию поиска будет соответствовать лишь одна строка в наборе результатов (последняя). Остальные строки имеют NULL в одной из колонок.

Левые внешние соединения. Левое внешнее соединение (left outer join) возвращает строки, в которых произошло соответствие условию поиска, плюс все строки из таблицы, заданной слева от ключевого слова JOIN. Ниже дан наш старый пример запроса, но теперь в нем используются ключевые слова LEFT OUTER JOIN:

SELECT   		s.stor_id, d.discounttype 
FROM      		stores s LEFT OUTER JOIN discounts d 
ON           			s.stor_id = d.stor_id 
GO

Набор результатов будет выглядеть примерно так:

stor_id  		discounttype 
-------		---------------------
6380     		NULL 
7066     		NULL 
7067     		NULL 
7131     		NULL 
7896     		NULL 
8042     		Customer Discount

В набор результатов попадут и те строки из таблицы stores, для которых не нашлось строк из таблицы discounts с совпадающим значением stor_id (в колонке discounttype набора результатов в этих строках будет стоять значение NULL ). В набор результатов попадет также одна строка, для которой произошло соответствие условию ON.

Правые внешние соединения. Правое внешнее соединение (right outer join) противоположно левому внешнему соединению: в него войдут строки, соответствующие условию поиска, плюс все строки из таблицы, заданной справа от ключевого слова JOIN. Ниже дан наш старый пример запроса, но теперь в нем используются ключевые слова RIGHT OUTER JOIN:

SELECT   		s.stor_id, d.discounttype 
FROM     		stores s RIGHT OUTER JOIN discounts d 
ON       			s.stor_id = d.stor_id

Набор результатов будет выглядеть примерно так:

stor_id  		discounttype 
-------		--------------------
NULL     		Initial Customer 
NULL     		Volume Discount 
8042     		Customer Discount

В набор результатов попали и те строки из таблицы discounts, которые не имеют значений stor_id, совпадающих со значениями, имеющимися в таблице stores (значением stor_id для этих строк в наборе результатов станет NULL ). В набор результатов попадет также строка, соответствующая условию ON.

Перекрестные соединения. Перекрестное соединение (cross join) – это произведение двух таблиц, в котором не задано предложение WHERE. Когда предложение WHERE задано, перекрестное соединение работает как внутреннее соединение. А без предложения WHERE будет возвращаться такой результат: каждая строка из первой таблицы сопоставляется с каждой строкой из второй таблицы, поэтому размер набора результатов будет равен числу строк первой таблицы, умноженному на число строк второй таблицы.

Чтобы понять, что такое перекрестное соединение, давайте рассмотрим еще несколько примеров. Сначала рассмотрим перекрестное соединение без предложения WHERE, а затем рассмотрим три примера перекрестных соединений с предложениями WHERE. Ниже даны три простых примера. Запустите эти запросы и обратите внимание на количество строк в наборах результатов.

SELECT   		* 
FROM     		stores 
GO

SELECT   		* 
FROM     		sales 
GO 
 
SELECT   		* 
FROM     		stores CROSS JOIN sales 
GO
Примечание. Если вы поместите в предложение FROM две таблицы, то это даст такой же результат, как если бы задать CROSS JOIN, как в следующем примере:
SELECT   		* 
FROM     		stores, sales 
GO

Чтобы не потонуть в массе ненужной информации (если информации выдано больше, чем нужно), мы можем сузить запрос, добавив в него предложение WHERE, вот так:

SELECT   		* 
FROM     		sales CROSS JOIN stores  
WHERE    		sales.stor_id = stores.stor_id 
GO

Этот оператор возвращает только те строки, которые соответствуют условию поиска в предложении WHERE, что уменьшит набор результатов до 21 строки. Из-за предложения WHERE перекрестное соединение работает как внутреннее соединение (т.е. возвращаться будут лишь строки, соответствующие условию поиска). Запрос, показанный в последнем примере, возвращает строки из таблицы sales, соединенные со строками из таблицы stores, имеющими совпадающие значения stor_id. Строки, у которых нет совпадений, не возвращаются.

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

SELECT    		sales.*, stores.city 
FROM      		sales CROSS JOIN stores 
WHERE     		sales.stor_id = stores.stor_id 
GO

Этот запрос возвращает все колонки из таблицы sales (продажи), к которым добавлена колонка city ("город) из таблицы stores, для строк с одинаковыми значениями stor_id. Фактически, в набор результатов будет включены названия городов для магазинов, в которых проводились продажи, присоединенные к строкам из таблицы sales, имеющим значения stor_id, совпадающие со значениями stor_id из таблицы stores.

Ниже приведен еще один пример запроса, не имеющий символа "*" (из таблицы sales извлекается только колонка stor_id):

SELECT    		sales.stor_id, stores.city 
FROM      		sales CROSS JOIN stores 
WHERE     		sales.stor_id = stores.stor_id 
GO
Алиасы таблиц

Вы уже видели несколько примеров, в которых применялись алиасы имен таблиц (слово алиас означает замена имени, псевдоним). Ключевое слово AS является необязательным, т.е. "FROM имя_таблицы AS алиас" будет работать точно так же, как и "FROM имя_таблицы алиас". Давайте вернемся к запросу, приведенному в качестве примера в разделе "Правые внешние соединения", в котором применяются алиасы:

SELECT   		s.stor_id, d.discounttype 
FROM     		stores s RIGHT OUTER JOIN discounts d 
ON       			s.stor_id = d.stor_id 
GO

Каждая из двух таблиц из этого примера имеет колонку stor_id. Чтобы различать, какую именно из этих двух колонок вы применяете в запросе, нужно перед именем колонки задать имя таблицы или алиас (отделив точкой). В нашем примере для таблицы stores применяется алиас s, а для таблицы discounts применяется алиас d. Задавая колонку мы должны ставить перед ее именем "s." или " d.", указывая тем самым, в какой таблице содержится эта колонка. Тот же самый запрос с применением ключевых слов AS будет выглядеть так:

SELECT   		s.stor_id, d.discounttype 
FROM     		stores AS s RIGHT OUTER JOIN discounts AS d 
ON       			s.stor_id = d.stor_id 
GO
Предложение INTO

Предложение INTO является первым из рассматриваемых нами необязательных предложений оператора SELECT. Пользуясь синтаксической конструкцией

SELECT <список_выборки> INTO<новая таблица>

вы можете извлекать данные из таблицы или из нескольких таблиц и помещать строки результатов в новые таблицы. Новые таблицы создаются автоматически при исполнении оператора SELECT ... INTO и определены в соответствии с колонками из списка выборки. Каждая колонка в новой таблице будет иметь тип данных, такой же, как и у исходных колонок, и будет иметь имя, заданное в списке выборки. Пользователь должен иметь полномочие на создание таблиц ( CREATE TABLE ) в той базе данных, где будет создана новая таблица (в целевой базе данных). (О том, как задавать полномочия см. лекцию 34.)

Оператор SELECT ... INTO можно применять для помещения строк как во временные, так и в постоянные таблицы. Для локальных временных таблиц (видимых только для текущего соединения или пользователя) вы должны поместить перед именем таблицы символ "#". Для глобальных временных таблиц (видимых для всех пользователей) вы должны поместить перед именем таблицы два символа "#" (т.е. "##"). Временная таблица автоматически уничтожается после того, как все пользователи, которые с ней работают, отсоединятся от SQL Server. Чтобы помещать данные в постоянную таблицу, не нужно применять префикс целевых таблиц, но для целевой базы данных должна быть включена настройка Select Into/Bulk Copy. Чтобы включить эту настройку для базы данных pubs, вы можете выполнить такой оператор OSQL:

sp_dboption pubs, "select into/bulkcopy", true 
GO

Для включения этой настройки можно также применить SQL Server Enterprise Manager, вот так:

  1. Нажмите правой кнопкой мыши на имя базы данных pubs в любой панели Enterprise Manager и выберите Properties в контекстном меню. Появится окно свойств базы данных pubs (pubs Properties) (рис. 14.1). (Наверное, вы его помните, оно было в лекции 9, когда мы создавали базу данных и задавали настройки для роста файла.)

    Вкладка General окна свойств базы данных


    Рис. 14.1.  Вкладка General окна свойств базы данных

  2. Нажмите на вкладку Options (рис. 14.2) и выберите в ниспадающем списке Model опцию Bulk-Logged. Остальные настройки не трогайте. Нажмите OK.

     Вкладка Options окна свойств базы данных


    Рис. 14.2.  Вкладка Options окна свойств базы данных

  3. Ниже приведен пример запроса, в котором оператор SELECT ... INTO применяется для создания новой постоянной таблицы emp_info (информация о сотрудниках), в которой содержатся имена, фамилии и описания должностных обязанностей сотрудников (эта информация извлекается из базы данных pubs):
SELECT   		employee.fname, employee.lname, jobs.job_desc  
INTO     		emp_info 
FROM     		employee, jobs 
WHERE    		employee.job_id = jobs.job_id 
GO

Таблица emp_info будет иметь три колонки – fname, lname и job_desc, типы данных которых будут такими же, как и у колонок, заданных в исходных таблицах (employee и jobs). Если вы хотите, чтобы новая таблица была локальной временной таблицей, то перед ее именем надо поместить символ "#" (вот так: #emp_info), а чтобы новая таблица была глобальной временной таблицей, поместите перед ее именем "##" (вот так: ##emp_info).

Предложение WHERE и условия поиска

Чтобы ограничить количество строк, выдаваемых в ответ на запрос, вы можете применить предложение WHERE. В этом разделе мы расскажем о многих операциях, применимых в условиях поиска.

Примечание. Условия поиска применяются не только в предложениях WHERE операторов SELECT, но и в операторах UPDATE и DELETE. (Об операторах UPDATE и DELETE см. лекцию 20.)

Давайте сначала договоримся об используемой терминологии. Условие поиска (search condition) может содержать произвольное количество предикатов (predicates), соединенных логическими операциями (logical operators) AND, OR и NOT (И, ИЛИ и НЕ). Предикаты –это выражения, возвращающие значения TRUE, FALSE или UNKNOWN (ИСТИНА, ЛОЖЬ или НЕИЗВЕСТНО). Выражение (expression) может быть именем колонки, константой, скалярной функцией (т.е. функцией, возвращающей одно значение), переменной, скалярным подзапросом (т.е. запросом, возвращающим одну колонку), либо комбинацией этих элементов, соединенных операциями. В этом разделе нашей книги термин "выражение" применяется также и к предикатам.

Операции сравнения

В выражениях можно использовать операции сравнения (comparison operators), перечисленные в табл. 14.1.

Таблица 14.1. Операции сравнения
ОперацияПроверяемое условие
=Проверяется равенство двух выражений
<>Проверяется неравенство двух выражений
!=Проверяется неравенство двух выражений (то же самое, что и <> )
>Проверяется, что первое выражение больше второго
>=Проверяется, что первое выражение больше второго или равно ему
!>Проверяется, что первое выражение не больше второго
<Проверяется, что первое выражение меньше второго
<=Проверяется, что первое выражение меньше второго или равно ему
!<Проверяется, что первое выражение не меньше второго

В простом предложении WHERE может производиться сравнение двух выражений при помощи операции сравнения на равенство (=). Ниже приведен пример оператора SELECT, проверяющего значения в колонке lname для всех строк (а эти значения имеют тип данных char) и возвращающего TRUE, если это значение равно "Latimer" (в набор результатов будут включены строки, для которых возвращается значение TRUE ):

SELECT   		* 
FROM     		employee 
WHERE    		lname = "Latimer"
GO

Запрос, приведенный в этом примере, вернет одну строку. Имя Latimer должно быть задано в кавычках, потому что оно является текстовой строкой.

Примечание. По умолчанию, SQL Server допускает применение как символов одинарных кавычек ('...'), так и символов двойных кавычек ("..."), т.е. можно применять и 'Latimer', и "Latimer". В нашей книге в примерах во избежание путаницы применяются только символы двойных кавычек. Если вы хотите использовать в качестве имени объекта зарезервированное ключевое слово и использовать в качестве литералов (текстовых констант) только одиночные кавычки, то примените опцию SET QUOTED_IDENTIFIER. Установите для этой опции значение TRUE (по умолчанию установлено значение FALSE ).

В следующем запросе применяется операция неравенства ( <> ), на этот раз по отношению к колонке job_id, имеющей тип данных integer:

SELECT   		job_desc 
FROM     		jobs 
WHERE    		job_id <> 1 
GO

Этот запрос выдает текст с описанием должностных обязанностей из строк таблицы jobs, имеющих значения job_id, не равные 1. Будет выдано 13 строк. Если в строке содержится значение NULL, то оно считается не равным ни 1, ни какому- либо другому значению, поэтому будут выведены и строки null-значениями.

Логические операции

Логические операции (logical operators) AND и OR проверяют два выражения и, в зависимости от их значений, возвращают булево значение TRUE, FALSE или UNKNOWN. Операция NOT выдает булево значение, противоположное значению выражения, следующего за ним. Значения, возвращаемые операциями AND, OR и NOT, показаны в таблицах на рис. 14.3. Таблицами для операций AND и OR надо пользоваться так: найдите результат первого выражения в левой колонке, найдите результат второго выражения в верхней строке, а затем посмотрите результат логической операции в ячейке на пересечении соответствующих строки и колонки. Таблица для операции NOT – совсем понятная. Результат может получить значение UNKNOWN, если среди операндов имеется значение NULL.

Значения, возвращаемые операциями AND, OR и NOT при различных значениях операндов


Рис. 14.3.  Значения, возвращаемые операциями AND, OR и NOT при различных значениях операндов

В следующем запросе в предложении WHERE имеются два выражения, соединенных логической операцией AND:

SELECT   		job_desc, min_lvl, max_lvl 
FROM     		jobs  
WHERE    		min_lvl 	>= 100 AND 
         			max_lvl 	<= 225 
GO

Как видно из таблицы (рис. 14.3), операция AND возвращает значение TRUE, когда оба условия возвращают TRUE. Этот запрос вернет четыре строки.

В следующем запросе операция OR применяется для поиска издателей из Вашингтона (федеральный округ Колумбия) и из Массачусетса. Будут возвращены строки, для которых значение TRUE явилось результатом хотя бы одного из условий.

SELECT   		p.pub_name, p.state, t.title 
FROM     		publishers p, titles t 
WHERE    		p.state = "DC" OR 
         			p.state = "MA" AND 
         			t.pub_id = p.pub_id 
GO

Этот запрос вернет 23 строки.

Операция NOT возвращает просто отрицание булева значения выражения, следующего за ним. Например, чтобы получить список всех названий книг, у которых авторские отчисления составляют не менее 20%, можно применить операцию NOT:

SELECT   		t.title, r.royalty 
FROM     		titles t, roysched r 
WHERE    		t.title_id = r.title_id AND NOT 
         			r.royalty  < 20 
GO

Этот запрос выдаст 18 названий книг, у которых авторские отчисления составляют 20% или более.

Другие ключевые слова

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

LIKE. Ключевое слово LIKE применяется для поиска по соответствию шаблону. Соответствие шаблону (pattern matching) проверяется для двух операндов условия поиска – сопоставляемого выражения (match expression) и шаблона (pattern), задающего условие поиска. При этом используется такой синтаксис:

<сопоставляемое_выражение> LIKE <шаблон>

Если сопоставляемое выражение соответствует шаблону, то возвращается булево значение TRUE, а если нет, то возвращается FALSE. Сопоставляемое выражение должно иметь тип данных character string, в противном случае SQL Server преобразует его в данные, имеющие тип character string, если это возможно.

Шаблоны являются строковыми выражениями (string expressions), т.е. строками, состоящими из символов (characters) и метасимволов (wildcard characters). Метасимволы – это символы, имеющие особый смысл при использовании внутри строковых выражений. Метасимволы, которые можно применять в шаблонах, перечислены в табл. 14.2.

Таблица 14.2. Метасимволы T-SQL
МетасимволОписание
%Символ процента соответствует строке из нескольких символов (в том числе, пустой строке и строке из одного символа)
_Символ подчеркивания соответствует любому одному символу
[]Метасимвол диапазона соответствует любому одному символу из заданного диапазона или набора символов. Например, [m-p] или [mnop] соответствуют любому из символов m, n, o или p
[^]Метасимвол "не в диапазоне" соответствует любому одному символу, не входящему в диапазон или набор символов. Например, [^m-p] или [^mnop] соответствуют любому из символов, кроме символов m, n, o или p

Чтобы лучше понять применение ключевого слова LIKE и метасимволов, рассмотрим несколько примеров. Если нужно найти в таблице authors все фамилии, начинающиеся с буквы S, то можно воспользоваться таким запросом с метасимволом %:

SELECT  		au_lname 
FROM     		authors 
WHERE    		au_lname LIKE "S%"
GO

Набор результатов может быть, например, таким:

au_lname 
-----------
Smith 
Straight 
Stringer

В этом запросе "S%" означает, что нужно возвращать все строки с фамилиями, первой буквой которых будет S, а за ней может следовать произвольное количества букв.

Примечание. Примеры данного раздела предполагают, что вы применяете стандартный порядок сортировки – Dictionary Order, Case-Insensitive (лексикографический, нечувствительный к регистру). Если вы зададите другой порядок сортировки, то выдаваемые результаты могут измениться, однако принцип работы операции LIKE останется прежним.

Чтобы извлечь информацию об авторе, идентификатор которого начинается с числа 724, и, зная, что все идентификаторы авторов имеют формат как у номеров социального страхования (три цифры, тире, затем две цифры, затем еще тире, и затем четыре цифры), вы можете воспользоваться метасимволом "_", вот так:

SELECT   		* 
FROM     		authors 
WHERE    		au_id LIKE "724-__-____"
GO

В набор результатов попадут две строки со следующими значениями au_id: 724-08-9931 и 724-80-9391.

А теперь давайте рассмотрим пример применения метасимвола []. Чтобы получить фамилии авторов, начинающиеся на букву от A до M, можно воспользоваться метасимволом [] в сочетании с метасимволом %, вот так:

SELECT   		au_lname 
FROM     		authors 
WHERE    		au_lname LIKE "[A-M]%"
GO

Набор результатов будет содержать 14 строк с фамилиями, начинающимися на букву от A до M (или 13 строк, если пользоваться порядком сортировки, чувствительным к регистру букв).

Если в этом запросе поменять метасимвол [] на [^], то будут выданы строки, содержащие фамилии, начинающиеся на буквы вне диапазона от A до M:

SELECT   		au_lname 
FROM     		authors 
WHERE    		au_lname LIKE "[^A-M]%"
GO

Такой запрос вернет 9 строк.

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

SELECT   		au_lname 
FROM     		authors 
WHERE    		au_lname LIKE "[A-M]%" OR 
         			au_lname LIKE "[a-m]%"
GO

Имя "del Castillo" попадет в набор результатов, и это будет отличать этот запрос от запроса, чувствительного к регистру, находящего только ПРОПИСНЫЕ буквы от A до M.

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

SELECT   		title 
FROM     		titles 
WHERE    		title NOT LIKE "The %"
GO

Этот запрос вернет 15 строк.

Пользуясь ключевым словом LIKE, вы можете дать волю своей фантазии. Однако будьте осторожны и проверяйте, что ваши запросы работают именно так, как задумано. Если не поставить NOT или символ ^ там, где это надо, то набор результатов будет противоположен ожидаемому. Если не поставить в нужном месте метасимвол %, то результат тоже будет неправильным. И не забывайте о том, что первые и завершающие пробелы тоже участвуют в сопоставлении шаблону.

ESCAPE. При помощи ключевого слова ESCAPE можно задать сопоставление шаблону, содержащему сами знаки, служащие для обозначения метасимволов (т.е., сами символы ^, %, [, ] и _). Для этого вы должны задать после ключевого слова ESCAPE так называемый escape-символ, обозначающий, что символ, следующий за ним, следует понимать "как есть". Например, чтобы найти все строки из таблицы, имеющие символ подчеркивания в колонке title, можно применить такой запрос:

SELECT   		title 
FROM     		titles 
WHERE    		title LIKE "%e_%" ESCAPE "e"
GO

Этот запрос не вернет ни одной строки, потому что ни в одном названии книги нет символов подчеркивания.

BETWEEN. Ключевое слово BETWEEN используется всегда в сочетании с ключевым словом AND и задает диапазон вхождения, применяемый как условие поиска. Ниже показан его синтаксис:

<проверяемое_выражение> BETWEEN <начальное_выражение> AND <конечное_выражение>

Если проверяемое_выражение больше или равно, чем начальное_выражение, и в то же время меньше или равно, чем конечное_выражение, то результатом условия поиска является булево значение TRUE, а в противном случае результатом условия поиска является FALSE.

Ниже приведен пример запроса, в котором BETWEEN применяется для поиска названий книг с ценой от 5 до 25 долларов:

SELECT   		price, title 
FROM     		titles 
WHERE    		price BETWEEN 5.00 AND 25.00
GO

Этот запрос вернет 14 строк.

Вместе с BETWEEN тоже можно применять NOT, тогда будут искаться строки, не входящие в заданный диапазон. Например, чтобы найти названия книг с ценами вне диапазона от 20 до 30 долларов (а именно, книг дешевле 20 и дороже 30 долларов), можно было бы применить такой запрос:

SELECT   		price, title 
FROM     		titles 
WHERE    		price NOT BETWEEN 20.00 AND 30.00
GO

В конструкции с ключевым словом BETWEEN проверяемое_выражение должно иметь такой же тип данных, как и начальное_выражение и конечное_выражение.

В последнем примере колонка price (цена) имеет тип данных money, поэтому и начальное_выражение, и конечное_выражение должны быть числами, сравнимыми с типом данных money, или для них должно быть возможным неявное преобразование в этот тип данных. Вы не можете применять в качестве проверяемого выражения значение из колонки price, а для начального и конечных выражений – символьные строки (т.к. они имеют тип данных char). Если вы все-таки сделаете это, то SQL Server выдаст сообщение об ошибке.

Примечание. SQL Server при необходимости будет автоматически преобразовывать типы данных, если только возможно неявное преобразование типов данных (implicit conversion). Неявное преобразование типов данных - это автоматическое преобразование одного типа данных в другой совместимый тип данных. После такого преобразования становится возможным сравнение. Например, если колонка, имеющая тип данных smallint, сравнивается колонкой, имеющей тип данных int, то перед выполнением сравнения SQL Server неявно преобразует тип данных первой колонки к типу данных int. Если неявное преобразование типов данных не поддерживается, то вы можете применять функцию CAST или CONVERT, чтобы выполнить явное преобразование колонки. Чтобы получить схему, показывающую, какие типы данных SQL Server будет преобразовывать неявно, а для каких необходимо явное преобразование, обратитесь к предметному указателю SQL Server Books Online, для темы CAST, а затем в диалоговом окне Topics Found (Найденные темы) выберите CAST and CONVERT (T-SQL).

Мы приведем еще один пример использования ключевого слова BETWEEN, которое на этот раз применяет в качестве условия поиска текстовые строки:

SELECT   		au_lname 
FROM     		authors 
WHERE    		au_lname BETWEEN "Bennet" AND "McBadden" 
GO

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

IS NULL. Ключевое слово IS NULL используется в условиях поиска, ищущих строки, содержащие null -значение в заданной колонке. Например, чтобы найти в таблице titles названия книг, у которых нет данных в колонке notes (примечания), т.е. когда значением колонки notes является NULL, можно воспользоваться таким запросом:

SELECT   		title, notes 
FROM     		titles 
WHERE    		notes IS NULL
GO
Этот запрос выдаст такой набор результатов:
title                                  	notes 
----------------------------------------	------
The Psychology of Computer Cooking     	NULL

Как видите, null -значения в колонке notes в наборе результатов отображаются словом NULL. Это слово не является содержимым колонки, оно служит просто обозначением того, что в данной колонке находится null-значение. (Помните, в лекции 10 объяснялось, что null -значения – это неизвестные значения.)

Чтобы найти названия книг, у которых имеются данные о колонке notes (т.е., у которых значение колонки notes не является null -значением), применяйте конструкцию IS NOT NULL, вот так:

SELECT   		title, notes 
FROM     		titles 
WHERE    		notes IS NOT NULL
GO

Набор результатов будет содержать 17 строк, в каждой из которых в колонке notes будут иметься символы (один или несколько), т.е. не null -значения.

IN. Ключевое слово IN используется как условие поиска, проверяющее, не соответствует ли проверяемое выражение какому-либо из значений в подзапросе или в списке значений. Если соответствие найдено, то возвращается значение TRUE. NOT IN возвращает отрицание того, что получилось бы при применении IN, поэтому NOT IN возвратит значение TRUE, если проверяемое выражение не найдено в подзапросе или в списке значений. Используется такой синтаксис:

<проверяемое_выражение> IN (<подзапрос>)

или

<проверяемое_выражение> IN (<список_значений>)

Подзапрос – это оператор SELECT, который возвращает в наборе результатов только одну колонку. Подзапрос должен быть заключен в скобки. Список значений – это просто список из нескольких значений, разделенных запятыми и заключенный в скобки. Колонка, получающаяся как набор результатов подзапроса или список значений, должна иметь такой же тип данных, как и проверяемое выражение. Если необходимо, SQL Server выполнит неявное преобразование типов данных.

В приведенном ниже примере запроса ключевое слово IN применяется в сочетании со списком значений для поиска идентификаторов должностей для трех описаний должностных обязанностей:

SELECT   		job_id 
FROM     		jobs 
WHERE    		job_desc IN ("Operations Manager",  
                      			      "Marketing Manager", 
                      			      "Designer")
GO

В этом запросе применен такой список значений: (Operations Manager, Marketing Manager, Designer). Запрос будет возвращать идентификаторы должностей из строк, содержащих в колонке job_desc какое-либо значение из списка. Благодаря ключевому слову IN ваш запрос проще и понятней для восприятия, чем запрос, который получился, если бы вы применили две операции OR, вот такой:

SELECT   		job_id 
FROM     		jobs 
WHERE    		job_desc = "Operations Manager" OR  
        	job_desc = "Marketing Manager"  OR   
         	job_desc = "Designer"
GO

В следующем запросе ключевое слово IN используется в одном операторе дважды – первый раз с подзапросом, а второй раз – со списком значений внутри подзапроса:

SELECT   		fname, lname    	-- Внешний запрос 
FROM     		employee 
WHERE    		job_id IN (	SELECT 	job_id   -- Внутренний запрос, подзапрос 
                     				FROM   	jobs 
                   					WHERE  	job_desc IN ("Operations Manager", 
                     					"Marketing Manager", 
                     					"Designer"))
GO

Сначала будет искаться подзапрос (в нашем примере – набор значений job_id ). Значения job_id получаются как результаты подзапроса и не выводятся на экран, они используются внешним запросом как выражения для его собственного условия поиска IN. Окончательный набор результатов будет содержать имена и фамилии всех сотрудников, должности которых называются Operations Manager, Marketing Manager или Designer.

Набор результатов будет таким (запрос вернет 11 строк):

fname                		lname 
------------------------
Pedro                		Afonso 
Lesley               		Brown 
Palle                		Ibsen 
Karin                		Josephs 
Maria                		Larsson 
Elizabeth     	Lincoln 
Patricia             		McKenna 
Roland               		Mendel 
Helvetius            	Nagy 
Miguel               		Paolino 
Daniel               		Tonini

IN можно применять в сочетании с операцией NOT. Например, чтобы вернуть имена всех издательств, кроме находящихся в Калифорнии, Техасе и Иллинойсе, запустите такой запрос:

SELECT   		pub_name 
FROM     		publishers 
WHERE    		state NOT IN (	"CA", 
                       			"TX", 
                       			"IL")
GO

Этот запрос вернет пять строк, у которых значение в колонке state (штат) не является обозначением ни одного из трех штатов, указанных в списке значений. Если вы установили настройку ANSI nulls вашей базы данных на ON, то набор результатов будет содержать только три строки. Такое малое количество выданных строк произошло потому, что две из пяти строк первоначального набора результатов в качестве значения для state будут иметь NULL, а значения NULL не извлекаются при настройке ANSI nulls заданной как ON.

Чтобы узнать, какова настройка ANSI nulls для базы данных pubs, запустите следующую системную хранимую процедуру:

sp_dboption "pubs", "ANSI nulls" 
GO

Если настройка ANSI nulls задана как OFF, то измените ее на ON при помощи следующего оператора:

sp_dboption "pubs", "ANSI nulls", TRUE 
GO

А чтобы изменить настройку с ON на OFF, примените такой же оператор, но с FALSE вместо TRUE.

Дополнительная информация. Чтобы получить более подробную информацию о действии настройки ANSI nulls, найдите в предметном указателе (индексе) SQL Server Books Online "sp_dpoption", а затем в диалоговом окне найденных тем выберите sp_db_option (T-SQL). Кроме того, найдите в предметном указателе SQL Server Books Online "ANSI nulls" и нажмите в нижней части страницы на ссылку SET ANSI_NULLS, в результате чего на экране появится тема "SET ANSI_NULLS (T-SQL)".

EXISTS. Ключевое слово EXISTS используется для проверки существования строк в выводе подзапроса, указанного после него. Используется такой синтаксис:

EXISTS (<подзапрос>)

Если имеется хоть одна строка, удовлетворяющая подзапросу, то возвращается значение TRUE.

Чтобы найти имена авторов, у которых имеются опубликованные книги, можно применить такой запрос:

SELECT   		au_fname, au_lname 
FROM      		authors  
WHERE     		EXISTS (	SELECT au_id 
                  			FROM   titleauthor 
                  			WHERE  titleauthor.au_id = authors.au_id)
GO

Авторы, имена которых имеются в таблице authors, но не имеющие опубликованных книг в таблице titleauthor, выбраны не будут. Если в подзапросе не будет найдено ни одной строки, то набор результатов внешнего запроса будет пустым (будет найдено ноль строк).

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

Дополнительная информация. Для дополнительной информации о ключевых словах CONTAINS и FREETEXT, обратитесь к SQL Server Books Online, к темам "CONTAINS" и "FREETEXT" в предметном указателе.
Предложение GROUP BY

Предложение GROUP BY применяется после предложения WHERE и означает, что строки набора результатов должны быть сгруппированы в соответствии с данными в колонке группировки. Если в предложении SELECT используется агрегатная функция, то для каждой группы вычисляется и отображается в выводе итоговое агрегатное значение. Агрегатная функция выполняет вычисления и возвращает значение. (Про агрегатные функции см. раздел "Агрегатные функции" далее.)

Примечание. В предложении GROUP BY в качестве колонок группировки должны быть заданы все колонки из списка выборки (кроме колонок, применяемых для агрегатных функций), в противном случае SQL Server выдаст сообщение об ошибке. Если бы это правило не соблюдалось, результаты нельзя было бы выдать в разумном виде, поскольку колонка, заданная в GROUP BY, должна группировать каждую колонку в списке выборки.

Предложение GROUP BY особенно полезно, когда в предложении SELECT имеется агрегатная функция. Давайте рассмотрим пример оператора SELECT, применяющего предложение GROUP BY для получения сведений об общем количестве проданных книг для каждого из названий книг:

SELECT   		title_id, SUM(qty) 
FROM     		sales 
GROUP 		BY title_id
GO

Будет выдан набор результатов, содержащий 16 строк:

title_id 
----------------------
BU1032            			15 
BU1111            			25 
BU2075            			35 
BU7832            			15 
MC2222            			10 
MC3021            			40 
PC1035            			30 
PC8888            			50 
PS1372            			20 
PS2091           			108 
PS2106            			25 
PS3333            			15 
PS7777            			25 
TC3218            			40 
TC4203            			20 
TC7777            			20

Этот запрос не содержит предложения WHERE – оно не нужно. Набор результатов состоит из колонки title_id (идентификатор названия книги) и итоговой колонки, не имеющей заголовка. Для каждого отдельного названия книги будет подсчитано общее количество экземпляров этой книги, это число будет показано в итоговой колонке. Например, пусть значение BU1032 колонки title_id встретится в таблице sales (продажи) два раза, первый раз оно будет обозначать продажу 5 экземпляров книги (колонка qty будет иметь значение 5), а во второй раз будет обозначать продажу книг по другому заказу, на этот раз будет продано 10 экземпляров книги. Агрегатная функция SUM произведет суммирование этих двух продаж, отсюда и получится, что общее количество проданных экземпляров равно 15, что и будет показано в итоговой колонке. Если вы хотите, чтобы итоговая колонка имела заголовок, воспользуйтесь ключевым словом AS, вот так:

SELECT      		title_id, SUM(qty) AS "Колич прод"
FROM         		sales 
GROUP BY 	title_id
GO

Теперь набор результатов станет показывать заголовок для итоговой колонки (в наборе результатов содержится 16 строк):

itle_id  		Колич прод
----------------------------
BU1032            				15 
BU1111            				25 
BU2075            				35 
BU7832            				15 
MC2222            				10 
MC3021            				40 
PC1035            				30 
PC8888            				50 
PS1372            				20 
PS2091           				108 
PS2106            				25 
PS3333            				15 
PS7777            				25 
TC3218            				40 
TC4203            				20 
TC7777            				20

Возможна вложенная ("гнездовая") группировка, при которой в предложении GROUP BY задается более одной колонки. При вложенной группировке набор результатов будет группироваться по каждой из колонок, участвующих в группировке, в том порядке, в котором были заданы колонки. Например, чтобы узнать средние цены книг, сгруппированных сначала по типу, а затем по издательству, можно выполнить такой запрос:

SELECT   		type, pub_id, AVG(price) AS "Средняя цена"
FROM     		titles 
GROUP BY 	type, pub_id
GO
В набор результатов попадут 8 строк:
type         		pub_id 	                 Средняя цена
--------------------------------------------------
business     		0736                       		2.99 
psychology   		0736                      		11.48 
UNDECIDED    		0877                       		NULL 
mod_cook     		0877                      		11.49 
psychology   		0877                      		21.59 
trad_cook    		0877                      		15.96 
business     		1389                      		17.31 
popular_comp 	    1389                      		21.48

Обратите внимание, что книги, имеющие тип psychology и business, попали в набор результатов более одного раза, потому что они сгруппированы для разных идентификаторов издательств. Значение NULL, показанное в качестве средней цены книг типа UNDECIDED (нераспределенные), отражает тот факт, что для книг этого типа в таблицу не были введены их цены, поэтому невозможно вычислить среднюю цену.

Предложение GROUP BY можно применять с необязательным ключевым словом ALL, означающим, что в набор результатов должны быть включены все группы, даже не соответствующие условию поиска. Группы, не имеющие строк, соответствующих условию поиска, будут содержать в итоговой колонке значение NULL, поэтому их будет сразу видно. Например, чтобы узнать среднюю цену для книг, имеющих авторские отчисления 12%, а также показать в наборе результатов строки для книг, имеющих авторские отчисления не 12% (у них в итоговой колонке будет значение NULL), группируя книги сначала по типам, а затем по идентификатору издательства, выполните такой запрос:

SELECT   		type, pub_id, AVG(price) AS "Средняя цена" 
FROM     		titles 
WHERE    		royalty = 12 
GROUP BY 	ALL type, pub_id
GO

В набор результатов попадут 8 строк:

type         				pub_id 	Средняя цена
-------------------------------------------------
business     		0736                       		NULL 
psychology   		0736                      		10.95 
UNDECIDED    		0877                       		NULL 
mod_cook     		0877                      		19.99 
psychology   		0877                       		NULL 
trad_cook    		0877                       		NULL 
business     		1389                       		NULL 
popular_comp 	    1389                       		NULL

Будут выведены строки для всех типов книг, но для типов книг, у которых не имеется книг с 12-процентными авторскими отчислениями, появится NULL.

Если мы уберем ключевое слово ALL, то набор результатов будет содержать информацию только для тех типов книг, у которых имеются книги с 12-процентными авторскими отчислениями. Набор результатов будет содержать 2 строки и будет таким:

type         				pub_id 	Средняя цена
---------------------------------------------------
psychology   		0736                      		10.95 
mod_cook     		0877                      		19.99

Предложение GROUP BY часто применяется в сочетании с предложением HAVING, про которое мы сейчас вам расскажем.

Предложение HAVING

Предложение HAVING применяется, чтобы задать условия поиска для групп или для агрегатной функции. Предложение HAVING чаще всего используется после предложения GROUP BY в случаях, когда условие поиска должно проверяться уже после группировки результатов. Если условие поиска можно было бы проверить до группировки, то гораздо эффективней было бы поместить его в предложение WHERE, а не пользоваться предложением HAVING (за счет этого уменьшилось бы количество строк, участвующих в группировке). Если предложение GROUP BY отсутствует, то HAVING может применяться только в отношении агрегатной функции в списке выборки. В этом случае предложение HAVING действует точно так же, как предложение WHERE. Если попытаться использовать HAVING как-нибудь по-другому, то SQL Server выдаст сообщение об ошибке.

Предложение HAVING имеет такой синтаксис:

HAVING <условие_поиска>

Здесь условие_поиска имеет такой же смысл, что и условие поиска. (См. раздел "Предложение WHERE и условие поиска" выше в данной лекции). Единственным различием между предложениями HAVING и WHERE является то, что предложение HAVING может содержать агрегатную функцию в условии поиска, а предложение WHERE – нет.

Примечание. Агрегатные функции можно применять в предложениях SELECT и HAVING, но не в предложении WHERE.

Ниже приведен пример запроса, использующего предложение HAVING для поиска книг, сгруппированных по типам и по издательствам, средняя цена на которые превышает 15 долларов:

SELECT   		type, pub_id, AVG(price) AS "Средняя цена"
FROM     		titles 
GROUP           BY type, pub_id 
HAVING   		AVG(price) > 15.00 
GO

В набор результатов попадут 4 строки:

type         		pub_id 	  Средняя цена
--------------------------------------------------
psychology   		0877           		21.59 
trad_cook    		0877                15.96 
business     		1389                17.31 
popular_comp 	    1389                21.48

В предложениях HAVING можно употреблять логические операции. Ниже показан несколько измененный последний пример, в нем теперь применяется логическая операция AND:

SELECT   		type, pub_id, AVG(price) AS "Средняя цена" 
FROM     		titles 
GROUP BY 	type, pub_id 
HAVING   		AVG(price) >= 15.00 AND 
         			AVG(price) <= 20.00
GO

В набор результатов попадут 2 строки:

type         	pub_id 	  Средняя цена
--------------------------------------------------
trad_cook    	0877      15.96 
business     	1389      17.31

Такой же результат получится, если вместо AND применить предложение BETWEEN, вот так:

SELECT   	type, pub_id, AVG(price) AS "Средняя цена"
FROM     	titles 
GROUP BY 	type, pub_id 
HAVING   	AVG(price) BETWEEN 15.00 AND 20.00
GO

Чтобы применять HAVING без предложения GROUP BY, нужно иметь агрегатную функцию в списке выборки и в предложении HAVING. Например, чтобы выводить сумму цен на книги типа mod_cook (современная кулинария), только в тех случаях, когда эта сумма будет превышать 20 долларов, можно применять такой запрос:

SELECT   		SUM(price) 
FROM     		titles 
WHERE    		type = "mod_cook"
HAVING   		SUM(price) > 20
GO

Если в этом запросе поместить выражение SUM(price) > 20 в предложение WHERE, то SQL Server выдаст сообщение об ошибке, т.к. в предложениях WHERE агрегатные функции применять нельзя.

Примечание. Помните, что предложение HAVING можно применять, только когда вы добавляете условие поиска, проверяющее результаты группировки при помощи предложения GROUP BY или проверяющее результат агрегатной функции. В остальных случаях условия поиска следует задавать в предложениях WHERE.
Предложение ORDER BY

Предложение ORDER BY применяется, чтобы задать порядок, в котором должны сортироваться строки набора результатов. Пользуясь ключевыми словами ASC и DESC, вы можете задать как возрастающий (ascending, от меньших значений к большим), так и убывающий (descending, от больших значений к меньшим) порядок сортировки. Если порядок сортировки не указать, то по умолчанию будет применяться возрастающий порядок сортировки. В предложении ORDER BY можно задать более одной колонки. Результаты будут сортироваться по первой из заданных колонок, но если в первой колонке встретятся строки с одинаковыми значениями, то они будут сортироваться в порядке возрастания значения из второй колонки, и т.д. Как вы увидите из материала данного раздела, такая сортировка особенно полезна при использовании вместе с предложением GROUP BY. Давайте сначала рассмотрим пример, в котором предложение ORDER BY работает с одной колонкой и сортирует список авторов по фамилии , в возрастающем порядке:

SELECT   	au_lname, au_fname 
FROM     	authors 
ORDER BY 	au_lname ASC
GO

Набор результатов будет отсортирован в алфавитном порядке по фамилиям авторов. Не забудьте, что чувствительность сортировки к регистру букв, заданная вами при инсталляции SQL Server, повлияет на обработку фамилий вроде "del Castillo".

Если вы хотите отсортировать результаты для более чем одной колонки, то просто добавьте в предложение ORDER BY имена колонок, разделяя их запятыми. Ниже приведен пример запроса, выдающего идентификаторы должностей, фамилии и имена сотрудников, сортирующего вывод сначала по идентификатору должности, затем по фамилии, а затем по имени:

SELECT   	job_id, lname, fname 
FROM     	employee 
ORDER BY 	job_id, lname, fname
GO

Набор результатов (43 строки) будет выглядеть так:

job_id lname                          			fname 
-----------------------------------
     2 Cramer                         		Philip 
     3 Devon                          		Ann 
     4 Chang                          		Francisco 
     5 Henriot                        		Paul 
     5 Hernadez                       		Carlos 
     5 Labrune                        		Janine 
     5 Lebihan                        		Laurence 
     5 Muller                         		Rita 
     5 Ottlieb                        		Sven 
     5 Pontes                         		Maria 
     6 Ashworth                       		Victoria 
     6 Karttunen                      		Matti 
     6 Roel                           		Diego 
     6 Roulet                         		Annette 
     7 Brown                          		Lesley 
      7 Ibsen                          		Palle 
     7 Larsson                        		Maria 
     7 Nagy                           		Helvetius 
     . .                              .
     . .                              .
     . .                              .   
    13 Accorti                        		Paolo 
    13 O’Rourke                       		Timothy 
    13 Schmitt                        		Carine 
    14 Afonso                         		Pedro 
    14 Josephs                       		Karin 
    14 Lincoln                        		Elizabeth

Сортировка по именам (не фамилиям) людей в этом запросе не влияет на набор результатов, потому что там нет даже двух людей с одинаковыми фамилиями и идентификаторами должности.

А теперь давайте рассмотрим предложение ORDER BY, работающее совместно с предложением GROUP BY и агрегатной функцией:

SELECT   	type, pub_id, AVG(price) AS "Средняя цена" 
FROM     	titles 
GROUP BY 	type, pub_id 
ORDER BY 	Средняя цена 
GO

Набор результатов (8 строк) будет выглядеть так:

type         				pub_id 	Средняя цена
-------------------------------------------------
UNDECIDED    		0877                       		NULL 
business     		0736                       		2.99 
business     		1389                      		17.31 
mod_cook     		0877                      		11.49 
popular_comp 	    1389                      		21.48 
psychology   		0736                      		11.48 
psychology   		0877                      		21.59 
trad_cook    		0877                      		15.96

Результаты отсортированы в алфавитном порядке (возрастающем) по типу книг. Также обратите внимание, что в этом запросе в предложении GROUP BY должны присутствовать и type, и pub_id, потому что они не являются частью агрегатной функции. Если вы не зададите колонку pub_id в предложении GROUP BY, то SQL Server выдаст сообщение об ошибке (рис. 14.4).

В предложении ORDER BY нельзя применять агрегатные функции и подзапросы. Однако если вы зададите алиас агрегатной функции в предложении SELECT, то его применить можно в предложении ORDER BY, вот так:

SELECT   	type, pub_id, AVG(price) AS "Средняя цена" 
FROM     	titles 
GROUP 		BY type, pub_id 
ORDER 		BY type
GO

 Сообщение об ошибке, которое появится, если не задать pub_id в предложении GROUP BY


увеличить изображение

Рис. 14.4.  Сообщение об ошибке, которое появится, если не задать pub_id в предложении GROUP BY

Набор результатов (8 строк) будет выглядеть так:

type         				pub_id 	Средняя цена 
-------------------------------------------------
UNDECIDED    		0877                       		NULL 
business     		0736                       		2.99 
business     		1389                      		17.31 
mod_cook     		0877                      		11.49 
popular_comp 	    1389                      		21.48 
psychology   		0736                      		11.48 
psychology   		0877                      		21.59 
trad_cook    		0877                      		15.96

Теперь результаты будут отсортированы по средней цене, причем NULL рассматривается как самое маленькое из значений, поэтому оно отображается в самой верхней строке списка.

Примечание. Точные результаты применения предложения ORDER BY зависят от настроек сортировки, заданных при инсталляции SQL Server.
Операция UNION

UNION считается не предложением (clause), а операцией (operator). Она используется для объединения результатов двух или нескольких запросов в один набор результатов. Применяя UNION, вы должны соблюдать два следующих правила:

Колонки, перечисленные в операторах SELECT, объединенные при помощи UNION, сопоставляются друг с другом следующим образом: первая колонка из первого оператора SELECT будет соответствовать первым колонкам из всех последующих операторов SELECT, вторая колонка будет соответствовать вторым колонкам из всех последующих операторов SELECT, и т.д. Поэтому во всех операторах SELECT, объединенных при помощи UNION, должно быть одинаковое количество колонок, что гарантирует однозначное сопоставление.

Кроме того, соответственные колонки должны иметь совместимые типы данных. Это значит, что соответственные колонки должны иметь либо одинаковые типы данных, либо SQL Server сможет выполнить неявное преобразование одного типа данных в другой. Ниже дан пример применения операции UNION, соединяющей наборы результатов двух операторов SELECT, выдающих колонки city и state из обеих таблиц publishers и stores:

SELECT   		city, state 
FROM     		publishers 
UNION    		SELECT 	city, state 
         			FROM   	stores
GO

Набор результатов (14 строк) будет таким:

city               state 
-------------------------
Fremont              	CA 
Los Gatos               CA 
Portland             	OR 
Remulade             	WA 
Seattle              	WA 
Tustin               	CA 
Chicago              	IL 
Dallas               	TX 
Munchen              	NULL 
Boston               	MA 
New York             	NY 
Paris                	NULL 
Berkeley             	CA 
Washington           	DC
Примечание. Результаты запросов-примеров из данного раздела могут отличаться в зависимости от применяемых вами настроек сортировки SQL Server.

Две эти колонки, city и state, в обеих таблицах имеют одинаковый тип данных (char), поэтому преобразование типа не потребуется. Заголовки колонок для набора результатов операции UNION берутся из первого оператора SELECT. Если вы хотите создать алиас для заголовка, то поместите его в первый оператор SELECT, вот так:

SELECT   		city AS "Все города", state AS "Все штаты"
FROM     		publishers 
UNION    		SELECT 	city, state 
         			FROM   	stores
GO

Набор результатов (14 строк) будет таким:

Все города           			Все штаты 
------------------------------------
Fremont              			CA 
Los Gatos            			CA 
Portland             			OR 
Remulade             			WA 
Seattle              			WA 
Tustin               			CA 
Chicago              			IL 
Dallas               			TX 
Munchen              			NULL 
Boston               			MA 
New York             			NY 
Paris                			NULL 
Berkeley             			CA
Washington           			DC

При объединении наборов результатов вовсе не обязательно указывать в обоих предложениях SELECT одни и те же колонки. Например, вы можете выбрать колонки city и state из таблицы stores и колонки city и country из таблицы publishers, вот так:

SELECT   		city, country
FROM     		publishers 
UNION    		SELECT 	city, state 
         			FROM   	stores
GO

Набор результатов (14 строк) будет таким:

city                country 
----------------------------
Fremont             CA 
Los Gatos           CA 
Portland            OR 
Remulade            WA 
Seattle             WA 
Tustin              CA 
New York            USA 
Paris               France 
Boston              USA 
Munchen             Germany 
Washington          USA 
Chicago             USA 
Berkeley            USA 
Dallas              USA

В этом наборе результатов верхние шесть строк берутся из набора результатов запроса, применяемого к таблице stores, а последние восемь строк берутся из набора результатов запроса, применяемого к таблице publishers. Колонка state имеет тип данных char, а колонка country имеет тип данных varchar. Так как два этих типа данных являются совместимыми, то SQL Server выполнит неявное преобразование таким образом, чтобы обе колонки стали иметь тип varchar. Колонки итогового набора результатов имеют заголовки city и country, так, как указано в первом операторе SELECT, но здесь было бы лучше, чтобы вторая колонка имела заголовок не country (страна), а State or Country (штат или страна).

Единственное ключевое слово, которое можно применять вместе с UNION – это необязательное ключевое слово ALL. Если вы примените его, то в набор результатов будут включены также все повторяющиеся строки (другими словами, в набор результатов будут включены полностью все строки). Если ключевое слово ALL не применяется, то по умолчанию из набора результатов будут исключены все дублирующиеся строки.

ORDER BY можно применять не в каждом операторе SELECT объединения, а только в самом последнем. Благодаря этому ограничению, итоговый набор результатов будет отсортирован только один раз сразу для всех результатов. С другой стороны, вы можете применять GROUP BY и HAVING в отдельных операторах, так как они влияют только на отдельные наборы результатов, а не на итоговый набор результатов. Ниже приведен пример, иллюстрирующий объединение результатов двух операторов SELECT, каждый из которых имеет предложение GROUP BY:

SELECT   		type, COUNT(title) AS "Number of Titles"  
FROM     		titles 
GROUP BY 	type 
UNION    		SELECT   		pub_name, COUNT(titles.title) 
         			FROM     		publishers, titles 
         			WHERE    		publishers.pub_id = titles.pub_id 
         			GROUP BY 	pub_name 
GO

Набор результатов (9 строк) будет таким:

type                     Number of Titles 
————————————————————     ———————— 
Algodata Infosystems     6 
Binnet & Hardley     7 
New Moon Books           5 
psychology               5 
mod_cook                 2 
trad_cook                3 
popular_comp             3 
UNDECIDED                1 
business                 4

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

Операцию UNION можно применять и более чем для двух операторов SELECT. Создавая объединение, не забывайте следить, чтобы все колонки и типы данных в запросах были взаимно согласованными.

Дополнительная информация. Документацию, относящуюся ко всем допустимым ключевым словам и аргументам T-SQL, вы найдете в SQL Server Books Online.

Функции T-SQL

Теперь, когда вы хорошо знакомы с основными предложениями, применяемыми в операторе SELECT (немного дополнительной информации вы еще узнаете в лекции 20), давайте рассмотрим некоторые функции T-SQL, которые можно применять в предложении SELECT. Эти функции позволяют добиться большей гибкости при создании запросов; они группируются по нескольким категориям, например, относящиеся к таким вещам, как конфигурация, курсор, дата и время, безопасность, система, системная статистика, текст и изображения, математика, набор строк, строки, агрегатные функции. Функции T-SQL выполняют вычисления, преобразования, какие-либо действия, или возвращают некоторую информацию. Имеется много функций, но в этом разделе мы рассмотрим только общеупотребительные агрегатные функции.

Дополнительная информация. Дополнительную информацию об этой и других категориях функций вы найдете, открыв в SQL Server Books Online вкладку Index (Предметный указатель) и открыв тему "functions".
Агрегатные функции

Как уже говорилось, агрегатные функции выполняют вычисления над набором значений и возвращают одно значение. Агрегатные функции могут быть заданы в списке выборки и чаще всего применяются в случаях, когда оператор содержит предложение GROUP BY. В некоторых из приведенных ранее примеров использовались агрегатные функции AVG и COUNT. Список имеющихся агрегатных функций перечислен в табл. 14.3.

Таблица 14.3. Агрегатные функции
ФункцияОписание
AVGВозвращает среднее арифметическое для значений выражения; null-значения игнорируются
COUNTВозвращает количество элементов в выражении (равное количеству строк)
COUNT_BIGТо же самое, что и COUNT, но результат имеет тип данных bigint, а не int
GROUPINGВозвращает специальную дополнительную колонку; применяется, только когда предложение GROUP BY содержит операцию CUBE или ROLLUP. Для дополнительной информации откройте в SQL Server Books Online вкладку Index (Предметный указатель) и откройте тему "GROUPING keyword"
MAXВозвращает максимальное значение из значений выражения
MINВозвращает минимальное значение из значений выражения
STDEVВозвращает статистическое стандартное отклонение (statistical standard deviation) для всех величин выражения. Эта функция предполагает, что выражения, используемые в расчете, являются образцом всей совокупности данных
STDEVPВозвращает статистическое стандартное отклонение для всех величин выражения. Эта функция предполагает, что выражения, используемые в расчете, являются всей совокупностью данных
SUMВозвращает сумму всех значений выражения
VARВозвращает статистическое отклонение (statistical variance) для всех значений из выражения. Эта функция предполагает, что выражения, используемые в расчете, являются образцом всей совокупности данных
VARPВозвращает статистическое отклонение для всех значений из выражения. Эта функция предполагает, что выражения, используемые в расчете, являются всей совокупностью данных

Функция COUNT применяется специальным образом: она подсчитывает все строки таблицы. Для этого нужно после COUNT поместить символ-звездочку в скобках, вот так

SELECT   		COUNT(*) 
FROM     		publishers 
GO

Набор результатов будет таким:

----------------------
         				8

Функции AVG, COUNT, MAX, MIN и SUM могут применяться с необязательными ключевыми словами ALL или DISTINCT. Для каждой из этих функций ALL означает, что функция должна применяться ко всем значениям выражения, а DISTINCT означает, что повторяющиеся значения должны участвовать в расчете только по одному разу. По умолчанию применяется опция ALL.

Как правило, применяются понятные названия агрегатных функций. Ниже приведен пример, в котором используются сразу две агрегатные функции MAX и MIN, здесь вычисляется разница цен между самой дорогой и самой дешевой книгами:

SELECT   		MAX(price) - MIN(price) AS "Разница цен" 
FROM     		titles 
GO

Набор результатов будет таким:

Разница цен 
------------------------------
                   					19.96

В следующем примере функция SUM применяется, чтобы найти общее количество книг заказанных в каждом из магазинов:

SELECT   		stores.stor_name, SUM(sales.qty) AS "Заказано всего" 
FROM     		sales, stores 
WHERE    		sales.stor_id = stores.stor_id 
GROUP BY 	stor_name
GO

Набор результатов (6 строк) будет таким:

stor_name                                     Заказано всего 
--------------------------------------------------------
Barnum’s                                      125 
Bookbeat                                      80 
Doc-U-Mat: Quality Laundry and Books          130 
Eric the Read Books                           8 
Fricative Bookshop                            60 
News & Brews                                  90
Примечание. Помните, что в SQL Server имеется множество разновидностей функций. Если вам необходимо выполнять какие-либо специфические действия, обратитесь к SQL Server Books Online и посмотрите, какие встроенные функции уже имеются.

Другие применения оператора SELECT

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

При помощи оператора SELECT вы можете, исполняя транзакцию или хранимую процедуру, присвоить значение локальной переменной, хотя для этого лучше применять оператор SET. Локальные переменные должны быть обозначены символом @ в начале имени. Например, можно присвоить значение 0 локальной переменной @count при помощи оператора SET, вот так:

SET  		@count = 0 
GO

Вы можете применять оператор SELECT для присваивания локальным переменным значений, получаемых как результат запроса. Например, чтобы присвоить локальной переменной @price значение максимальной величины из имеющихся в колонке price, примените такой оператор:

SELECT   		@price = MAX(price) 
FROM     		items 
GO

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

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

SELECT   		GETDATE()
GO

Функция GETDATE не имеет никаких параметров, но скобки нужны все равно.

Заключение

В этой лекции вы изучили оператор SELECT, отдельные предложения, которые могут быть включены в него, научились ими пользоваться, узнали про условия поиска и про функции. Вы изучили материал о логических операциях, о соединениях, об алиасах, о сопоставлении шаблонам, о результатах группировки и сортировки и о многом другом. Мы дали вам большой объем информации, но у оператора SELECT имеется еще много других возможностей. (О дополнительных возможностях см. лекцию 20; там же мы рассмотрим другие операторы манипулирования данными – INSERT, UPDATE и DELETE. А в лекции 15 мы расскажем о том, как можно вносить изменения в таблицы базы данных.)

Лекция 15. Управление таблицами с помощью T-SQL и Enterprise Manager

Невозможно предусмотреть все критерии, по которым следует создавать базы данных. Все равно рано или поздно вы столкнетесь с тем, что нужно будет производить изменения в структуре отдельной таблицы или же всей базы данных. Модифицирование можно производить с помощью T-SQL и Enterprise Manager. Использование Enterprise Manager позволяет работать в более привычном, наглядном режиме отображения данных, но предоставляет администратору и проектировщику баз данных меньше возможностей для реализации поставленных задач по сравнению с T-SQL.

В лекции 10 вы узнали, как создавать таблицу путем определения ее колонок и типов данных. Создав таблицу, вы можете модифицировать ее различными способами, даже если эта таблица уже содержит данные. В данной лекции описываются некоторые способы модифицирования таблиц, включая изменение, добавление, удаление и переименование колонок, а также удаление всей таблицы. (О создании и модифицировании ограничений ( constraints (*) ) таблицы (метод обеспечения целостности данных), а также триггерах (специальный тип хранимой процедуры, которая автоматически запускается при определенных условиях) см. лекции 16 и 22.)

Примечание. В данном случае constraint – это "связывающее" ограничение, но мы будем называть его для краткости просто ограничением. – Прим пер.

В данной лекции мы рассмотрим использование Transact-SQL (T-SQL) и Microsoft SQL Server 2000 Enterprise Manager для управления вашими таблицами. Следует помнить, что T-SQL и Enterprise Manager имеют различные уровни гибкости для модифицирования таблицы. Enterprise Manager более полезен в том смысле, что позволяет вам выполнять определенные модификации проще, чем при использовании T-SQL. Enterprise Manager выводит на экран информативные сообщения об ошибках и иногда предлагает альтернативы, если вы пытаетесь выполнить неверную модификацию. Однако T-SQL имеет одно преимущество, состоящее в том, что если вы запускаете команды с записью сценария, то получаете записанную трассировку того, как и в каком порядке выполнялись ваши модификации. В этой лекции мы рассмотрим преимущества и недостатки использования этих двух методов для модифицирования таблиц.

Прежде чем начать изучение, нам нужно создать две таблицы в базе данных MyDB – Bicycle_Sales (Продажи велосипедов) и Bicycle_Inventory (Запасы велосипедов), – которые будут использоваться для примеров этой лекции. Таблица Bicycle_Sales содержит информацию по продажам велосипедов и состоит из следующих колонок: make_id (идентификатор изделия), model_id (идентификатор модели), description (описание), year (год), sale_id (идентификатор продажи), price (цена), quantity (количество) и sale_date (дата продажи). Колонки make_id и model_id указываются вместе как ограничение foreign key (внешний ключ). Это ограничение содержит ссылку на колонки make_id и model_id в таблице Bicycle_Inventory, образуя уникальный кластеризованный индекс. Как вы увидите в лекции 16, ограничение foreign key может содержать ссылку только на колонку первичного ключа (primary key) или другую колонку с уникальным ограничением в ссылочной таблице. (Подробное описание ограничений дается в лекции 16, описание индексов – в лекции 17.)

Колонка sale_id объявлена как кластеризованный индекс по первичному ключу для таблицы Bicycle_Sales. Ниже приводится оператор CREATE TABLE для создания каждой из этих таблиц:

USE MyDB 
GO 
CREATE TABLE Bicycle_Inventory 
( 
       make_name       		char(10)     		NOT NULL, 
       make_id         		tinyint      		NOT NULL,     
       model_name      		char(12)     		NOT NULL, 
       model_id        		tinyint      		NOT NULL, 
       in_stock        		tinyint      		NOT NULL, 
       on_order        		tinyint      		NULL, 
       CONSTRAINT      	MI_clu_indx 
       UNIQUE CLUSTERED(make_id, model_id) 
) 
GO 

CREATE TABLE Bicycle_Sales 
( 
       make_id      		tinyint     		NOT NULL,--Использована в ограничении
                                            				           --foreign key
       model_id     		tinyint     		NOT NULL,--Также использована в ограничении
                                           			      --foreign key
       description  		char(30)    		NULL, 
       year         		char(4)     		NOT NULL, 
       sale_id      		int         		NOT NULL IDENTITY (1,1) PRIMARY KEY CLUSTERED,
       price        		smallmoney       	NOT NULL,
       quantity     		tinyint     		NOT NULL,
       sale_date    		datetime    		NOT NULL,
	CONSTRAINT   	sales_inventory_fk FOREIGN KEY (make_id, model_id)
	REFERENCES   	Bicycle_Inventory(make_id, model_id)
)
GO
Внимание. Таблица Bicycle_Inventory должна быть создана до таблицы Bicycle_Sales. Если попытаться сначала создать таблицу Bicycle_Sales, то будет выдано сообщение об ошибке. Таблица Bicycle_Sales ссылается на таблицу Bicycle_Inventory с помощью ограничения, и если отсутствует таблица Bicycle_Inventory, то ограничение не может быть создано, что приведет к появлению ошибки.

Теперь, создав наши примеры таблиц базы данных, внесем некоторые изменения, используя сначала T-SQL и затем – Enterprise Manager.

Модифицирование таблицы с помощью T-SQL

В этом разделе вы узнаете, как использовать операторы T-SQL для изменения, добавления, удаления и переименования колонок в существующей таблице. Для осуществления всех модификаций таблицы используется оператор T-SQL ALTER TABLE.

Изменение колонок

Создав таблицу, вы можете изменить для колонки тип данных, точность (для числовых типов) и null-атрибут, а также добавить к колонке свойство ROWGUIDCOL или удалить его из колонки, и все это с помощью оператора ALTER TABLE. Используя другие операторы T-SQL, вы можете выполнять и другие модификации колонок, такие как добавление значения по умолчанию. (Подробно об этих операторах см. лекцию 16.)

Не все колонки можно изменять. В общем случае вы не можете изменять следующие типы колонок.

Все другие типы колонок можно изменять с помощью оператора ALTER TABLE. В некоторых из предыдущих случаев вы можете снять запрет на изменение колонки. Например, вы можете удалить ограничение foreign key или какое-либо другое ограничение или удалить индекс по колонке, и если к данной колонке не относятся какие-либо другие запреты, то можете затем изменять эту колонку.

Изменение типа данных

Чтобы можно было изменить тип данных какой-либо колонки, для исходного типа данных должно существовать неявное преобразование в новый тип данных. Таблицу допустимых преобразований можно найти под заголовком "CAST and CONVERT (T-SQL)" (Приведение и преобразование [T-SQL]) в Books Online. Для доступа к этой теме найдите "CAST" в Books Online и затем выберите в диалоговом окне Topics Found "CAST and CONVERT (T-SQL)".

Оператор изменения типа данных колонки имеет следующий синтаксис:

ALTER TABLE		<имя_таблицы>
ALTER COLUMN	<имя_колонки> 	<новый_тип_данных>

Если вы измените для таблицы Bicycle_Sales тип данных datetime колонки sale_date на тип smalldatetime, то строки данных будут занимать меньше места.

Дело в том, что datetime занимает 8 байтов, а smalldatetime – только 4. Чтобы выполнить это изменение, используйте следующий оператор:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	sale_date smalldatetime 	NOT NULL 
GO

Любые существующие данные таблицы будут неявно преобразованы в новый тип данных – smalldatetime. Null -атрибут NOT NULL не изменился.

Чтобы изменить тип данных char(30) колонки description на тип varchar(20) (имеющий меньшую длину), используйте следующий оператор:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN		description varchar(20) 	NULL
GO

Отметим, что исходный тип данных char(30) допускает неявное преобразование в новый тип данных varchar(20), но varchar(20) короче. Поэтому для всех существующих строк будет без оповещения выполнено усечение значений колонки description длиной более 20 символов и преобразование в тип varchar(20).

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

Чтобы изменить null -атрибут, вы можете изменить для колонки атрибут NOT NULL на NULL, за исключением колонок с ограничением primary key. (По определению в таких колонках не допускаются null -значения.) Вы можете изменить атрибут NULL на NOT NULL, только если в строках соответствующей колонки нет null -значений. Если колонка содержит null -значения, то вы можете выполнить оператор UPDATE для замены всех null -значений на некоторое фактическое значение и затем изменить NULL на NOT NULL для этой колонки. Если null -атрибут не указан для измененной колонки, то в этой колонке допускаются null -значения по умолчанию. Рассмотрим некоторые примеры.

Для изменения null -атрибута колонки quantity с тем, чтобы допускались null -значения, выполните следующий оператор:

ALTER TABLE		Bicycle_Sales 
ALTER COLUMN	quantity tinyint 	NULL 
GO

Тип данных колонки, tinyint, остался без изменений; изменился только null -атрибут. Теперь в колонке quantity будут допускаться null -значения. Если не введено никакого значения, будет происходить автоматическая вставка значения NULL. Это изменение не влияет на значения колонки quantity в существующих строках, но оно позволяет вставлять NULL -значения для новых строк, добавляемых к таблице.

Теперь изменим описание колонки description на NOT NULL. Мы предположим, что в этой колонке уже имеются null -значения. Поэтому сначала мы должны заменить эти null -значения на какое-то фактическое значение – в данном случае – на значение None (Нет), совместимое с типом данной колонки. Чтобы выполнить проверку на значение NULL, надежнее всего не использовать оператор равенства (=), а применять ключевые слова IS NULL или IS NOT NULL. Дело в том, что NULL означает неизвестное значение, а оператор равенства, возможно, не может выполнять сравнение для null -значений (это зависит от установки параметра базы данных ANSI nulls ON [активизирован] или OFF [отключен]). Если для этого параметра задано значение OFF, то оператор равенства выражение = NULL возвратит значение TRUE, если выражение содержит null -значение. Этот оператор возвратит значение FALSE, если выражение не содержит null -значения. Если для параметра ANSI nulls задано значение ON, то оператор выражение = NULL возвратит для всех сравнений значение UNKNOWN и не будет выдано никаких результатов. SQL Server не возвращает значений NULL, как можно было бы ожидать, если параметр ANSI nulls установлен в значение ON. IS NULL и IS NOT NULL действуют одинаковым образом независимо от установки параметра ANSI_NULLS. Чтобы заменить null -значения колонки description на значение None, используйте следующий оператор UPDATE SET:

UPDATE				Bicycle_Sales SET description = "None"
WHERE				description IS NULL 
GO

Теперь изменим null -атрибут колонки description на NOT NULL:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	description char(30) 	NOT NULL 
GO

И в данном случае мы изменили только null -атрибут этой колонки, а исходный тип данных char(30) остался без изменений. Вы можете одновременно изменить тип данных и null -атрибут в одном операторе ALTER TABLE, как это показано ниже:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	description varchar(20) 	NOT NULL 
GO

Этот оператор изменяет тип данных и null -атрибут колонки description.

Добавление или удаление свойства ROWGUIDCOL Property

Чтобы добавить к колонке или удалить из колонки свойство ROWGUIDCOL, используйте следующий синтаксис:

ALTER TABLE		<имя_таблицы>
ALTER COLUMN	<имя_колонки> ADD | DROP ROWGUIDCOL

Свойство ROWGUIDCOL можно добавлять только в колонку типа uniqueidentifier. Если предположить, что в нашу таблицу Bicycle_Sales была включена колонка типа uniqueidentifier с именем unique_id, то вы могли бы добавить свойство ROWGUIDCOL с помощью следующего оператора:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	unique_id ADD ROWGUIDCOL
GO

И вы могли бы удалить это свойство с помощью следующего оператора:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	unique_id DROP ROWGUIDCOL 
GO
Добавление колонок

С помощью оператора ALTER TABLE вы можете также добавлять колонки к таблице. Определение колонок происходит почти одинаково – будь то создание или изменение таблицы. Вы должны присвоить колонке имя и тип данных и можете дополнительно присваивать другие атрибуты, свойства и ограничения.

Добавляя колонку с атрибутом NOT NULL, вы должны также объявить значение по умолчанию, чтобы это значение появилось в новой колонке уже существующих строк. Это значение по умолчанию задается с помощью ключевого слова DEFAULT. Чтобы добавить колонку, используйте следующий синтаксис:

ALTER TABLE		<имя_таблицы>
ADD				<имя_колонки> <тип_данных> <null-атрибут>
DEFAULT			значение_по_умолчанию

Например, чтобы добавить к таблице Bicycle_Sales колонку с именем salesperson_id (идентификатор продавца), используйте следующий оператор. (В новой колонке не допускаются null -значения, и она имеет значение по умолчанию, равное 0.)

ALTER TABLE		Bicycle_Sales
ADD				salesperson_id tinyint NOT NULL 
DEFAULT			0 
GO

Поскольку колонка объявлена как NOT NULL, то во всех существующих строках таблицы в новую колонку будет занесено значение 0.

Если вместо этого колонка salesperson_id будет объявлена как NULL (см. ниже), то значение по умолчанию не будет обязательным:

ALTER TABLE		Bicycle_Sales
ADD				salesperson_id tinyint NULL 
DEFAULT			0    	--Необязательное значение по умолчанию
GO

Несмотря на то, что мы задали значение по умолчанию, в колонку salesperson_id существующих строк будет занесено значение NULL, а значение по умолчанию будет присваиваться только в новых строках.

Чтобы в существующих строках вместо значения NULL также было присвоено значение по умолчанию (0), используйте в ключевом слове DEFAULT опцию WITH VALUES, как это показано ниже:

ALTER TABLE		Bicycle_Sales
ADD				salesperson_id tinyint NULL
DEFAULT			0 WITH VALUES 
GO

Опция WITH VALUES указывает, что во всех существующих строках новой колонке будет присвоено вместо значения NULL значение по умолчанию.

Удаление колонок

Вы можете также использовать оператор ALTER TABLE для удаления колонок из таблицы. Все данные удаленной колонки будут удалены из таблицы. При использовании T-SQL для удаления колонок вы не можете удалять следующие типы колонок.

Примечание. Эти запрещения тоже действуют, но обрабатываются по-другому, если вы используете для удаления колонки Enterprise Manager. (Более подробную информацию см. в разделе "Модифицирование таблицы с помощью Enterprise Manager" ниже.)

Для удаления колонки из таблицы используйте следующий синтаксис:

ALTER TABLE 	<имя_таблицы>
DROP COLUMN 	<имя_колонки>

Следующий оператор удаляет колонку description из таблицы Bicycle_Sales:

ALTER TABLE		Bicycle_Sales
DROP COLUMN		description 
GO

Колонка description и все ее значения удаляются изо всех строк таблицы.

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

Чтобы переименовать колонку с помощью операторов T-SQL, вы должны запустить системную хранимую процедуру sp_rename, используя следующий синтаксис:

sp_rename 'таблица.исходное_имя_колонки', 'новое_имя_колонки', 'COLUMN'

Например, чтобы заменить имя колонки description на Bicycle_desc, вам нужно использовать следующий оператор:

sp_rename 'Bicycle_Sales.description', 'bicycle_desc', 'COLUMN'
GO

Исходное имя колонки должно быть задано в формате таблица.колонка, но имя таблицы не следует включать в имя новой колонки.

Модифицирование таблицы с помощью Enterprise Manager

Как уже говорилось, модифицирование таблицы с помощью Enterprise Manager выполняется проще и дает вам больше функциональных возможностей и гибкости, чем операторы T-SQL. Вы можете выполнять все свои модификации в окне Design Table (Проектирование таблицы) или с помощью схемы (диаграммы) базы данных. Рассмотрим сначала использование окна Design Table. Чтобы открыть окно Design Table для вашей таблицы Bicycle_Sales, выполните следующие шаги:

  1. Раскройте папку базы данных MyDB в левой панели Enterprise Manager.
  2. Щелкните на папке Tables (Таблицы), чтобы в правой панели появился список всех таблиц базы данных MyDB (рис. 15.1).

    Enterprise Manager


    увеличить изображение

    Рис. 15.1.  Enterprise Manager

  3. Щелкните правой кнопкой мыши на таблице Bicycle_Sales в правой панели. Выберите из контекстного меню пункт Design Table, чтобы появилось окно Design Table (рис. 15.2). В этом окне показана исходная, немодифицированная таблица Bicycle_Sales.

    Окно Design Table (Проектирование таблицы)


    Рис. 15.2.  Окно Design Table (Проектирование таблицы)

Изменение колонок

Чтобы изменить колонку в окне Design Table, просто щелкните на соответствующей ячейке или установите нужный флажок в "сетке" и внесите необходимые изменения. Каждая строка в этой сетке представляет колонку таблицы. Заголовки вверху сетки указывают, какое свойство задает каждая ячейка сетки.

Для некоторых ситуаций, когда T-SQL не позволяет выполнить определенные модификации и возвращает сообщение об ошибке, Enterprise Manager предоставляет дополнительные возможности, позволяющие вам правильно осуществить процесс модификаций. Например, если вы попытаетесь с помощью оператора T-SQL ALTER TABLE изменить длину данных колонки, имеющей ограничение primary key или foreign key, то получите сообщение об ошибке, аналогичное следующему сообщению:

Column or parameter #0: Cannot specify a column width on data type int.
(Колонка или параметр #0: Невозможно задать ширину колонки по типу данных int.)

Но если вы используете Enterprise Manager, то увидите окно сообщения, в котором можно изменить длину данных для этой колонки.

Например, чтобы изменить тип данных tinyint на тип smallint для колонки make_id (имеющей ограничение foreign key, содержащее ссылку на колонку make_id таблицы Bicycle_Inventory), просто щелкните на tinyint, щелкните на направленной вниз стрелке, чтобы появился раскрывающийся список Data Type (Тип данных) и затем выберите smallint (рис. 15.3).

Изменение типа данных колонки с помощью Enterprise Manager


Рис. 15.3.  Изменение типа данных колонки с помощью Enterprise Manager

Поскольку колонка make_id имеет ограничение foreign key, появится диалоговое окно Data Type Change Required (Требуется изменение типа данных) (рис. 15.4). Щелкните на кнопке Yes (Да), чтобы автоматически преобразовать в обеих таблицах тип колонки make_id из tinyint в smallint.

Диалоговое окно Data Type Change Required (Требуется изменение типа данных)


Рис. 15.4.  Диалоговое окно Data Type Change Required (Требуется изменение типа данных)

Как и в случае использования T-SQL, при изменении типа данных с помощью Enterprise Manager исходный тип данных должен допускать неявное преобразование в новый тип данных. Если вы попытаетесь выполнить недопустимое преобразование, Enterprise Manager возвратит сообщение об ошибке, аналогичное тому, что отображено на рис. 15.5, где показан результат недопустимого способа изменения типа данных для колонки sale_date из типа datetime в тип text. Щелкните на кнопке OK, чтобы закрыть окно с сообщением об ошибке, и измените недопустимый тип данных на тип, допускающий неявное преобразование.

Сообщение об ошибке, которое выводится после попытки изменения типа данных на тип, не допускающий неявного преобразования


Рис. 15.5.  Сообщение об ошибке, которое выводится после попытки изменения типа данных на тип, не допускающий неявного преобразования

Чтобы сохранить ваши изменения, щелкните на кнопке Save Disk (Сохранение на диске) панели инструментов окна Design Table. Затем в диалоговом окне Save (Сохранение) (рис. 15.6), нужно подтвердить, что указанные таблицы должны быть записаны на диск. Чтобы подтвердить, что вы хотите сохранить ваши изменения, щелкните на кнопке Yes.

Диалоговое окно Save (Сохранить)


Рис. 15.6.  Диалоговое окно Save (Сохранить)

Добавление колонок

Чтобы добавить колонку, щелкните на столбце Column Name (Имя колонки) первой пустой строки окна Design Table, введите имя новой колонки, выберите тип ее данных и присвойте ей нужные атрибуты ( Allow Nulls [Разрешить null -значения], Default Value [Значение по умолчанию], Identity и т.д.). Как показано на рис. 15.7, мы добавили колонку с именем salesperson_id с типом данных tinyint, с разрешением использования null -значений и значением по умолчанию 0. Щелкните на кнопке Save Disk, чтобы сохранить ваши изменения. SQL Server добавит к таблице эту новую колонку

Добавление новой колонки с именем salesperson_id


Рис. 15.7.  Добавление новой колонки с именем salesperson_id

Удаление колонок

Удаление колонки – это простой процесс, если вы работаете с Enterprise Manager. В окне Design Table нужно просто щелкнуть правой кнопкой мыши на имени колонки или любом из ее атрибутов (на любой ячейке строки с именем данной колонки) и выбрать из контекстного меню пункт Delete Column (Удалить колонку). Соответствующая строка будет удалена из таблицы. Не забудьте щелкнуть на кнопке Save Disk, чтобы сохранить ваши изменения.

Enterprise Manager предупредит вас, если вы попытаетесь удалить колонку, которая является частью ограничения или индекса, если колонка содержит значение по умолчанию или имеет связанное с ней правило. Вы увидите окно сообщения (рис. 15.8). После щелчка на кнопке Yes последует удаление данной колонки вместе со всеми ее связями.

Окно сообщения, которое появляется при попытке удаления колонки, имеющей связи с другими колонками и таблицами


Рис. 15.8.  Окно сообщения, которое появляется при попытке удаления колонки, имеющей связи с другими колонками и таблицами

Создание и использование схемы базы данных

Вы можете также модифицировать таблицы в Enterprise Manager с помощью схемы базы данных. Чтобы создать схему для базы данных MyDB с двумя таблицами Bicycle_Sales и Bicycle_Inventory, выполните следующие шаги:

  1. Раскройте MyDB в левой панели Enterprise Manager и затем щелкните правой кнопкой мыши на Diagrams (Схемы). Выберите из контекстного меню пункт Choose New Database Diagram (Выбор новой схемы базы данных), чтобы появилось начальное окно мастера создания схемы базы данных Create Database Diagram Wizard (рис. 15.9).
  2. Щелкните на кнопке Next (Далее), чтобы появилось окно Select Tables to be Added (Выбор таблиц для добавления) (рис. 15.10). Выделите таблицы, которые хотите включить в вашу схему, в списке Available Tables (Имеющиеся таблицы) и затем щелкните на кнопке Add. В этом примере мы добавили таблицы Bicycle_Inventory и Bicycle_Sales.
  3. Щелкните на кнопке Next, чтобы появилось окно Completing the Create Database Diagram Wizard (Завершение работы мастера создания схемы базы данных). Щелкните на кнопке Finish (Готово), если выбраны нужные таблицы, или щелкните на кнопке Back (Назад) и внесите необходимые изменения.
  4. После щелчка на кнопке Finish вы увидите схему базы данных (рис. 15.11).
  5. Сохраните вашу схему, указав описательное имя (щелкните на кнопке Save Disk и введите имя, когда появится соответствующий запрос).

 Начальное окно мастера Create Database Diagram Wizard (Создание схемы базы данных)


Рис. 15.9.  Начальное окно мастера Create Database Diagram Wizard (Создание схемы базы данных)

 Окно Select Tables to be Added (Выбор таблиц для добавления)


Рис. 15.10.  Окно Select Tables to be Added (Выбор таблиц для добавления)

Вертикальная линия, которая заканчивается изображением ключа и соединяет две таблицы в вашей схеме, представляет связь между ними, выраженную ограничением foreign key. Чтобы вывести на экран метку этой связи, щелкните правой кнопкой мыши на фоновой части окна и выберите из контекстного меню пункт Show Relationship Labels (Показать метки связей). Появится имя ограничения foreign key (рис. 15.12).

Чтобы выделить какую-либо таблицу, щелкните на ней; чтобы выделить более одной таблицы, щелкните на каждой таблице, удерживая клавишу Ctrl. Если щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню какой-либо пункт, то соответствующая операция будет применена ко всем выделенным таблицам. Например, если выделить в вашей схеме баз данных обе таблицы, щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню пункт Table View, затем Standard, то вид обеих таблиц будет изменен, чтобы представить на экране свойства всех колонок (рис. 15.13).

Пример схемы базы данных


увеличить изображение

Рис. 15.11.  Пример схемы базы данных

Просмотр меток связей между таблицами


увеличить изображение

Рис. 15.12.  Просмотр меток связей между таблицами

Просмотр свойств по колонкам в схеме базы данных


увеличить изображение

Рис. 15.13.  Просмотр свойств по колонкам в схеме базы данных

Представление свойств колонок на экране для каждой таблицы аналогично окну Design Table, и каждую таблицу можно модифицировать с помощью тех же методов, что и в окне Design Table. Просто добавьте или измените данные колонок в нужных ячейках и сохраните ваши изменения, щелкнув на кнопке Save Disk. Вы можете также перемещать таблицы и изменять их размеры в схеме базы данных, выводить на экран различные представления таблиц и выполнять другие действия. Опробуйте различные команды контекстного меню. Отметим, что как только вы вносите какое-либо изменение в таблицу, рядом с именем этой таблицы появляется символ "звездочка", указывающий, что внесены изменения.

Следствия изменения таблицы

Если вы изменили таблицу, то любые необходимые изменения вносятся в существующие строки данных сразу после исполнения оператора T-SQL ALTER TABLE или после сохранения изменений, если вы используете Enterprise Manager. SQL Server налагает блокировку на данную таблицу, чтобы никакие другие пользователи не имели к ней доступа, пока выполняются изменения. Модифицирование, которое требует изменения всех строк в достаточно большой таблице, такое как добавление колонки со свойством NOT NULL и значением по умолчанию или удаление колонки, может занять некоторое время и должно выполняться с осторожностью в периоды минимального пользовательского доступа. Если вы модифицируете колонку путем изменения длины ее данных, точности или масштаба, то соответствующая таблица повторно создается в базе данных и существующие данные преобразуются в новый тип данных.

Все изменения таблиц регистрируются в журнале и могут быть полностью воспроизведены в случае аварии системы или фатальной ошибки во время процесса изменения таблицы. Но если процесс изменения завершен успешно, то для возврата таблицы к ее исходному сохранению потребуется восстановление с резервной копии. (О резервном копировании и восстановлении базы данных см. лекции 32 и 33.)

Удаление таблицы

Если вы удаляете таблицу, то удаляется все, что связано с этой таблицей: определения и данные таблицы, индексы, ограничения, триггеры и полномочия доступа. Представления и хранимые процедуры, содержащие ссылки на удаляемую таблицу, должны быть удалены явным образом. Таблицу нельзя удалить, если на нее есть ссылка с помощью ограничения foreign key в другой таблице; иными словами, таблицу нельзя удалить, если от нее зависит другая таблица. Прежде чем удалить данную таблицу, следует сначала удалить это ограничение или ссылающуюся таблицу. С другой стороны, таблицу, содержащую ограничение foreign key, можно удалить, если от нее не зависит никакая другая таблица. В этом разделе мы рассмотрим удаление таблицы с помощью T-SQL и Enterprise Manager.

Использование T-SQL для удаления таблицы

Оператор T-SQL, используемый для удаления таблицы, имеет следующий синтаксис:

DROP TABLE <имя_таблицы>

Для удаления представлений или хранимых процедур, которые ссылаются на удаляемую таблицу, используйте оператор DROP VIEW или DROP PROCEDURE. Вы можете удалять представления и хранимые процедуры до или после удаления этой таблицы. После удаления таблицы ее уже нельзя прочитать: вы должны для этого снова создать всю таблицу, ее данные и все остальное.

Для удаления таблицы Bicycle_Inventory, на которую имеется ссылка из таблицы Bicycle_Sales с помощью ограничения foreign key, мы должны сначала удалить это ограничение foreign key (с именем sales_inventory_fk ) и затем удалить таблицу, как это показано ниже:

ALTER TABLE      	Bicycle_Sales
DROP CONSTRAINT  	sales_inventory_fk
GO 
DROP TABLE       	Bicycle_Inventory 
GO

Если вы попытаетесь удалить таблицу до удаления ограничения foreign key, то получите сообщение об ошибке и таблица не будет удалена.

Использование Enterprise Manager для удаления таблицы

В Enterprise Manager имеется два метода удаления таблицы: использование диалогового окна Drop Objects (Удаление объектов) или использование схемы базы данных. Диалоговое окно Drop Objects наиболее подходит, если вы удаляете таблицу, от которой не зависят никакие другие таблицы. Чтобы использовать этот метод, выполните следующие шаги:

  1. В левой панели Enterprise Manager раскройте базу данных, содержащую таблицу, которую вы хотите удалить, и щелкните на папке Tables; затем в правой панели щелкните правой кнопкой мыши на имени таблицы, которую хотите удалить.
  2. Выберите из контекстного меню пункт Delete (Удалить), чтобы появилось диалоговое окно Drop Objects (рис. 15.14).

     Диалоговое окно Drop Objects (Удаление объектов)


    Рис. 15.14.  Диалоговое окно Drop Objects (Удаление объектов)

  3. Если данная таблица имеет какие-либо зависимые таблицы, щелкните на кнопке Show Dependencies (Показать зависимости), чтобы появилось диалоговое окно Dependencies (рис. 15.15). Любые таблицы, зависящие от данной таблицы, появятся в левом списке этого диалогового окна. Если имеются какие-либо зависимые таблицы, то вы не можете удалить данную таблицу, пока не будут удалены соответствующие зависимости.
  4. Если никакие другие таблицы не зависят от выбранной таблицы, то вы можете удалить эту таблицу, щелкнув на кнопке Drop All (Удалить все) в диалоговом окне Drop Objects.

Диалоговое окно Dependencies для таблицы Bicycle_Sales


Рис. 15.15.  Диалоговое окно Dependencies для таблицы Bicycle_Sales

Чтобы удалить таблицу, которая имеет зависимые таблицы, мы будем использовать второй метод: схему базы данных. В этом примере мы удалим таблицу Bicycle_Inventory, на которую имеется ссылка с помощью ограничения foreign key в таблице Bicycle_Sales. Это удаление не удалось бы выполнить, если бы мы использовали диалоговое окно Drop Objects. Но, используя схему базы данных, где показаны обе таблицы, мы можем удалить любую таблицу, а ограничение foreign key будет удалено автоматически. Для удаления таблицы Bicycle_Inventory выполните следующие шаги:

  1. Откройте схему базы данных в Enterprise Manager, раскрыв базу данных, которую хотите использовать, щелкнув на Diagrams и затем дважды щелкнув на имени подходящей схемы в правой панели. Выделите имя таблицы, которую хотите удалить (в данном случае – Bicycle_Inventory).
  2. Щелкните правой кнопкой мыши в любом месте этой таблицы и выберите из контекстного меню пункт Delete Table From Database (Удалить таблицу из базы данных). При появлении окна, где нужно подтвердить, что вы хотите удалить данную таблицу из базы данных, щелкните на кнопке Yes. Таблица и ограничение foreign key будут удалены из схемы.
  3. Если вы уверены, что хотите окончательно удалить эту таблицу, сохраните свои изменения, щелкнув на кнопке Save Disk. После этого таблица будет удалена из базы данных. Если вы отказались от своего решения удалить таблицу, просто выйдите из окна Edit Diagram (Редактирование схемы) без сохранения изменений, щелкнув на кнопке Close (Закрыть). Если вы затем повторно откроете схему базы данных, исходные таблицы будут на прежнем месте. Никакие изменения не начнут действовать, пока вы не сохраните свою работу.

Заключение

В этой лекции вы узнали, как использовать T-SQL и Enterprise Manager для модифицирования таблиц базы данных путем изменения, удаления, добавления и переименования колонок. В процессе изложения материала были показаны некоторые отличия между функциональными возможностями T-SQL и Enterprise Manager. Вы также узнали, как создается схема базы данных с помощью мастера Create Database Diagram Wizard и как происходит удаление таблицы и всех ее данных из базы данных. В таблицу можно вносить другие типы модификаций, включая изменение, добавление и удаление ограничений и умолчаний. (О модификациях см. лекцию 16.)

Лекция 16. Создание и использование умолчаний, ограничений и правил

При использовании базы данных всегда существует проблема, связанная с безопасностью доступа к данным. Определить уровень безопасности и степень возможных утечек информации можно с помощью умолчаний, ограничений и правил. Вы познакомитесь с новыми системными хранимыми процедурами, такими как sp_bindefault и sp_unbindefault. На конкретных примерах увидите, как происходит взаимодействие объектов в базе данных с различными параметрами конфигурирования. Создание Rule-объекта позволяет создавать ограничения на значения, не связанные с конкретной таблицей, что является новым шагом на пути к масштабируемости и легкости управления базой данных.

Умолчания, ограничения и правила – это необязательные атрибуты, которые можно определять по колонкам и таблицам базы данных. В лекции 15 вы ознакомились с умолчаниями, когда описывалось добавление к таблице колонки со значением по умолчанию с помощью оператора ALTER TABLE. В этой лекции вы узнаете о двух методах создания и модифицирования умолчаний. Напоминаем, что умолчания (значения по умолчанию *) – это значения, которые заносятся в определенную колонку, когда не указано явно никакого значения. Ограничения (constraints)** используются как способ идентифицирования допустимых значений для колонки (чтобы отклонять недопустимые значения) а также как средство обеспечения целостности данных в таблицах базы данных и между связанными таблицами. Мы рассмотрим в этой лекции пять типов ограничений; вы также узнаете, как создавать и модифицировать умолчания и ограничения с помощью Transact-SQL (T-SQL) и Microsoft SQL Server Enterprise Manager, хотя использование Enterprise Manager часто оказывается проще.

Умолчания

Сначала рассмотрим причину, по которой вам может потребоваться использование умолчаний для определенных колонок таблицы; для этого мы посмотрим, что происходит, если вы не задали значение по умолчанию. Если в таблицу вводится строка, содержащая колонки без значений по умолчанию, и не во все колонки, допускающие null -значения, введены конкретные данные, то этим колонкам присваивается значение NULL. Но если колонка определена с атрибутом NOT NULL и вы не ввели какое-либо значение в эту колонку при вводе строки, то будет возвращено сообщение об ошибке, информирующее, что в эту колонку нельзя поместить значение NULL. Именно в этом случае удобно применять умолчания. Умолчания можно использовать, чтобы указывать определенное значение, которое будет помещено вместо значения NULL, и тогда вы не получите сообщения об ошибке. Вам следует использовать умолчания для колонок таблицы вместо разрешения использовать null -значения, поскольку операции по таким колонкам создают более высокую дополнительную нагрузку на систему, чем операции по колонкам, в которых не допускаются null -значения.

Microsoft SQL Server 2000 позволяет вам определять значение по умолчанию для каждой колонки таблицы. Вы не можете задать умолчание для колонок, имеющих тип данных timestamp или обладающих свойством IDENTITY или ROWGUIDCOL, поскольку эти колонки должны иметь уникальные значения. Колонки этого типа несовместимы со значениями по умолчанию, поскольку применение такого значения к колонке более одного раза приводило бы к тому, что колонка уже не имела бы уникальных значений. Вы можете присваивать только одно значение по умолчанию, и оно будет автоматически использоваться каждый раз, когда это требуется. И еще одно важное замечание относительно умолчаний: значение, задаваемое по умолчанию, должно быть совместимо с типом данных соответствующей колонки.

Значение по умолчанию можно создавать и модифицировать несколькими способами. В этом разделе мы рассмотрим, как определять значение по умолчанию при создании таблицы и как модифицировать колонку, чтобы добавлять или изменять умолчание, сначала – с помощью T-SQL и затем – с помощью Enterprise Manager. Напомним, что в лекции 15 мы рассматривали добавление колонок со значением по умолчанию и влияние этого значения на существующие строки. Вы увидите здесь менее подробный пример такой вставки. Мы также рассмотрим возможности и влияние вставки значения по умолчанию в существующую колонку таблицы.

Определение и модифицирование умолчаний с помощью T-SQL

Вы можете определять значение по умолчанию для колонки посредством одного из трех операторов T-SQL: CREATE TABLE, ALTER TABLE или CREATE DEFAULT. Оператор CREATE DEFAULT, который используется в SQL Server 2000 для совместимости с предыдущими версиями, создает объект типа Default (Default-объект). Если вы используете данный метод, SQL Server сохраняет этот объект отдельно от таблицы, поэтому вы должны выполнять привязку этого объекта к колонке или колонкам с помощью системной хранимой процедуры sp_bindefault. Если вы удаляете таблицу, определение DEFAULT автоматически теряет связь с этой таблицей, но сам Default -объект остается. Но если вы используете метод CREATE TABLE или ALTER TABLE, то SQL Server сохраняет определение DEFAULT вместе с таблицей и при удалении таблицы происходит автоматическое удаление этого умолчания без необходимости выполнения дополнительных шагов. По этой причине обычно рекомендуют не использовать оператор CREATE DEFAULT. Однако использование Default -объекта может оказаться полезным, если одно значение по умолчанию будет использоваться для нескольких колонок.

Для запуска ваших операторов T-SQL вам следует использовать анализатор запросов SQL Query Analyzer, поскольку результаты будут появляться в виде графического пользовательского интерфейса (GUI), что проще для чтения, чем при запуске операторов в окне командной строки.

Оператор CREATE TABLE с атрибутом DEFAULT

Создание умолчания для колонки с помощью оператора CREATE TABLE является предпочтительным, стандартным методом. Следующий оператор создает в базе данных MyDB таблицу, содержащую умолчания для обеих колонок, – columnA (типа char) и columnB (типа int):

USE MyDB
CREATE TABLE MyTable 
( 
columnA  		char(15) 		NULL DEFAULT 'n/a', 
columnB  		int      		NULL DEFAULT 0 
) 
GO

Значение по умолчанию n/a (сокращение от not applicable – неприменимо) для колонки columnA совместимо с типом данных char этой колонки, и значение по умолчанию 0 для колонки columnB совместимо с типом данных int . Если при вставке новой строки в таблицу не указывается конкретное значение для одной или обеих колонок, то используется соответствующее значение по умолчанию. Поэтому единственным способом присваивания этим колонкам значения NULL является явная вставка NULL. Null -значения допустимы, поскольку для обеих колонок указан атрибут NULL. Если бы колонки были определены как NOT NULL, то вы не могли бы выполнять явную вставку значения NULL.

Оператор ALTER TABLE с атрибутом DEFAULT

Чтобы изменить определение DEFAULT для колонки или добавить это определение к колонке, вы можете использовать оператор ALTER TABLE. Если значение по умолчанию уже определено и вам нужно изменить его с помощью этой команды, то вы должны сначала удалить существующее умолчание, указав его имя, и затем добавить новое умолчание. (При использовании Enterprise Manager вам не придется выполнять этот шаг, и это поможет вам понять, что использование Enterprise Manager является более простым методом. Изменив таблицу с помощью Enterprise Manager, вы можете также в любой момент генерировать сценарии для повторного создания таблицы.)

Предположим, что вы не хотите изменять существующее умолчание. Если вы создали умолчание с помощью оператора CREATE TABLE или с помощью Enterprise Manager (что будет описано ниже в этой лекции), но не присвоили имя самому умолчанию, то SQL Server присвоит имя автоматически. Чтобы выяснить, какое имя было присвоено умолчанию (имя используется для удаления умолчания с помощью T-SQL), вы можете запустить хранимую процедуру sp_help, указав имя таблицы, для которой задано это умолчание, как в следующем примере:

USE MyDB
GO
sp_help MyTable
GO

Имена всех ограничений default по таблице MyTable появятся в конце выводимых результатов в столбце под заголовком constraint_name (имя_ограничения) (рис. 16.1).

Предположим, что вы хотите изменить для колонки columnA значение по умолчанию n/a на значение not applicable. Напомним, что мы должны сначала удалить существующее умолчание и затем добавить новое. Чтобы удалить умолчание, используйте следующий оператор:

ALTER TABLE MyTable
DROP CONSTRAINT DF__MyTable__columnA__1920BF5CGO

С помощью следующего оператора мы можем теперь добавить новое умолчание, присвоив ему на этот раз имя:

ALTER TABLE MyTable
ADD CONSTRAINT DF_MyTable_columnA  
DEFAULT 'not applicable' FOR columnA 
GO

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

 Результаты работы хранимой процедуры sp_help


увеличить изображение

Рис. 16.1.  Результаты работы хранимой процедуры sp_help

ALTER TABLE MyTable
ADD columnC tinyint 	NOT NULL DEFAULT 13 
GO

Теперь таблица MyTable содержит еще одну колонку, columnC, которая имеет значение по умолчанию 13. Поскольку columnC – новая колонка, определенная с атрибутом NOT NULL, этой колонке в уже существующих строках таблицы будет присвоено значение по умолчанию 13.

Если бы в новой колонке было разрешено использование значений NULL, то все существующие строки получили бы в новой колонке значение NULL. Если нужно, чтобы этой колонке было присвоено значение по умолчанию (вместо NULL), то в предложении DEFAULT нужно использовать параметр WITH VALUES, как это показано ниже:

ALTER TABLE MyTable
ADD columnC tinyint 	NULL DEFAULT 13 WITH VALUES 
GO

При использовании WITH VALUES новой колонке во всех существующих строках таблицы MyTable будет присвоено значение 13 (вместо значения NULL ).

Теперь, когда вы знаете, как создавать определение DEFAULT, которое сохраняется вместе с таблицей, рассмотрим использование оператора CREATE DEFAULT. С помощью этого метода создается Default -объект, который хранится отдельно от таблицы.

Оператор CREATE DEFAULT и процедура sp_bindefault

Вы можете также добавить умолчание к существующей колонке или изменить умолчание по колонке, создав сначала Default-объект с помощью оператора T-SQL CREATE DEFAULT. Создав Default-объект, вы можете затем связать его с колонкой или с определенным пользователем типом данных, используя системную хранимую процедуру sp_bindefault. Как уже говорилось, этот метод остался в SQL Server 2000 только для обратной совместимости; он не является предпочтительным методом, но может оказаться полезным, если вы будете использовать одно значение по умолчанию для колонок нескольких таблиц.

Рассмотрим пример использования оператора CREATE DEFAULT для создания Default-объекта с именем DF_not_applicable и значением n/a. Это умолчание будет создано в базе данных MyDB и затем будет связано с колонкой columnA таблицы MyTable (в предположении, что для этой таблицы не существует никаких умолчаний). Оператор CREATE DEFAULT имеет следующий синтаксис:

CREATE DEFAULT имя_умолчания AS выражение-константа
Процедура sp_bindefault имеет следующий синтаксис:
sp_bindefault 'имя_умолчания', таблица.колонка | определенный_пользователем_тип_данных
[, futureonly]

Параметр имя_умолчания – это имя Default-объекта. Параметр таблица.колонка указывает колонку, которой вы хотите присваивать это умолчание.

С помощью следующих операторов T-SQL создается Default-объект и происходит его привязка к колонке columnA таблицы MyTable:

USE MyDB
GO 
CREATE DEFAULT DF_not_applicable AS 'n/a' 
GO 
sp_bindefault 'DF_not_applicable', 'MyTable.columnA' 
GO

Если для колонки columnA уже задано значение по умолчанию, то SQL Server возвратит сообщение об ошибке, информирующее вас, что вы не можете выполнить привязку умолчания к колонке, для которой уже задано какое-либо умолчание. Удалите сначала это умолчание и затем выполните привязку нового умолчания к данной колонке. (Процесс использования оператора DROP DEFAULT для удаления Default-объекта описывается ниже в этом разделе.)

Вы можете также создать Default-объект и выполнить его привязку непосредственно к определенному пользователем типу данных. Любая колонка, которой присваивается этот конкретный тип данных, наследует данное умолчание автоматически. Вы можете использовать при обращении к процедуре sp_bindefault необязательный параметр futureonly, когда выполняете привязку Default-объекта к определенному пользователем типу данных. Этот параметр препятствует тому, чтобы существующие колонки, имеющие этот определенный пользователем тип данных, наследовали новое умолчание; тем самым только новые колонки с этим типом данных будут наследовать это умолчание. Если параметр futureonly не указан, то SQL Server выполнит привязку ко всем существующим и вновь создаваемым колонкам, имеющим определенный пользователем тип данных.

Например, создадим определенный пользователем тип данных с именем area_code (код_района) и Default-объект с именем DF_area_code и значением 786; тем самым будет выполнена привязка этого умолчания к определенному пользователем типу данных. (О создании определенных пользователем типов данных см. лекцию 10.) Это новый определенный пользователем тип данных, т.е. еще нет колонок с этим типом данных, поэтому параметр futureonly не требуется. Тем не менее мы включим его, чтобы показать его синтаксис, хотя это не окажет никакого влияния. Ниже показаны соответствующие операторы:

sp_addtype 'area_code', 'char(3)', 'NOT NULL'
GO 

CREATE DEFAULT DF_area_code AS 786 
GO 

sp_bindefault 'DF_area_code', 'area_code', 'futureonly' 
GO

Чтобы увидеть на экране этот тип данных и присвоенное ему значение по умолчанию, используйте системную хранимую процедуру sp_help (рис. 16.2).

Результаты Query Analyzer для процедуры sp_help


увеличить изображение

Рис. 16.2.  Результаты Query Analyzer для процедуры sp_help

Процедура sp_unbindefault

Чтобы аннулировать привязку Default-объекта к колонке или определенному пользователем типу данных, используйте процедуру sp_unbindefault, указав имя таблицы и имя колонки или имя определенного пользователем типа данных. Например, для аннулирования привязки Default-объекта DF_not_applicable к колонке columnA таблицы MyTable используйте следующий оператор:

sp_unbindefault 'MyTable.columnA'
GO

Для аннулирования привязки умолчания к определенному пользователем типу данных area_code используйте следующий оператор:

sp_unbindefault 'area_code'
GO

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

Вы можете выполнить привязку Default-объекта к более чем одной колонке с помощью отдельных операторов sp_bindefault. Кроме того, отменив привязку умолчания к колонке, вы можете снова выполнить его привязку, пока не удалили сам Default-объект. Чтобы удалить Default-объект, используйте оператор DROP DEFAULT, как это показано ниже:

DROP DEFAULT DF_area_code
GO

После удаления Default-объекта он уже недоступен. Если вам нужно использовать его снова, вы должны применить оператор CREATE DEFAULT для повторного создания этого объекта.

Определение и модифицирование умолчаний с помощью Enterprise Manager

Как вы уже видели в лекции 15, использование Enterprise Manager – это, видимо, наиболее простой способ создания, просмотра и модифицирования таблиц вашей базы данных. При создании или модифицировании таблицы или колонки с помощью Enterprise Manager система SQL Server автоматически берет на себя исполнение соответствующих команд T-SQL, выполняя эту работу за вас. (Пошаговые инструкции по созданию таблицы с помощью Enterprise Manager см. в лекции 10.) В этом разделе мы рассмотрим особенности использования Enterprise Manager для присваивания и модифицирования умолчания по колонке и создания Default-объекта. Это предпочтительный метод работы. Начнем с примеров присваивания и модифицирования умолчаний.

Присваивание и модифицирование умолчаний

Предположим, у нас имеется таблица с именем Product_Info в базе данных MyDB (рис. 16.3). (Инструкции по созданию этой таблицы с помощью Enterprise Manager см. в лекции 10.)

Чтобы определить умолчание, просто щелкните на имени колонки, которой хотите присвоить это умолчание, и введите значение по умолчанию в поле Default Value (Значение по умолчанию) вкладки Columns (Колонки) внизу окна. На рис. 16.3 колонке Description (Описание) присвоено значение по умолчанию "n/a"; это может быть значение-заполнитель, указывающее, что описание продукта еще не известно. Кроме того, значение по умолчанию заключено в круглые скобки – Enterprise Manager добавляет их автоматически, когда вы сохраняете таблицу.

Изменение значения по умолчанию происходит столь же просто. Замените исходное значение по умолчанию новым значением по умолчанию и сохраните свою работу, щелкнув на кнопке Save (Сохранить). На рис. 16.4 показано, что значение по умолчанию колонки Description изменено на "not available"; на рис. 16.5 показано умолчание "general merchandise" (обычные товары), добавленное к колонке Product_Name (Имя_продукта).

Окно Design Table (Разработка таблицы) для таблицы Product_Info


увеличить изображение

Рис. 16.3.  Окно Design Table (Разработка таблицы) для таблицы Product_Info

Примечание. Вводя символьную строку для значения по умолчанию, вы должны заключить ее в апострофы, иначе SQL Server выдаст сообщение об ошибке, когда вы попытаетесь сохранить соответствующее изменение.

Когда вы создаете или изменяете умолчание для существующей колонки с помощью Enterprise Manager, то, как и при использовании T-SQL, это не влияет на существующие строки таблицы: новое значение по умолчанию используется только при вставке новых строк. Если вы добавляете к таблице новую колонку и присваиваете ей значение по умолчанию, то в существующих строках данных этой колонке присваивается значение по умолчанию только в том случае, если не разрешено использование значений NULL. В противном случае эта новая колонка получит в существующих строках значение NULL. Чтобы разрешить использование значений NULL для новой колонки со вставкой значения по умолчанию в эту колонку для всех существующих строк, используйте метод, описанный в разделе "Оператор ALTER TABLE с атрибутом DEFAULT" выше в этой лекции.

Окно Design Table, где показано измененное значение по умолчанию


увеличить изображение

Рис. 16.4.  Окно Design Table, где показано измененное значение по умолчанию

 Окно Design Table, где показано добавленное значение по умолчанию


увеличить изображение

Рис. 16.5.  Окно Design Table, где показано добавленное значение по умолчанию

Создание Default-объектов и управление этими объектами

Вы можете также создавать Default-объект и просматривать существующие Default-объекты с помощью Enterprise Manager. Для просмотра существующих Default-объектов откройте Enterprise Manager, раскройте сервер и базу данных, которые хотите использовать, и щелкните на папке Defaults. Все существующие Default-объекты появятся в правой панели (рис. 16.6). Отметим, что показаны умолчания DF_not_applicable и DF_area_code, которые мы создали выше в этой лекции с помощью оператора CREATE DEFAULT.

 Просмотр существующих Default-объектов


увеличить изображение

Рис. 16.6.  Просмотр существующих Default-объектов

Чтобы создать новый Default-объект и выполнить привязку этого умолчания к колонке или определенному пользователем типу данных с помощью Enterprise Manager, выполните следующие шаги.

  1. Раскройте сервер и базу данных, щелкните правой кнопкой мыши на Defaults и выберите из контекстного меню пункт New Default (Создать умолчание), чтобы появилось окно Default Properties (Свойства умолчания) (рис. 16.7). Мы присвоим Default-объекту имя DF_none и значение "none". По окончании щелкните на кнопке OK.
  2. Для привязки вашего умолчания к определенному пользователем типу данных или к колонке щелкните правой кнопкой мыши в правой панели Enterprise Manager на имени этого умолчания (в данном случае – DF_none ) и выберите из контекстного меню пункт Properties (Свойства). Снова появится окно Default Properties, но теперь будут доступны кнопки Bind UDTs (Привязка к определенным пользователем типам) и Bind Columns (Привязка к колонкам).

     Окно Default Properties (Свойства умолчания)


    Рис. 16.7.  Окно Default Properties (Свойства умолчания)

    Щелкните на кнопке Bind UDTs, чтобы появилось диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных) (рис. 16.8). В этом диалоговом окне представлены все определенные пользователем типы данных. В этом списке вы можете выбрать определенный пользователем тип данных, к которому нужно выполнить привязку умолчания. На рис. 16.8 мы видим типы данных area_code и brand_type. Если вы определили другие типы данных, то они также появятся в вашем списке. По окончании щелкните на кнопке Apply (Применить) и затем – на кнопке OK, чтобы вернуться в окно Default Properties. Мы не будем выполнять привязку нашего умолчания к какому-либо определенному пользователем типу данных; мы выполним вместо этого привязку к колонке, как показано на следующем шаге.

      Диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных)


    Рис. 16.8.  Диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных)

  3. Для привязки умолчания к колонке щелкните на пункте Bind Columns (Привязка к колонкам), чтобы появилось диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам). Теперь выберите колонку, с которой хотите связать данное умолчание. Сначала выберите имя таблицы в раскрывающемся списке Table (Таблица). Затем в списке Unbound Columns (Колонки без привязки) выберите имя колонки, с которой хотите связать умолчание. Затем щелкните на кнопке Add (Добавить). На рис. 16.9 показано это диалоговое окно после добавления колонки phone таблицы customer_data к списку Bound Columns (Колонки с привязкой).

     Диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам))


    Рис. 16.9.  Диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам))

  4. Щелкните на кнопке OK, чтобы вернуться в окно Default Properties, и щелкните на кнопке OK еще раз, чтобы закрыть окно Default Properties.

Чтобы отменить привязку Default-объект а к определенному пользователем типу в окне Default Properties, откройте диалоговое окно Bind Default to User-defined Data Types, как это описано выше, и просто сбросьте флажок Bind. Чтобы отменить привязку Default-объект а к колонке, откройте диалоговое окно Bind Default to Columns, выделите имя этой колонки и затем щелкните на кнопке Remove (Удалить).

Чтобы удалить Default-объект, вы должны сначала отменить привязку этого умолчания ко всем другим объектам (как только что было описано). SQL Server возвратит сообщение об ошибке, если вы попытаетесь удалить умолчание, которое привязано к одному или нескольким объектам. Для удаления Default-объект а щелкните на папке Defaults в левой панели Enterprise Manager, щелкните правой кнопкой мыши на имени этого Default-объект а, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All (Удалить все) в появившемся диалоговом окне Drop Objects (Удаление объектов).

Ограничения

Ограничения автоматически обеспечивают целостность данных. Ограничения задают правила, которые определяют значения данных, допустимые для какой-либо колонки. Они позволяют ограничивать значения данных, которые вводятся в колонку, чтобы в этой колонке не оказались неверные значения. Например, с помощью ограничения вы можете ограничить значения колонки целого типа диапазоном от 1 до 100. В результате любые значения вне этого диапазона нельзя будет ввести в данную колонку. (Для создания этого диапазона вы можете использовать ограничение CHECK, как будет показано ниже.) Ограничение только по одной колонке называется ограничением колонки ; оно ограничивает значения только этой колонки. Ограничение, которое влияет на несколько колонок, называется ограничением таблицы, или табличным ограничением; в этом случае комбинация значений для колонок, указанных в данном ограничении, должна отвечать требованиям этого ограничения. Имеется пять типов ограничений: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY и CHECK.

Создание и модифицирование ограничений с помощью T-SQL

В этом разделе вы узнаете об использовании каждого типа ограничений и реализации ограничений с помощью T-SQL. В следующем разделе вы узнаете, как реализовывать ограничения с помощью Enterprise Manager.

Ограничение NOT NULL

Ограничение NOT NULL является довольно простым, и мы уже видели, как оно использовалось в примерах этой лекции и предыдущих лекций. Ограничение NOT NULL задается в описании колонки, чтобы воспрепятствовать вставке null -значений в эту колонку (в противоположность ограничению NULL, которое разрешает присваивать null -значения). При использовании T-SQL вы можете указать NOT NULL при создании таблицы или позже, когда будете модифицировать какую-либо колонку. (О модифицировании таблиц базы данных см. лекцию 10.) Вам следует использовать NOT NULL вместо NULL там, где это возможно, поскольку операции с null -значениями, такие как сравнения, сопряжены с большей дополнительной нагрузкой при обработке. Как уже говорилось выше в этой лекции, лучше использовать значение по умолчанию там, где это возможно, чем разрешать вставку null -значений.

Ограничение UNIQUE

Ограничение UNIQUE обеспечивает, что в колонке или наборе колонок не будут допускаться дублированные значения; иными словами, обеспечивается уникальность значений в этой колонке или наборе колонок. Для поддержки этой уникальности SQL Server создает по умолчанию уникальный некластеризованный индекс по колонке или колонкам, указанным в ограничении UNIQUE. Вы можете, однако, указывать, каким должен быть этот индекс – кластеризованным или некластеризованным. Напомним, что таблица может иметь только один кластеризованный индекс.

Примечание. Вы будете часто встречать в этой лекции термины "кластеризованный индекс" и "некластеризованный индекс". Не беспокойтесь, если вы не совсем понимаете, что означают эти термины, – в лекции 17 дается подробное описание этих типов индексов.

Ограничение UNIQUE можно использовать для любой колонки, которая не является частью ограничения PRIMARY KEY (описывается в следующем разделе), которое также обеспечивает уникальность значений. Ограничение UNIQUE можно использовать для колонок, в которых разрешены null -значения, в то время как ограничения PRIMARY KEY нельзя использовать для таких колонок. Null -значения не затрагиваются ограничениями UNIQUE. На колонку с ограничением UNIQUE может ссылаться ограничение FOREIGN KEY (см. раздел "Ограничение FOREIGN KEY" далее). По одной таблице можно задавать несколько ограничений UNIQUE, пока общее число индексов для этой таблицы не превышает 249 некластеризованных и одного кластеризованного индекса.

Чтобы создать ограничение UNIQUE по таблице с помощью T-SQL, используйте оператор CREATE TABLE или ALTER TABLE. Например, следующий оператор создает таблицу customer (покупатель) с ограничением UNIQUE по колонке SSN в виде кластеризованного индекса:

CREATE TABLE customer
(
first_name   		char(20) 	NOT NULL, 
mid_init     		char(1)  	NULL, 
last_name    		char(20) 	NOT NULL, 
SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
cust_phone   		char(10) 	NULL 
) 
GO

В этом операторе CREATE использовано ограничение по колонке. В следующем примере снова создается таблица, но на этот раз с добавлением табличного ограничения UNIQUE с именем UQ_full_name по колонкам first_name, mid_init и last_name:

CREATE TABLE customer
( 
first_name   		char(20) 	NOT NULL, 
mid_init     		char(1)  	NULL, 
last_name    		char(20) 	NOT NULL, 
SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
cust_phone   		char(10) 	NULL, 
CONSTRAINT   	UQ_full_name UNIQUE NONCLUSTERED (first_name,  
    				mid_init, last_name) 
) 
GO

Табличное ограничение UNIQUE (ограничение по более чем одной колонке) обеспечивает уникальность комбинаций значений по соответствующим колонкам. В данном случае в базу данных нельзя ввести двух покупателей, имеющих одинаковое сочетание имени (first_name), фамилии (last_name) и инициала отчества (mid_init). В одной или двух колонках может встретиться одинаковая комбинация, но не во всех трех колонках. Отметим, что в данном случае табличное ограничение UNIQUE является некластеризованным индексом, поскольку у нас уже имеется уникальный кластеризованный индекс по колонке SSN.

Чтобы добавить ограничение UNIQUE к существующей таблице, используйте оператор ALTER TABLE. Если вы пытаетесь модифицировать существующую колонку или колонки, добавляя ограничение UNIQUE, все существующие строки данной таблицы должны содержать уникальные значения или null -значения в этой колонке или колонках, иначе вы получите сообщение об ошибке и ограничение UNIQUE не будет добавлено. Предположим, что мы создали таблицу customer без каких-либо ограничений. Ниже приводятся два оператора для добавления ограничений по колонке и по таблице:

ALTER TABLE customer 
ADD CONSTRAINT UQ_ssn UNIQUE CLUSTERED (SSN) 
GO

ALTER TABLE customer 
ADD CONSTRAINT UQ_full_name UNIQUE NONCLUSTERED (first_name, mid_init, last_name) 
GO

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

Чтобы изменить существующее ограничение UNIQUE по какой-либо колонке или таблице с помощью T-SQL, вы должны сначала удалить соответствующее ограничение и затем снова создать его. Как и для умолчаний, вам следует использовать для ваших ограничений описательные имена, чтобы вы могли легко находить и удалять их без необходимости выяснения имен, присвоенных им системой SQL Server. При изменении ограничения с помощью Enterprise Manager система SQL Server автоматически удаляет старое ограничение и вновь создает его, когда вы сохраняете выполненные изменения (см. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее).

Ограничение PRIMARY KEY

Ограничение PRIMARY KEY используется, чтобы задать первичный ключ таблицы, представляемый колонкой или набором колонок, уникальным образом идентифицирующих строку таблицы. Поскольку первичный ключ идентифицирует строку, соответствующая колонка никогда не содержит значения NULL. В этом состоит отличие ограничения PRIMARY KEY от ограничения UNIQUE, которое допускает null-значения. Если вы определяете ограничение PRIMARY KEY по набору колонок, это ограничение указывает, что комбинация значений этих колонок должна быть уникальной для каждой строки, что аналогично ограничению UNIQUE по набору колонок. И, подобно ограничению UNIQUE, ограничение PRIMARY KEY не допускает дублированных значений. Если ограничение PRIMARY KEY присваивается колонке или набору колонок, то по этой колонке или колонкам первичного ключа автоматически создается уникальный индекс. Вы можете также задать для первичного ключа кластеризованный или некластеризованный индекс; если ничего не задано, по умолчанию создается кластеризованный индекс, если таблица еще не имеет кластеризованного индекса.

Таблица может иметь только одно ограничение PRIMARY KEY. Колонка с атрибутом IDENTITY хорошо подходит для первичного ключа, как и любая другая колонка или набор колонок, являющиеся уникальными для каждой строки. Например, в примере нашей таблицы customer мы могли бы создать колонку SSN как первичный ключ вместо создания для нее ограничения UNIQUE. Ограничение PRIMARY KEY не допускало бы null -значений и обеспечивало бы уникальность значений в колонке SSN, а по этой колонке первичного ключа был бы автоматически создан кластеризованный индекс. Следующий оператор T-SQL представляет один из способов задания колонки SSN как первичного ключа, когда вы определяете таблицу. При этом способе имя ограничению PRIMARY KEY присваивает SQL Server, поэтому он не является предпочтительным методом, так как в дальнейшем вам может потребоваться удаление данного ключа по имени.

CREATE TABLE 	customer
( 
first_name   		char(20) 	NOT NULL, 
mid_init     		char(1)  	NULL, 
last_name    		char(20) 	NOT NULL, 
SSN          		char(11) 	PRIMARY KEY, 
cust_phone   		char(10) 	NULL 
) 
GO

Используя альтернативный способ, вы можете присвоить имя этому ограничению, добавив ключевое слово CONSTRAINT. Чтобы присвоить имя PK_SSN вашему ограничению PRIMARY KEY, используйте следующий оператор:

CREATE TABLE 	customer
( 
first_name   		char(20) 	NOT NULL, 
mid_init     		char(1)  	NULL, 
last_name    		char(20) 	NOT NULL, 
SSN          		char(11) 	CONSTRAINT PK_SSN PRIMARY KEY, 
cust_phone   		char(10) 	NULL 
) 
GO

Вы можете также задать ограничение PRIMARY KEY после того, как определены все колонки таблицы. При использовании этого синтаксиса имя колонки должно быть заключено в круглые скобки и указано после предложения CONSTRAINT, как это показано в следующем операторе:

CREATE TABLE 	customer
( 
first_name   		char(20) 	NOT NULL, 
mid_init     		char(1)  	NULL, 
last_name    		char(20) 	NOT NULL, 
SSN          		char(11), 
cust_phone   		char(10) 	NULL, 
CONSTRAINT PK_SSN PRIMARY KEY (SSN) 
) 
GO

Чтобы добавить ограничение PRIMARY KEY к таблице, не имеющей ограничения PRIMARY KEY, используйте оператор ALTER TABLE. Следующий оператор добавляет ограничение PRIMARY KEY к таблице customer:

ALTER TABLE 	customer
ADD CONSTRAINT PK_SSN PRIMARY KEY CLUSTERED (SSN) 
GO

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

Чтобы удалить ограничение PRIMARY KEY, используйте оператор ALTER TABLE с предложением DROP CONSTRAINT. Ниже мы удаляем ограничение по колонке SSN:

ALTER TABLE customer
DROP CONSTRAINT PK_SSN
GO

Отметим, что для предложения DROP CONSTRAINT требуется только имя данного ограничения. Чтобы изменить существующее ограничение PRIMARY KEY по таблице с помощью операторов T-SQL, вы должны сначала удалить существующее ограничение и затем выполнить изменение таблицы, добавив новое ограничение. Это выполняется с помощью операторов ALTER TABLE...DROP CONSTRAINT и ALTER TABLE...ADD CONSTRAINT.

Ограничение FOREIGN KEY

Ограничение FOREIGN KEY определяет внешний ключ который задает связь между двумя таблицами. Колонка или колонки внешнего ключа одной таблицы ссылаются на потенциальный ключ (одна или несколько колонок) в другой таблице. При вставке строки в таблицу с ограничением FOREIGN KEY значения, которые должны быть внесены в колонку или колонки, определенные как внешний ключ, сравниваются со значениями в потенциальном ключе ссылочной таблицы. Если ни одна из строк ссылочной таблицы не соответствует значениям во внешнем ключе, то вставка новой строки не выполняется. Но если значения внешнего ключа, которые нужно внести в таблицу, все же имеются в потенциальном ключе другой таблицы, то вставка новой строки будет выполнена. Если значение, которое должно быть занесено в таблицу с ограничением FOREIGN KEY, равно NULL, то это тоже допустимо.

Проверка ограничений FOREIGN KEY происходит также в тех случаях, когда вы хотите обновить какую-либо строку в ссылочной таблице или в таблице с внешним ключом. Вы не сможете обновить какое-либо значение потенциального ключа или внешнего ключа, если это приведет к нарушению ограничения. Существует одно исключение из этого правила, когда вы обновляете ссылочную таблицу с помощью опции ON UPDATE CASCADE оператора T-SQL CREATE TABLE. (См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.) Кроме того, ограничения FOREIGN KEY проверяются, если вы хотите удалить какую-либо строку из ссылочной таблицы. Вы не сможете удалить строку из ссылочной таблицы, если строка какой-либо таблицы с внешним ключом (таблицы, содержащей ограничение FOREIGN KEY ) содержит ссылку на значение в колонке внешнего ключа.

Иными словами, для каждой строки в таблице с внешним ключом должна существовать соответствующая строка в ссылочной таблице, и эту строку нельзя удалить, пока на нее имеется ссылка. Существует также исключение из этого правила: вы можете удалить строку из ссылочной таблицы с помощью опции ON DELETE CASCADE оператора T-SQL CREATE TABLE.(См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.)

Внешний ключ может ссылаться только на те колонки, которые содержат в ссылочной таблице ограничение PRIMARY KEY или UNIQUE. Если вы попытаетесь создать внешний ключ, который ссылается на колонку, не являющуюся частью одного из этих ограничений, то SQL Server возвратит сообщение об ошибке. Кроме того, тип данных и размер колонки или колонок внешнего ключа должны совпадать со ссылочной колонкой или колонками.

Чтобы получить более ясное представление о внешних ключах, рассмотрим некоторые примеры. Сначала мы создадим таблицу с именем items (товары), которая содержит ограничение PRIMARY KEY по колонке item_id (идентификатор товара), как в следующем операторе:

CREATE TABLE 	items
( 
item_name  		char(15)     	NOT NULL, 
item_id     	smallint     	NOT NULL IDENTITY(1,1), 
price       	smallmoney   	NULL, 
item_desc   	varchar(30)  	NOT NULL DEFAULT 'none', 
CONSTRAINT  	PK_item_id   	PRIMARY KEY (item_id) 
) 
GO

Затем мы создадим таблицу с именем inventory, содержащую ограничение FOREIGN KEY с именем FK_item_id, которое ссылается на колонку item_id в таблице items, как в следующем операторе:

CREATE TABLE 	inventory
( 
store_id        	tinyint    	NOT NULL, 
item_id         	smallint   	NOT NULL,  
item_quantity   	tinyint    	NOT NULL, 
CONSTRAINT      	FK_item_id 	FOREIGN KEY (item_id)  
REFERENCES      	items(item_id) 
) 
GO

Чтобы увидеть, каким образом связаны эти таблицы, мы создадим схему (диаграмму) базы данных (рис. 16.10). (Инструкции по созданию схемы базы данных см. в лекции 15.) В данном примере items – это ссылочная таблица с потенциальным ключом item_id. Это единственно возможный потенциальный ключ, поскольку он является первичным ключом в данной таблице и эта таблица не содержит никаких ограничений UNIQUE. Напомним, что только колонки первичного ключа и колонки с ограничениями UNIQUE является допустимыми потенциальными ключами. Таблица inventory содержит ограничение FOREIGN KEY, определенное по ее колонке item_id. С помощью этого ограничения создается связь по внешнему ключу между этими двумя таблицами. Обе связанные колонки имеют тип данных smallint. Ограничение FOREIGN KEY в таблице inventory по колонке item_id гарантирует, что в колонку item_id нельзя ввести никакое значение, если этого значения нет в колонке item_id таблицы items. Иными словами, если товар отсутствует в таблице items, то он не может присутствовать в таблице inventory. Кроме того, из таблицы items нельзя удалить строку, если на нее имеется ссылка из какой-либо строки в таблице inventory. Иными словами, если какой-либо товар присутствует в таблице items и таблице inventory, этот товар нельзя удалить из таблицы items, пока он присутствует в таблице inventory. Теперь вы, вероятно, поняли, что внешние ключи используются для поддержки согласованности базы данных. Например, в данном случае вам не нужна информация о допустимости какого-либо товара в таблицах, если не существует записи об этом товаре в таблице items, предназначенной для хранения записей по каждому имеющемуся товару.

Схема базы данных, где показана связь по внешнему ключу между таблицами items и inventory


увеличить изображение

Рис. 16.10.  Схема базы данных, где показана связь по внешнему ключу между таблицами items и inventory

Чтобы модифицировать ограничение FOREIGN KEY с помощью операторов T-SQL, вы должны сначала удалить старое ограничение и затем создать новое с помощью оператора ALTER TABLE. Этот метод действует аналогично модифицированию ограничения PRIMARY KEY. Ниже приводятся операторы для удаления исходного ограничения по таблице inventory и последующего добавления нового ограничения:

ALTER TABLE inventory
DROP CONSTRAINT FK_item_id 
GO 

ALTER TABLE inventory 
ADD CONSTRAINT FK_item_id FOREIGN KEY (item_id)  
REFERENCES items(item_id) 
GO

Если вы добавляете ограничение FOREIGN KEY к существующей колонке таблицы, SQL Server проверяет существующие строки таблицы, чтобы убедиться в том, что для значений этой колонки (за исключением null -значений) имеются соответствующие значения в колонке с ограничением PRIMARY KEY или UNIQUE ссылочной таблицы. Чтобы создать ограничение FOREIGN KEY без проверки системой SQL Server совпадения с существующими значениями, вы должны использовать опцию WITH NOCHECK оператора ALTER TABLE, как это показано ниже:

ALTER TABLE inventory
WITH NOCHECK ADD CONSTRAINT FK_item_id  
FOREIGN KEY (item_id) 
REFERENCES items(item_id) 
GO

Опция WITH NOCHECK препятствует тому, чтобы SQL Server проверял существующие строки таблицы, и это позволяет добавить соответствующее ограничение к таблице независимо от существующих значений. После добавления этого ограничения SQL Server обеспечивает целостность по внешнему ключу для новых строк.

Внимание. Будьте осторожны, используя опцию WITH NOCHECK, если вы планируете выполнить в дальнейшем обновление существующих данных. Обновление не будет выполнено, если его пытаются применить к строке, содержащей в колонке внешнего ключа значение, не согласующееся с этим ограничением.

Вы можете также активизировать или отключать использование ограничения FOREIGN KEY. Если вы хотите ввести строку, которая не согласуется с существующим ограничением, то можете временно отключить это ограничение, ввести строку и затем снова активизировать ограничение. Ключевое слово NOCHECK указывает, что данное ограничение следует игнорировать (отключить), а ключевое слово CHECK указывает, что ограничение следует активизировать. Следующие операторы выполняют отключение и повторную активизацию ограничения FOREIGN KEY с помощью ключевых слов NOCHECK и CHECK:

ALTER TABLE inventory
NOCHECK CONSTRAINT FK_item_id    	--Отключает ограничение
GO

—Здесь должен быть оператор INSERT
GO

ALTER TABLE inventory          
CHECK CONSTRAINT FK_item_id      	--Повторно активизирует ограничение
GO
Внимание. Вам не следует выполнять вставку строки данных, не согласующейся с ограничением FOREIGN KEY, если это не является крайней необходимостью. Если вы все же сделаете это, то, возможно, не сможете выполнять дальнейшие обновления.
Ограничение CHECK

Ограничение CHECK используется, чтобы ограничить множество допустимых для колонки значений определенными значениями. Значения, которые используются при вставке в колонку или обновлении колонки, проверяются на истинность (значение TRUE ) указанного в ограничении булева условия поиска. Например, если бы нам нужно было ограничить диапазон возможных значений, допустимых для колонки price (цена) таблицы items, величинами от $0,01 до $500,00, то мы использовали бы следующий оператор:

CREATE TABLE items
( 
item_name   		char(15)    	NOT NULL, 
item_id     		smallint    	NOT NULL IDENTITY(1,1), 
price       		smallmoney  	NULL, 
item_desc   		varchar(30) 	NOT NULL DEFAULT 'none', 
CONSTRAINT  	PK_item_id  	PRIMARY KEY (item_id), 
CONSTRAINT  	CK_price    	CHECK (price >= .01 AND  
    						price <= 500.00) 
) 
GO

Отметим, что мы разрешили использование значений NULL в колонке price и задали ограничение CHECK по этой колонке. Поскольку SQL Server может отличить null -значение от любого другого типа значений, в колонке price, несмотря на ограничение CHECK, разрешены значения NULL. Кроме того, отметим, что мы присвоили этому ограничению имя CK_price. Как мы уже видели, присваивание имени ограничению упрощает последующее удаление и повторное создание этого ограничения по имени с помощью T-SQL. Например, чтобы изменить множество допустимых значений на диапазон от $1,00 до $1000,00, используйте следующий оператор:

ALTER TABLE items
DROP CONSTRAINT CK_price 
GO 
 
ALTER TABLE items 
ADD CONSTRAINT CK_price CHECK (price >= 1.00 AND  
    	 price <= 1000.00) 
GO

Второй оператор ALTER TABLE имел бы такой же вид, если бы вы добавляли это ограничение к существующей таблице items в первый раз. При добавлении ограничения CHECK к существующей таблице применяются те же правила, что и при добавлении ограничения FOREIGN KEY. Существующие строки будут проверяться на соответствие этому ограничению. Если не все строки дают при проверке значение TRUE, то ограничение не добавляется к таблице и SQL Server возвращает сообщение об ошибке, информирующее, что оператор ALTER TABLE создает конфликтную ситуацию из-за ограничения CHECK. Если вы все же должны добавить это ограничение, используйте опцию WITH NOCHECK, чтобы указать, что должны проверяться только последующие обновления и добавляемые строки, но не существующие строки.

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

Вот пример использования WITH NOCHECK при добавлении ограничения CK_price:

ALTER TABLE items
WITH NOCHECK ADD CONSTRAINT CK_price  
CHECK (price >= 1.00 AND price <= 1000.00) 
GO

Вы можете также активизировать и отключать ограничение CHECK (как и ограничение FOREIGN KEY ) с помощью ключевых слов CHECK и NOCHECK, используемых с командой ALTER TABLE. Вам может потребоваться этот метод, например, для вставки цены, выходящей за указанный диапазон. В следующем примере выполняется отключение и последующая повторная активизация ограничения CHECK с именем CK_price:

ALTER TABLE items
NOCHECK CONSTRAINT CK_price    	--Отключает ограничение     
GO 
 
--Здесь должен быть оператор INSERT
GO 

ALTER TABLE items
CHECK CONSTRAINT CK_price      	--Повторно активизирует ограничение
GO
Примечание. CHECK и FOREIGN KEY – это единственные типы ограничений, которые можно отключать и активизировать таким способом.
Создание и модифицирование ограничений с помощью Enterprise Manager

В этом разделе вы узнаете, как создавать, модифицировать и удалять ограничения в Enterprise Manager с помощью окна Design Table и (в случае ограничений FOREIGN KEY ) с помощью схемы базы данных. (Инструкции по созданию схемы базы данных см. в лекции 15.) Окно Design Table появляется, когда вы создаете или редактируете таблицу с помощью Enterprise Manager. Чтобы создать таблицу, раскройте в левой панели Enterprise Manager папку сервера и папку базы данных, щелкните правой кнопкой мыши на папке Tables (Таблицы) и затем выберите из контекстного меню пункт New Table (Создать таблицу). Чтобы появилось окно Design Table для какой-либо существующей таблицы, сначала щелкните на папке Tables, щелкните правой кнопкой мыши на имени этой таблицы в правой панели и затем выберите из контекстного меню пункт Design Table.

Разрешение использовать null-значения

Чтобы указать, можно или нельзя использовать null -значения в какой-либо колонке, просто установите или сбросьте соответствующий флажок в колонке Allow Nulls (Разрешить null -значения) окна Design Table. Вы можете задать этот параметр при создании таблицы или при ее модифицировании. (Правила для разрешения null -значений см. в лекции 10.) На рис. 16.11 показано окно Design Table для таблицы customer (см. раздел "Создание и модифицирование ограничений с помощью T-SQL" выше в этой лекции). Как видно из рисунка, null -значения допускаются в колонках mid_init и cust_phone, но в остальных трех колонках не допускаются.

Окно Design Table для таблицы customer с установленными флажками в столбце Allow Nulls.


увеличить изображение

Рис. 16.11.  Окно Design Table для таблицы customer с установленными флажками в столбце Allow Nulls.

Ограничение UNIQUE

Чтобы создать или модифицировать ограничение UNIQUE с помощью Enterprise Manager, выполните следующие шаги:

  1. В панели инструментов окна Design Table щелкните на кнопке Table аnd Index Properties (Свойства таблицы и индексов) (кнопка справа от кнопки Save) и затем щелкните на вкладке Indexes/Keys (Индексы/Ключи) в появившемся окне Properties (Свойства). На рис. 16.12 показана вкладка Indexes/Keys окна Properties для таблицы customer. В этой вкладке будут представлены любые ограничения UNIQUE, поскольку они реализуются в виде уникальных индексов.

    Данная таблица создана с помощью следующего оператора, содержащего ограничение UNIQUE в виде кластеризованного индекса по колонке SSN. (SQL Server автоматически присвоил этому индексу имя UQ_customer_398D8EEE; именно поэтому удобнее присваивать ваши собственные имена ограничениям и индексам.)

    CREATE TABLE customer
    (
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO

    Вкладка Indexes/Keys окна Properties для таблицы customer


    Рис. 16.12.  Вкладка Indexes/Keys окна Properties для таблицы customer

  2. Создание нового ограничения UNIQUE начните со щелчка на кнопке New (Создать) вкладки Indexes/Keys окна Properties. Выберите имена колонок, которые хотите включить в ограничение, введите имя этого нового ограничения и затем установите флажок Create UNIQUE (Создать ограничение UNIQUE ). Установите флажок Create As CLUSTERED (Создать как кластеризованный индекс), если вы хотите, чтобы это был кластеризованный индекс по данной таблице, и задайте, если хотите, коэффициент заполнения (поле Fill factor). Если вы не хотите, чтобы SQL Server автоматически пересчитывал статистику по этому индексу через определенные периоды, установите также флажок Don’t automatically recompute statistics.
  3. Вы можете использовать окно Properties для модифицирования ограничения UNIQUE ; например, вы можете изменять имя ограничения, указывать колонки, к которым присоединяется это ограничение, задавать ограничение как кластеризованный индекс и выбирать коэффициент заполнения для индекса. (О коэффициенте заполнения см. лекцию 17.) Внесите в это ограничение нужные вам изменения. По окончании щелкните на кнопке Close (Закрыть) и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений.>
Ограничение PRIMARY KEY

Вы можете задать ограничение PRIMARY KEY по одной колонке или по нескольким колонкам. Эта колонка или колонки должны уникальным образом идентифицировать каждую строку таблицы. Чтобы задать ограничение PRIMARY KEY, выполните следующие шаги:

  1. В окне Design Table выберите колонку, щелкнув на одной из ячеек в ее строке. (Вы можете выбрать несколько колонок, удерживая клавишу Ctrl и щелкая на серых ячейках слева от имен колонок.)
  2. Щелкните правой кнопкой мыши на одной из выбранных колонок и выберите из контекстного меню пункт Set Primary Key (Задать первичный ключ). Слева от колонок, которые вы задали для первичного ключа, появится изображение небольшого ключа. На рис. 16.13 показано окно Design Table для таблицы customer после указания колонки SSN как первичного ключа. Кроме того, из колонки SSN было удалено ограничение UNIQUE путем удаления уникального индекса, поскольку нет необходимости одновременно иметь ограничение UNIQUE и ограничение PRIMARY KEY по одной колонке.

     Задание ограничения PRIMARY KEY в окне Design Table


    увеличить изображение

    Рис. 16.13.  Задание ограничения PRIMARY KEY в окне Design Table

  3. Если вам нужно переместить ограничение PRIMARY KEY в другую колонку, просто задайте эту новую колонку как первичный ключ. От вас не требуется удалить сначала явным образом исходный первичный ключ – SQL Server удалит и снова создаст для вас индекс PRIMARY KEY. Вы можете также модифицировать индекс PRIMARY KEY в окне Properties. И снова напомним, что ваши изменения начнут действовать после того, как вы сохраните вашу работу, щелкнув на кнопке Save в панели инструментов.
    Примечание. Если вы изменили ограничение PRIMARY KEY по таблице, уже содержащей данные, то повторное создание индекса может занять некоторое время. Если ваша таблица содержит много данных и вы задали существенное изменение по данному индексу, такое как изменение колонок индекса или кластеризованности, то вам следует по возможности выполнять этот вид изменений в периоды незначительного использования базы данных.
Ограничение FOREIGN KEY

Чтобы создать или модифицировать ограничение FOREIGN KEY с помощью Enterprise Manager, вы можете использовать окно Design Table или создать схему базы данных с таблицами, которые будут включены в связь по внешнему ключу. Лучше всего создавать связи по внешнему ключу во время создания таблиц (или хотя бы до того, как начнется вставка данных в таблицы). Причину этого вы узнаете из следующего примера. Сначала мы рассмотрим, как использовать окно Design Table для создания ограничения FOREIGN KEY. Мы создадим связь по внешнему ключу между двумя таблицами, описанными выше в этой лекции, – items и inventory. Мы повторно создадим таблицу items с ограничением PRIMARY KEY (которое использовали раньше), но без свойства IDENTITY по колонке item_id, так как будем работать с примером, где происходит обновление этой колонки, а вы не сможете обновлять колонку со свойством IDENTITY без выполнения некоторой дополнительной работы. Кроме того, мы повторно создадим таблицу inventory без ограничения FOREIGN KEY, чтобы его можно было добавить позже. Ниже приводятся операторы CREATE TABLE, используемые для обеих таблиц:

CREATE TABLE items
( 
item_name   		char(15)     	NOT NULL, 
item_id     		smallint     	NOT NULL, 
price       		smallmoney   	NULL, 
item_desc   		varchar(30)  	NOT NULL DEFAULT 'none', 
CONSTRAINT  	PK_item_id   	PRIMARY KEY (item_id) 
) 
GO

CREATE TABLE 	inventory 
( 
store_id        		tinyint    	NOT NULL, 
item_id         		smallint   	NOT NULL,  
item_quantity   		tinyint    	NOT NULL 
) 
GO

Чтобы добавить ограничение FOREIGN KEY по таблице inventory, выполните следующие шаги:

  1. Щелкните правой кнопкой мыши на имени таблицы inventory в правой панели Enterprise Manager и выберите пункт Design Table. Щелкните правой кнопкой мыши на свободном месте этого окна и выберите из контекстного меню пункт Relationships (Связи). Появится окно Properties с открытой вкладкой Relationships (рис. 16.14).
  2. Щелкните на кнопке New. Появится данные по умолчанию (рис. 16.15).
  3. Мы выбираем для таблицы первичного ключа таблицу items (вместо customer) и колонку item_id для связи по внешнему ключу между таблицами items и inventory. Для этого просто щелкните на одной из пустых строк под именами таблиц, и в спускающемся меню появится список выбора допустимых колонок. После того как выбраны соответствующие таблицы для связи, имя в поле Relationship Name (Имя связи) изменится (рис. 16.16).

    Вкладка Relationships (Связи) окна Properties (Свойства)  для таблицы inventory


    Рис. 16.14.  Вкладка Relationships (Связи) окна Properties (Свойства) для таблицы inventory

     Вкладка Relationships (Связи) с данными по умолчанию  после щелчка на кнопке New (Создать)


    Рис. 16.15.  Вкладка Relationships (Связи) с данными по умолчанию после щелчка на кнопке New (Создать)

    Вкладка Relationships, где показана связь по внешнему ключу между таблицами items и inventory


    Рис. 16.16.  Вкладка Relationships, где показана связь по внешнему ключу между таблицами items и inventory

  4. Внизу этого окна имеется несколько флажков (рис. 16.17). Установите флажок Check existing data on creation (Проверять существующие данные при создании), если вы хотите, чтобы SQL Server проверял существующие данные на связь по внешнему ключу. Если данные не согласуются, то ограничение не будет создано. Сбросьте этот флажок только в тех случаях, когда у вас еще нет данных или вы знаете, что существующие данные уже согласованы с этим ограничением, или вы не хотите по какой-либо причине, чтобы существующие данные были согласованы с ограничением. Но это может вызвать проблемы, если вы попытаетесь в дальнейшем обновить или удалить одну из существующих строк.
  5. Следующий флажок – это Enable relationship for replication (Активизировать связь для репликации). Не устанавливайте его, если вы не используете репликацию. Но даже если вы используете репликацию, вам все же не нужно устанавливать этот флажок, поскольку данные будут проверяться на согласованность с данным ограничением уже в исходных таблицах, поэтому их не обязательно проверять при репликации. Если вы все же активизировали связь для репликации и если расписания репликации этих двух таблиц не синхронизированы в достаточной степени, то вы получите ошибки во время репликации, указывающие, что какая-либо строка не может быть реплицирована, поскольку в ней нарушено ограничение по внешнему ключу.
  6. Следующий флажок – это Enable relationship for INSERT and UPDATE (Активизировать связь для операций INSERT и UPDATE). Установка этого флажка означает, что ограничение FOREIGN KEY будет проверяться при вставках и обновлениях, а также при удалениях. Если это является вашим намерением, установите данный флажок. Станут доступны два находящихся ниже флажка. Это флажки Cascade Update Related Fields (Каскадировать связанные с обновлением поля) и Cascade Delete Related Records (Каскадировать связанные с удалением записи). (Записью называется строка данных.)

    Вкладка Relationships, где показаны установленные флажки


    Рис. 16.17.  Вкладка Relationships, где показаны установленные флажки

  7. Установка флажка Cascade Update Related Fields означает, что если вы обновляете ссылочную колонку ссылочной таблицы (например, обновляете значение колонки item_id в таблице items ), то это обновление будет каскадироваться в таблицу с внешним ключом. (В данном случае – то же самое значение колонки item_id будет обновлено, если оно имеется в таблице inventory.) Будет обновлено только значение данной колонки; остальная информация строки в таблице с внешним ключом останется без изменений. Установка этого флажка позволяет также выполнять обновление ссылочной колонки. Если вы не установите этот флажок, то система не позволит вам выполнить обновление ссылочной колонки, если она существует в таблице с внешним ключом. Вы получите от SQL Server сообщение об ошибке, аналогичное следующему: "UPDATE statement conflicted with COLUMN REFERENCE constraint "FK_inventory_items". The conflict occurred in database "MyDB", table "inventory", column "item_id". The statement has been terminated."

    (Конфликт оператора UPDATE с ограничением COLUMN REFERENCE "FK_inventory_items". Конфликт возник в базе данных "MyDB", таблица "inventory", колонка "item_id". Работа оператора прекращена.)

  8. Установка флажка Cascade Delete Related Records означает, что удаление из ссылочной таблицы будет каскадироваться в таблицу с внешним ключом. Например, если удаляется строка в таблице items, а строка в таблице inventory имеет в колонке item_id то же значение, что и удаленная строка, то эта строка также будет удалена из таблицы inventory. Это позволяет поддерживать согласованность вашей информации. Если вы не установите этот флажок, то система не позволит вам удалить строку из ссылочной таблицы, если на нее имеется ссылка в строке таблицы с внешним ключом. Вы получите сообщение об ошибке от SQL Server, аналогичное следующему: "DELETE statement conflicted with COLUMN REFERENCE constraint "FK_inventory_items". The conflict occurred in database "MyDB", table "inventory", column "item_id". The statement has been terminated."

    (Конфликт оператора DELETE с ограничением COLUMN REFERENCE "FK_inventory_items". Конфликт возник в базе данных "MyDB", таблица "inventory", колонка "item_id". Работа оператора прекращена.)

  9. После установки флажков щелкните на кнопке Close и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений. Появится другое окно, информирующее, что перечисленные таблицы будут сохранены в вашей базе данных; в список входят две таблицы, связанные по внешнему ключу. Для завершения щелкните на кнопке Yes. Затем вы можете закрыть окно Design Table, щелкнув на кнопке Close в верхнем правом углу этого окна (но не окна Enterprise Manager, иначе вы закроете Enterprise Manager).

Существует другой метод, который можно использовать для создания или модифицирования ограничения FOREIGN KEY: использование схемы базы данных. Чтобы изучить создание и модифицирование ограничения FOREIGN KEY с помощью схемы базы данных, мы сформируем схему, используя те же две таблицы, что и в предыдущем примере: items и inventory. Сначала мы рассмотрим схему базы данных с этими таблицами без связи по внешнему ключу и затем добавим внешний ключ. Начальная схема базы данных показана на рис. 16.18).

 Схема базы данных для таблиц items и inventory


Рис. 16.18.  Схема базы данных для таблиц items и inventory

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

  1. Щелкните на крайней левой ячейке (серый квадрат) строки для колонки item_id таблицы items и, удерживая кнопку мыши, перетащите курсор мыши на таблицу inventory. (Вы увидите пунктирную линию, сопровождающую курсор.) Отпустите кнопку мыши, когда окажетесь на строке для колонки item_id таблицы inventory. Появится диалоговое окно Create Relationship (Создать связь), показанное на рис. 16.19. Оно устроено аналогично окну Properties (окна Design Table), которое было показано выше. Колонка item_id появится в столбце каждой таблицы этого диалогового окна, указывая, что связь по внешнему ключу будет задана между двумя колонками item_id.

    В Диалоговое окно Create Relationship (Создать связь), где показана предложенная связь по внешнему ключу


    Рис. 16.19.  В Диалоговое окно Create Relationship (Создать связь), где показана предложенная связь по внешнему ключу

  2. Если нужно, вы можете изменить имя этой связи. Установите или сбросьте флажки внизу этого диалогового окна, чтобы выбрать нужные вам опции. Эти флажки были описаны выше в этой лекции.
  3. По окончании щелкните на кнопке OK, чтобы создать в схеме связь между таблицами (рис. 16.20). (Она еще не сохранена.) Линия с изображением ключа направлена от таблицы с внешним ключом к ссылочной таблице.

      Схема базы данных, где показана связь по внешнему ключу


    Рис. 16.20.  Схема базы данных, где показана связь по внешнему ключу

  4. Щелкните на кнопке Save, чтобы сохранить ваши изменения. У вас будет запрошено имя схемы базы данных, и затем нужно будет подтвердить внесение изменений в соответствующие таблицы. Для завершения щелкните на кнопке Yes.

Чтобы модифицировать ограничение FOREIGN KEY, вы можете использовать аналогичным образом оба метода, описанных в данном разделе. В окне Design Table снова откройте вкладку Relationships, внесите изменения и сохраните свою работу. В схеме базы данных щелкните правой кнопкой мыши на линии связи по внешнему ключу и выберите пункт Properties для внесения изменений в соответствующее ограничение или выберите пункт Delete Relationship From Database (Удалить связь из базы данных), чтобы полностью удалить это ограничение. Если нужно, вы можете затем создать новое ограничение.

Ограничение CHECK

Чтобы создать ограничение CHECK с помощью окна Design Table, откройте это окно для таблицы, с которой хотите работать, и выполните следующие шаги.

  1. Щелкните правой кнопкой мыши на окне Design Table и выберите из контекстного меню пункт Properties, чтобы появилось окно Properties. Щелкните на вкладке Check Constraints (Ограничения Check) (рис. 16.21) и щелкните на кнопке New для таблицы items.

     Вкладка Check Constraints (Ограничения Check) окна Properties


    Рис. 16.21.  Вкладка Check Constraints (Ограничения Check) окна Properties

  2. Далее введите выражение, которое хотите использовать для проверки данных, которые будут вводиться или обновляться. В нашем примере мы добавим ограничение CHECK по колонке price таблицы items, чтобы можно было помещать значения только от $1,00 до $1000,00 (рис. 16.22).
  3. Обратите внимание на три флажка внизу этого окна. Установка флажка Check existing data on creation означает, что существующие данные таблицы будут проверяться на соответствие ограничению CHECK и если они не согласуются, то ограничение не будет создано. Установка флажка Enforce constraint for replication (Проверять ограничение для репликации) означает, что данное ограничение будет проверяться при репликации данных. Данные проверяются перед тем, как они попадут в исходную таблицу, т.е. установка этого флажка означает, что во время репликации будет выполняться повторная (т.е. ненужная) проверка данных. Установка флажка Enforce constraint for INSERTs and UPDATEs (ограничение для INSERT и UPDATE ) просто означает, что ограничение CHECK будет активизировано. Если не установить этот флажок, то данное ограничение будет создано, но оно не будет активизировано, т.е. не будет оказывать никакого влияния.

      Добавление ограничения CHECK по колонке price таблицы items


    Рис. 16.22.  Добавление ограничения CHECK по колонке price таблицы items

  4. Щелкните на кнопке Close и затем щелкните на кнопке Save, чтобы сохранить новое ограничение. Чтобы модифицировать ограничение CHECK, используйте вкладку Check Constraint для изменения имени (Constraint name), выражения (Constraint expression) и флажков. На рис. 16.23 ограничение CHECK по колонке price изменено, с диапазона от $1,00 до $1000,00 на диапазон от $1,00 до $99,00.

Отметим, флажок Check existing data on creation теперь сброшен, поскольку ограничение уже было создано. Если вы хотите проверить существующие данные на соответствие модифицированному диапазону, установите этот флажок. Если эта проверка не проходит для существующих данных, то вы получите сообщение об ошибке и ограничение не будет модифицировано.

Вы можете также использовать вкладку Check Constraints для удаления ограничения CHECK, выбрав в списке Selected Constraint (Выбранное ограничение) имя ограничения, которое хотите удалить, и щелкнув на кнопке Delete.

  Модифицирование ограничения CHECK


Рис. 16.23.  Модифицирование ограничения CHECK

Объекты типа Rule

Альтернативой использованию ограничения CHECK является создание объекта типа Rule (Rule-объекта) для ограничения значений, которые можно поместить или изменить в колонке. Rule-объект аналогичен Default-объекту в том, что он создается отдельно от таблицы и не удаляется при удалении таблицы. Вы должны также выполнить привязку Rule-объекта к колонке или к определенному пользователем типу – в данном случае – с помощью системной хранимой процедуры sp_bindrule. И, подобно Default-объекту, Rule-объекты включены в SQL Server 2000 для обратной совместимости с предыдущими версиями. Использование ограничения CHECK является предпочтительным методом ограничения значений колонок, но Rule-объекты полезно использовать, когда одно правило нужно использовать для нескольких колонок или определенных пользователем типов.

Создание Rule-объекта с помощью T-SQL

В качестве примера мы создадим Rule-объект, который выполняет ту же функцию, что и ограничение CHECK, которое мы создали выше. Наше правило использует имя переменной @price для ссылки на колонку price таблицы items. Имя переменной должно начинаться с символа "@", а имя можете выбрать произвольно. Сначала мы создадим данное правило и затем выполним его привязку к колонке, как это показано ниже:

USE MyDB
GO 
CREATE RULE price_rule AS 
(@price >= .01 AND @price <= 500.00) 
GO 
sp_bindrule 'price_rule', 'items.price', 'futureonly' 
GO

Для отмены привязки правила и его удаления используйте следующий оператор:

sp_unbindrule 'items.price'
GO 
DROP RULE price_rule 
GO

Для процедур sp_bindrule и sp_unbindrule указываются те же параметры, что и для процедур sp_bindefault и sp_unbindefault (см. раздел "Оператор CREATE DEFAULT и процедура sp_bindefault" выше в этой лекции). Каждая колонка или определенный пользователем тип может иметь только одно правило, хотя вы можете одновременно присвоить одной колонке или определенному пользователем типу правило и одно или несколько ограничений CHECK. Если вы сделаете это, SQL Server будет применять правило и все ограничения к данным таблицы при их вставке или обновлении.

Создание Rule-объекта с помощью Enterprise Manager

Чтобы использовать Enterprise Manager для создания и привязки Rule-объекта, выполните следующие шаги.

  1. Раскройте имя сервера и имя базы данных в Enterprise Manager. Щелкните правой кнопкой мыши на Rules (Правила) и затем выберите из контекстного меню пункт New Rule (Создать правило), чтобы появилось окно Rule Properties (Свойства правила). В данном примере мы зададим имя правила price_rule и добавим текст (рис. 16.24). Щелкните на кнопке OK, чтобы создать данный Rule-объект.

      Окно Rule Properties (Свойства правила) для создания правила


    Рис. 16.24.  Окно Rule Properties (Свойства правила) для создания правила

  2. Для привязки правила щелкните на Rules в левой панели Enterprise Manager, щелкните правой кнопкой мыши на новом правиле и затем выберите из контекстного меню пункт Properties, чтобы появилось окно Rule Properties. Как и в случае привязки Default-объектов, щелкните на кнопке Bind UDTs для привязки данного правила к определенному пользователем типу или щелкните на Bind Columns для привязки данного правила к колонке или к колонкам. В данном примере мы щелкнем на кнопке Bind Columns и выберем колонку price таблицы items для привязки к ней правила (рис. 16.25).

      Привязка правила к колонке


    Рис. 16.25.  Привязка правила к колонке

  3. Щелкните на кнопке OK, чтобы применить ваше правило, и затем снова щелкните на кнопке OK, чтобы закрыть окно Rule Properties

Чтобы удалить правило, вы должны сначала отменить привязку правила ко всем колонкам или определенным пользователем типам. После отмены привязки правила щелкните правой кнопкой мыши на имени этого правила, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All в диалоговом окне Drop Objects. Если имеется привязка правила к какой-либо колонке, когда вы пытаетесь удалить его, то SQL Server выведет сообщение об ошибке и не удалит данное правило.

Заключение

В этой лекции вы узнали об умолчаниях и пяти типах ограничений, которые можно задать по колонке или таблице; вы также узнали, как создавать и модифицировать умолчания и ограничения с помощью T-SQL и Enterprise Manager. Кроме того, узнали, как создавать и модифицировать умолчания и правила с помощью Default-объектов и Rule-объектов. Умолчания позволяют задавать для колонки значение по умолчанию, когда не задано конкретное значение. Ограничения можно использовать различными способами для обеспечения целостности данных в вашей базе данных. Умолчания и ограничения является полезными средствами, если они продуманно применяются к вашим таблицам базы данных. В лекции 17 мы рассмотрим использование индексов в SQL Server, включая кластеризованные и некластеризованные индексы. Использование индексов может в огромной степени увеличить эффективность доступа к данным.

Лекция 17. Создание и использование индексов

Чем больше становится ваша база данных, тем, вероятнее всего, возрастает количество и сложность запросов. Для повышения эффективности производительности запросов путем снижения количества операций ввода-вывода используются индексы. Некоторые аспекты из теории программирования необходимо знать для лучшего усвоения материала. Рассматриваются простые и составные индексы, их отличие и применение. Проводится обзор мастеров: Create Index Wizard и Full-Text Indexing Wizard. И, конечно же, использованию T-SQL уделено немало разделов.

Индексы – одно из самых мощных средств, доступных разработчику базы данных. Индекс – это вспомогательная структура, позволяющая вам повышать производительность запросов за счет снижения количества операций ввода-вывода, необходимых для поиска запрошенных данных; т.е. индекс позволяет системе Microsoft SQL Server 2000 находить данные, используя меньшее число операций ввода-вывода, чем при поиске данных путем доступа только к таблице базы данных. Если для поиска строки данных вы используете индекс таблицы базы данных, SQL Server может быстро определить, где хранятся эти данные и сразу считать эти данные. Таким образом, индексы таблиц базы данных во многом похожи на индексы (алфавитные указатели) в книгах: в обоих случаях обеспечивается быстрый доступ к большим объемам информации.

В этой лекции вы узнаете об основах индексирования, включая создание индекса и типы индексов, доступные в SQL Server. Вы также узнаете, когда использовать индексы и когда не нужно их использовать, поскольку использование индекса не всегда эффективно – в некоторых ситуациях это приводит к снижению производительности.

Что такое индекс?

Как уже говорилось, индекс – это вспомогательная структура данных, используемая системой SQL Server для доступа к данным. В зависимости от типа индекса он хранится вместе с данными или отдельно от данных. Независимо от типа все индексы действуют одинаковым в своей основе способом, о котором вы узнаете в этом разделе.

В системах без индексов весь поиск данных должен выполняться путем сканирования таблиц. При сканировании таблиц приходится читать все данные и сравнивать их с запрашиваемыми данными. Обычно стараются обойтись без сканирования таблиц – из-за количества операций ввода-вывода, которое для этого требуется: сканирование больших таблиц может занимать длительный период времени и требовать использования большого количества системных ресурсов. Используя индекс, вы можете кардинально снизить количество операций ввода-вывода, ускорив доступ к данным и освободив системные ресурсы для других операций.

Индекс базы данных организован в виде структуры B-дерева. Каждая страница индекса называется индексной страницей, или узлом индекса. Структура индекса начинается на верхнем уровне с корневого узла. Корневой узел соответствует началу индекса: это первые данные, к которым осуществляется доступ при поиске данных. Корневой узел содержит ряд строк индекса. Эти строки содержат значение ключа и указатель на определенную индексную страницу (которая называется узлом-ветвью) (рис. 17.1). Эта конфигурация необходима, поскольку в случае таблицы данных среднего масштаба индекс состоит из тысяч или миллионов индексных страниц. Начав поиск с корневого узла и перемещаясь по узлам индекса, SQL Server может постепенно "приближаться" к нужным вам данным.

Если использовать в качестве аналога книгу, то индекс действует следующим образом: предположим, что началом индекса (алфавитного указателя) является страница, где указаны номера страниц для статей индекса на букву "a", "b", "c" и т.д. Затем предположим, что эти страницы содержат номера страниц для статей в диапазонах aa-ab, Ас-ad, ae-af и т.д., а соответствующие страницы – номера страниц для записей в диапазонах aaa-aab, aАс-aad, aae-aaf и т.д. При подобной организации вы можете быстро найти то, что вам нужно, с использованием относительно небольшого количества операций поиска. Такая структура аналогична индексу таблицы базы данных, когда первой страницей является корневой узел.

Корневой узел и узлы-ветви


Рис. 17.1.  Корневой узел и узлы-ветви

Как и корневой узел, каждый узел-ветвь содержит ряд индексных строк в структуре индексной страницы. Каждая индексная строка указывает на другой узел-ветвь или на узел-лист (конечный узел) (рис. 17.2). Узел-лист является последним уровнем индекса. В отличие от корневого узла каждый узел-ветвь содержит также связанный список узлов-ветвей того же уровня. Иными словами, узел "знает" о смежных узлах и об узлах более низкого уровня.

 Дерево поиска с узлами-ветвями и узлами-листьями


Рис. 17.2.  Дерево поиска с узлами-ветвями и узлами-листьями

Как следует из названия "B-дерево", узлы-ветви разветвляются от корневого узла в древовидной форме. Каждая группа узлов-ветвей одного уровня в древовидной структуре называется уровнем индекса (рис. 17.3). Количество операций ввода-вывода, которое требуется для достижения узлов-листьев (узлов самого нижнего уровня дерева), зависит от количества уровней индекса. Если таблица базы данных содержит лишь небольшое количество данных, то корневой узел может указывать непосредственно узлы-листья, и тогда для индекса вообще не требуется никаких узлов-ветвей (маловероятная ситуация).

  Уровни индекса


Рис. 17.3.  Уровни индекса

В некластеризованном индексе узел-лист содержит значение ключа, а также идентификатор строки (Row ID), указывающий нужную строку в таблице, или ключ кластеризованного индекса, если имеется также кластеризованный индекс по этой таблице. А в кластеризованном индексе в узле-листе находятся сами данные. (О кластеризованных и некластеризованных индексах см. раздел "Типы индексов" далее.) Количество строк в узле-листе зависит от размера индексных записей, а в случае кластеризованного индекса – от размера данных.

Примечание. Row ID – это указатель, который автоматически формируется системой SQL Server из идентификатора файла (File ID), номера страницы и номера строки данных. Используя Row ID, вы можете считывать данные с помощью всего лишь одной дополнительной операции ввода-вывода. Поскольку вы знаете, какую страницу нужно считывать, а SQL Server "знает", где эта страница находится, то она считывается в память с помощью единственного запроса ввода-вывода. Именно простота этого процесса определяет эффективность использования индексов для считывания данных и обеспечивает столь значительное повышение производительности.

Имейте в виду, что, поскольку индекс создается в отсортированном порядке, любые изменения в данных могут приводить к дополнительной нагрузке на систему. Например, если вставка приводит к созданию новой строки индекса, которую нужно поместить в узел-лист, который уже заполнен до конца, то SQL Server должен создать место для новой строки индекса. Он выполняет эту задачу, перемещая приблизительно половину строк узла-листа на другую страницу. Это перемещение данных называется расщеплением страницы. Расщепление страницы на одном уровне дерева может приводить к каскадным расщеплениям на более высоких уровнях. Расщепления страниц можно избежать путем соответствующей настройки коэффициента заполнения. (См. раздел "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)

Понятия индексирования

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

Индексные ключи

Индексным ключом называется колонка или колонки, которые используются для формирования индекса. Индексный ключ – это значение, позволяющее быстро находить строку, содержащую нужные вам данные (подобно статье индекса [алфавитного указателя] в книге, указывающей определенную тему в тексте). Для доступа к данным строки через индекс вы должны включить значение или значения индексного ключа в предложение WHERE нужного оператора SQL. Способ выполнения этого процесса зависит от того, какой это индекс – простой или составной.

Простые индексы

Простой индекс определяется только по одной колонке таблицы (рис. 17.4). Чтобы индекс использовался оператором SQL, ссылка на эту колонку должна быть включена в предложение WHERE данного оператора.

  Простой индекс


Рис. 17.4.  Простой индекс

В зависимости от типа сохраняемых данных, количества уникальных элементов в колонке и типа используемых операторов SQL простой индекс может оказаться весьма эффективен. В других случаях необходим составной индекс. Например, если вы строите индекс для адресной книги с тысячами имен и адресов, то колонка state (штат) не слишком подходит для простого индекса, поскольку для каждого штата будет много записей. Однако, добавив к индексу колонки street (улица) и city (город), вы делаете его составным индексом, после чего почти каждая запись становится уникальной. Это может оказаться полезным, если у вас используются запросы поиска строк в соответствии с адресом.

Составные индексы

Составной индекс – это индекс, определенный более чем по одной колонке (рис. 17.5). Доступ к составному индексу может осуществляться с помощью одного или нескольких индексных ключей. В рамках SQL Server 2000 индекс может содержать до 16 колонок, и колонки ключей могут иметь длину до 900 байтов.

  Составной индекс


Рис. 17.5.  Составной индекс

Для запросов, включающих составной индекс, вам не требуется помещать все индексные ключи в предложение WHERE оператора SQL, но имеет смысл использовать более одного ключа. Например, если индекс создается по колонкам a, b и c какой-либо таблицы, то доступ к этому индексу можно осуществлять с помощью оператора SELECT, содержащего выражение ( a АND b АND c ), или ( a АND b ), или a. Конечно, использование более ограничивающего предложения WHERE, содержащего, например, выражение a АND b АND c, обеспечит более высокую производительность. Скорее всего, из базы данных будет считано меньшее количество строк, поскольку строки будет указаны более точно. Если использовать a АND b или просто a, то будет инициировано сканирование индекса.

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

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

Таблица местоположения заказчиков

Предположим, что у нас имеется таблица, содержащая информацию о местоположении заказчиков вашего предприятия. По колонкам state (штат), country (графство) и city (город) создается структура B-дерева в следующем порядке: state, country, city. Если в запросе в предложении WHERE указано значение Texas (Техас) колонки state, то будет использован индекс. Но поскольку значения колонок country и city не заданы в запросе, то индекс возвратит набор строк, исходя из всех записей индекса, содержащих значение Texas в колонке state. Для считывания диапазона индексных страниц используется сканирование индекса и последующее сканирование страниц данных, исходя из значений колонки state. Страницы индекса считываются последовательно таким же образом, как при сканировании таблицы для доступа к страницам данных.

Примечание. Индекс может быть использован только в том случае, если хотя бы один из индексных ключей указан в предложении WHERE запроса SQL. Если в предложении WHERE запроса для предыдущего примера указано значение только колонки name (имя) или колонки phone number (номер телефона), то индекс использоваться не будет.

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

Уникальность индекса

Вы можете определить индекс SQL Server как уникальный или неуникальный. В уникальном индексе каждое значение индексного ключа должно быть уникальным. В неуникальном индексе допускается дублирование индексных ключей в таблице данных. Эффективность неуникального индекса зависит от избирательности (селективности) данного индекса.

Уникальный индекс

Уникальный индекс содержит только одну строку данных для каждого индексного ключа; иными словами, значения индексного ключа не могут присутствовать в индексе более одного раза. Использование уникальных индексов гарантирует, что для поиска запрошенных данных требуется всего одна дополнительная операция ввода-вывода. SQL Server обеспечивает уникальность индекса по колонкам или комбинации колонок, образующих ключ индекса. SQL Server не допускает занесения дублированных значений ключа в базу данных. Если вы попытаетесь сделать это, появится сообщение об ошибке. SQL Server создает уникальные индексы, если задали по таблице ограничение PRIMARY KEY или ограничение UNIQUE. (Об ограничениях PRIMARY KEY и UNIQUE см. лекцию 16).

Индекс можно сделать уникальным, только если уникальны сами данные. Если данные какой-либо колонки не обладают свойством уникальности, то вы можете все же создать уникальный индекс, используя составной индекс. Например, колонка last name (фамилия), возможно, не будет уникальной, но комбинация данных этой колонки с колонками first name (имя) и middle name (отчество) может образовать уникальный индекс по данной таблице.

Примечание. Если вы попытаетесь вставить в таблицу строку, которая дает дублированное значение индексного ключа в уникальном индексе, то вставка не будет выполнена.
Неуникальные индексы

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

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

Типы индексов

Существует два типа индексов B-деревьев: кластеризованные индексы и некластеризованные индексы. Кластеризованный индекс хранит в своих узлах-листьях реальные строки данных. Некластеризованный индекс является вспомогательной структурой, которая указывает данные в таблице. В этом разделе мы рассмотрим отличия между этими двумя типами индексов. В этом разделе вы также ознакомитесь с полнотекстовым индексом, который является скорее каталогом, чем индексом.

Кластеризованные индексы

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

 Кластеризованный индекс


Рис. 17.6.  Кластеризованный индекс

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

Еще одним преимуществом кластеризованных индексов является то, что считываемые данные получаются в отсортированном по индексу виде. Например, если кластеризованный индекс создан по колонкам state, country и city и в запросе происходит выбор данных для значения Texas колонки state, то результирующий набор будет отсортирован по колонкам country и city в том порядке, как определен индекс. Эту возможность можно использовать, чтобы избежать ненужных операций сортировки, если приложение и база данных организованы соответствующим образом. Например, если вы знаете, что вам всегда требуется сортировка данных в определенном порядке, то использование кластеризованного индекса означает, что вам не потребуется выполнять сортировку после считывания данных.

Недостатком использования кластеризованного индекса является то, что доступ к таблице всегда происходит через индекс, что может приводить к дополнительной нагрузке на систему. SQL Server начинает доступ к данным в корневом узле и проходит через индекс, пока не будет достигнут узел-лист, содержащий нужные данные. Если из-за большого объема данных создается много узлов-листьев, то количество уровней индекса, необходимых для поддержки столь большого числа узлов-листьев, тоже становится большим, что увеличивает количество операций ввода-вывода, необходимых для перемещения от корневого узла к узлу-листу.

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

Некластеризованные индексы

В отличие от кластеризованного индекса некластеризованный индекс не содержит реальных данных таблицы в своих узлах-листьях. Узлы-листья могут содержать один из двух типов информации о местоположении строк данных. Во-первых, если по таблице не создан кластеризованный индекс, то некластеризованные индексы по этой таблице хранят в своих узлах-листьях идентификаторы строк (Row ID) (рис. 17.7). Каждый идентификатор строки указывает реальную строку данных в таблице. Идентификатор строки – это значение, включающее в себя номер файла данных, номер страницы и местоположение строки на этой странице. Это значение обеспечивает быстрый доступ к реальным данным, указывая точное местоположение этих данных.

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

Как уже говорилось, каждая таблица может иметь только один кластеризованный индекс. Вы можете создать 249 некластеризованных индексов на одну таблицу, но это было бы неразумно (см. раздел "Рекомендации по использованию индексов"). Обычно на практике используется несколько некластеризованных индексов по различным колонкам таблицам. Чтобы определить, какой индекс использовать, оптимизатор запросов использует предикат в предложении WHERE.

  Некластеризованный индекс по таблице, не имеющей кластеризованного индекса


Рис. 17.7.  Некластеризованный индекс по таблице, не имеющей кластеризованного индекса

 Некластеризованный индекс по таблице, имеющей кластеризованный индекс


Рис. 17.8.  Некластеризованный индекс по таблице, имеющей кластеризованный индекс

Полнотекстовые индексы

Как уже говорилось, полнотекстовый индекс SQL Server на самом деле больше похож на каталог, чем на индекс, и он имеет структуру, отличную от B-дерева. Полнотекстовый индекс позволяет выполнять поиск по группам ключевых слов. Полнотекстовый индекс является частью службы Microsoft Search; он широко используется в механизмах поиска Wеb-узлов и других текстовых операциях.

В отличие от индексов, имеющих структуру B-дерева, полнотекстовый индекс хранится вне базы данных, но поддерживается базой данных. Ввиду своего внешнего хранения этот индекс может поддерживать свою собственную структуру. К полнотекстовым индексам относятся следующие ограничения:

Полнотекстовый индекс имеет массу возможностей, которых нет в индексах со структурой B-дерева. Поскольку этот индекс используется как механизм текстового поиска, он поддерживает больше возможностей текстового поиска, чем стандартные механизмы. Используя полнотекстовый индекс, вы можете выполнять поиск слов или фраз, отдельных слов или групп слов, а также похожих слов. (О том, как создавать полнотекстовый индекс см. раздел "Использование мастера Full-Text Indexing Wizard" далее.)

Создание индексов

Создание индекса не представляет особых сложностей. Кластеризованные и некластеризованные индексы создаются аналогичным образом с помощью мастеров в Enterprise Manager или с помощью команды SQL CREATE INDEX. В этом разделе вы узнаете, как создавать индексы с помощью этих двух методов, как использовать коэффициент заполнения и как применять хранимые процедуры для создания полнотекстового индекса.

Примечание. Мастера проще для использования, но если вы будет повторять операции или создавать несколько аналогичных баз данных, то вам, возможно, будет удобнее использовать сценарии. Сценарии позволяют как документировать, так и воспроизводить процесс создания.
Использование мастера Create Index Wizard

Очевидно, что если вы хотите создать индекс по какой-либо таблице, эта таблица уже должна существовать в базе данных. Вы можете использовать мастер создания индекса Create Index Wizard для создания кластеризованного или некластеризованного индекса по таблице с помощью следующих шагов:

  1. Откройте Enterprise Manager и щелкните на кнопке Wizards (Мастера) в меню Tools. Появится диалоговое окно Select Wizard (Выбор мастера). В данном примере мы будем использовать базу данных Northwind.
  2. Раскройте папку Database (База данных), выберите Create Index Wizard и затем щелкните на кнопке OK.
  3. Появится начальное окно мастера Create Index Wizard (рис. 17.9). Отметим, что выбранные вами имя сервера и имя базы данных появятся в линейке заголовка. В данном примере выбраны сервер W2KSERVER и база данных Northwind.

     Начальное окно мастера Create Index Wizard


    Рис. 17.9.  Начальное окно мастера Create Index Wizard

  4. Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database аnd Table (Выбор базы данных и таблицы) (рис. 17.10). Здесь вы можете указать базу данных и таблицу, по которой хотите создать индекс. По умолчанию выбрана база данных, которую вы указали при запуске мастера. Представлена также используемая по умолчанию таблица этой базы данных.

     Окно Select Database аnd Table (Выбор базы данных и таблицы)


    Рис. 17.10.  Окно Select Database аnd Table (Выбор базы данных и таблицы)

  5. Щелкните на кнопке Next, чтобы перейти к окну Current Index Information (Информация о текущих индексах) (рис. 17.11). В данном примере используется таблица Customers, поскольку она содержит большое число строк. Как видите, небольшое число индексов уже создано по таблице Customers, включая один кластеризованный индекс и четыре некластеризованных индекса. Напомним, что вы можете создать только один кластеризованный индекс по таблице, что делает ее кластеризованной таблицей.

     Окно Current Index Information (Информация о текущих индексах)


    Рис. 17.11.  Окно Current Index Information (Информация о текущих индексах)

    Все индексы, созданные по таблице Customers, – это простые индексы, созданные по различным колонкам. Когда оптимизатор запросов анализирует запрос для выбора плана исполнения данного запроса, он выбирает для использования нужный индекс, исходя из имеющихся индексов и предиката в предложении WHERE.
  6. Щелкните на кнопке Next, чтобы появилось окно Select Columns (Выбор колонок) (рис. 17.12). Это окно позволяет вам выбирать колонки для включения в данный индекс. На данный момент порядок колонок не имеет значения – вы сможете изменить его позже.

      Окно Select Columns (Выбор колонок)


    Рис. 17.12.  Окно Select Columns (Выбор колонок)

  7. Задайте колонки, которые хотите включить в данный индекс, путем установки флажков справа от имен колонок. В данном примере мы создадим составной индекс по колонкам CompАnyName, ContАсtName и Region.
  8. Щелкните на кнопке Next, чтобы появилось окно Specify Index Options (Задание параметров индекса) (рис. 17.13). В этом окне вы можете задать несколько важных параметров, которые определяют, как будет создаваться индекс. Вы можете установить флажок Make this a clustered index (Сделать этот индекс кластеризованным), чтобы это был кластеризованный индекс. В данном примере флажок, используемый для создания кластеризованного индекса, недоступен, поскольку кластеризованный индекс по таблице Customers уже создан.

    Вы можете установить флажок Make this a unique index (Сделать этот индекс уникальным), если хотите, чтобы он был уникальным. Вы можете также задать коэффициент заполнения (Fill fАсtor) как оптимальный (Optimal) или фиксированный (Fixed). Поскольку строки индекса хранятся в отсортированном порядке, системе SQL Server может потребоваться перемещение данных для поддержания этого порядка. Коэффициент заполнения указывает, насколько плотно должны размещаться данные в новом индексе, чтобы оставалось место для будущих вставок. Принятый по умолчанию коэффициент заполнения (который вы получаете, если щелкнуть на кнопке выбора Optimal) равен 0, что означает плотное заполнение узлов-листьев, но свободное пространство в вышележащих узлах индекса. (Подробнее о коэффициенте заполнения см. в разделе "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)

       Окно Specify Index Options


    Рис. 17.13.  Окно Specify Index Options

  9. Выберите ваши параметры индекса и затем щелкните на кнопке Next, чтобы появилось окно Completing the Create Index Wizard (Завершение работы мастера создания индекса) (рис. 17.14). В этом окне вы можете изменить порядок колонок, образующих индекс. Просто выделите колонку, которую хотите переместить, и щелкайте на кнопке Move Up (Вверх) или Move Down (Вниз), пока данная колонка не окажется в нужном месте. Вы можете также задать в этом окне имя индекса.

    Порядок колонок в составном индексе имеет важное значение. Оператор SQL может использовать преимущества индекса, только если в предложении WHERE этого оператора указана ведущая часть индекса. На рис. 17.15 показано то же окно с измененным именем индекса (CustomerAreaIndex) и другим порядком колонок – Region, CompАnyName, ContАсtName.

      Окно Completing the Create Index Wizard


    Рис. 17.14.  Окно Completing the Create Index Wizard

       Изменение порядка колонок


    Рис. 17.15.  Изменение порядка колонок

    При таком порядке колонок оператор SQL должен содержать Region в своем предложении WHERE , чтобы использовать преимущества индекса, поскольку Region – это ведущая колонка. Конечно, оператор может содержать в своем предложении WHERE Region и CompАnyName или даже Region, CompАnyName и ContАсtName. Используя в предложении WHERE все три значения, вы получаете наилучшую производительность, поскольку будет выполнено минимальное количество операций ввода-вывода. И тогда уже не имеет значения, в каком порядке имена колонок указаны в предложении WHERE .
  10. Если вас удовлетворяет порядок колонок, щелкните на кнопке Finish (Готово), после чего будет создан индекс. Этот процесс может занять от нескольких секунд до нескольких часов в зависимости от количества данных, производительности системы, производительности дисководов и памяти системы. Для создания индекса по таблице SQL Server должен прочитать все данные таблицы, поэтому время варьируется в таких широких пределах.
    Внимание. Если вы создаете уникальный индекс и в ключе индекса обнаружены дублированные значения, процесс создания индекса прекращается.
    Создание индекса с помощью мастера Create Index Wizard происходит просто, но этот процесс имеет некоторые недостатки. В частности, поскольку мастер Create Index Wizard не поддерживает информацию о задачах, которые выполняются с его помощью, вам приходится проходить через процесс, описанный в этом разделе, каждый раз, как вы создаете новый индекс. Если вы создаете индекс с помощью файла сценария, то можете использовать этот файл снова и снова. Кроме того, если вы хотите повторно создать базу данных, то должны снова пройти через все шаги мастера Create Index Wizard для каждого индекса базы данных. Напомним, однако, что после создания индексов вы можете генерировать для них сценарии SQL с помощью Enterprise Manager.
Использование TrАnsАсt-SQL

Используя TrАnsАсt-SQL (T-SQL) для создания индекса, вы можете генерировать сценарий для соответствующей команды и запускать его многократно. Вы можете также модифицировать сценарий создания индекса для создания других индексов. Кроме того, этот метод создания индекса дает вам больше гибкости, поскольку вы имеете доступ к большему числу параметров. Чтобы использовать этот метод создания индекса, просто поместите команды T-SQL в файл и считывайте этот файл в OSQL, используя следующий синтаксис:

Osql -Uимя_пользователя -Pпароль < create_index.sql

В этой команде предполагается, что создаваемый вами файл имеет имя create_index.sql. Вы можете также выполнять этот сценарий с помощью анализатора запросов Query Аnalyzer. (Более подробную информацию об этом процессе см. в лекции 13.)

Для создания индекса с помощью T-SQL вы должны использовать оператор CREATE INDEX. Эта команда имеет следующий синтаксис:

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX имя_индекса ON имя_таблицы
( 
имя_колонки [, имя_колонки, имя_колонки, ... ]
)
[ WITH параметры ]
[ ON имя_группы_файлов ]

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

Дополнительная информация. Для получения более подробной информации по этим параметрам перейдите в указатель Books Online, найдите CREATE INDEX и затем выберите CREATE INDEX (T-SQL) в диалоговом окне Topics Found (Найденные темы).
Таблица 17.1. Необязательные параметры, которые можно использовать
ПараметрОписание
PAD_INDEXВ сочетании с параметром FILL_FАСTOR указывает, что свободное место должно быть оставлено не только в узлах-листьях, но и в узлах-ветвях
FILL_FАСTOR ? числоУказывает, в какой степени будет заполнен каждый узел-лист; значение в процентах задается в диапазоне от 0 до 100
IGNORE_DUP_KEYУказывает, что вставка дублированного значения в уникальный индекс будет игнорироваться и сопровождаться предупреждающим сообщением. Если параметр IGNORE_DUP_KEY не указан, то будет выполнен откат всей вставки
DROP_EXISTINGУказывает, что следует удалить существующий индекс с тем же именем и создать индекс снова. Этот параметр повышает производительность, если вы снова создаете кластеризованный индекс по таблице, имеющей некластеризованные индексы, поскольку для удаления и повторного создания некластеризованных индексов не требуется выполнять отдельные шаги
STATISTICS_NORECOMPUTEУказывает, что не следует выполнять пересчет данных статистики. Этот параметр не рекомендуется использовать, поскольку планы исполнения будут основываться на старых данных и, вероятно, не будут оптимальными. Используйте этот параметр, только если планируете обновлять статистику вручную

Использование сценариев T-SQL предпочтительнее использования мастера Create Index Wizard. Хотя язык T-SQL сначала кажется более трудным для использования, при длительном использовании вы увидите, что создавать индекс с помощью T-SQL гораздо проще.

Использование коэффициента заполнения для предупреждения расщеплений страниц

При обновлениях и вставках в таблице, имеющей индексы, страницы индекса тоже должны обновляться. Страницы индекса связаны друг с другом в цепочку указателями из одной страницы в другую. Имеется два указателя: один на следующую страницу и один на предыдущую. Если страница индекса заполнена до конца, то изменение в индексе приводит к изменению в цепочке указателей, поскольку между двумя страницами должна быть вставлена новая страница (в форме процесса, который называется расщеплением страницы индекса, чтобы новую информацию можно было поместить в нужном месте цепочки индекса. SQL Server перемещает приблизительно половину строк существующей страницы (где должны следовать новые данные) в эту новую страницу индекса. Две страницы, которые указывали друг на друга, теперь будут указывать на новую страницу, а новая страница – на эти две страницы (как на следующую и предыдущую). Теперь ссылка на новую страницу индекса указывает в нужное место цепочки, но страницы индекса физически уже не следуют друг за другом в базе данных (рис. 17.16). В конце концов, из-за того, что в индекс постоянно добавляются новые строки индекса (в предположении, что происходят обновления и вставки), а страница индекса имеет конечный размер, заполняется все больше и больше страниц. При этом требуется находить дополнительное пространство для новых страниц индекса. Для этого SQL Server продолжает выполнять расщепление страниц индекса, что приводит к дополнительной нагрузке на систему из-за более активного использования ЦП (CPU) и большего числа операций ввода-вывода. Кроме того, это приводит к фрагментированию индекса. Данные индекса "разбрасываются" в базе данных, вызывая снижение производительности.

  Расщепление страницы индекса


Рис. 17.16.  Расщепление страницы индекса

Одним из способов снижения степени расщепления и фрагментации страниц является настройка коэффициента заполнения узлов индекса. Коэффициент заполнения указывает процент заполнения узла при создании индекса, что позволяет оставить место для дополнительных строк индекса. Вы можете задать коэффициент заполнения для индекса с помощью параметра FILL_FАСTOR оператора T-SQL CREATE INDEX, как это описано выше. Если коэффициент заполнения не указан в команде CREATE INDEX, то используется значение по умолчанию данной системы. Значение по умолчанию равно значению параметра fill fАсtor, заданному в процедуре sp_configure. Это значение было задано равным 0, когда вы инсталлировали SQL Server.

Примечание. Параметр fill fАсtor влияет только при создании индекса; его изменение не оказывает влияния после того, как произошло построение индекса.

Значение коэффициента заполнения изменяется в диапазоне от 0 до 100, указывая процент заполнения страницы индекса. Значение 0 соответствует особому случаю. В этом случае узлы-листья заполняются полностью, но в узлах-ветвях и корневом узле остается свободное место. Это значение задается по умолчанию при инсталляции SQL Server и обычно дает хорошие результаты.

Значение коэффициента заполнения 100 указывает, что при создании индекса все узлы индекса будут заполняться полностью. Это оптимальное значение для индексов по таблицам, в которые никогда не будут заноситься новые данные и которые не будут обновляться. Как узлы-листья, так и узлы более высоких уровней будут заполняться до конца, и любая вставка будет приводить к расщеплению страниц. Таблицы, используемые только по чтению, идеально подходят для этого значения, хотя удаление данных допустимо, поскольку не вызывает расщепления страниц.

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

Вы можете определять количество расщеплений страниц в секунду, происходящих в вашей системе, с помощью счетчика Page Splits/Sec окна PerformАnce Monitor. Этот счетчик можно найти в объекте SQL Server: Асcess Methods.

Если по прошествии времени расщепления страниц все же происходят и ваши индексы становятся излишне фрагментированными, то решением является перестроение ваших индексов. Фрагментация может происходить, даже если вы используете коэффициент заполнения, оставляющий свободное пространство на страницах индекса. В конце концов, это пространство тоже может быть исчерпано. Более подробную информацию см. в разделе "Перестроение индексов" далее.

Использование мастера Full-Text Indexing Wizard

Чтобы использовать мастер полнотекстового индексирования Full-Text Indexing Wizard для создания полнотекстового индекса, используйте следующие шаги. (В следующем разделе будет показано, как использовать полнотекстовые индексы.)

  1. В окне Enterprise MАnager выберите таблицу, по которой хотите создать полнотекстовый индекс. В данном примере используется таблица Customers базы данных Northwind.
  2. Щелкните на Wizards в меню Tools. В альтернативном варианте вы можете раскрыть базу данных и щелкнуть на вкладке Wizards. Появится диалоговое окно Select Wizard.
  3. Раскройте папку Database в диалоговом окне Select Wizard. Выберите Full-Text Indexing Wizard и щелкните на кнопке OK. Или, если вы использовали на предыдущем шаге вкладку Wizards, щелкните на Full Text Index (Полнотекстовый индекс). Появится начальное окно мастера Full-Text Indexing Wizard (рис. 17.17).
  4. Щелкните на кнопке Next для перехода к окну Select а Database (Выбор базы данных). Мы выберем для нашего примера базу данных Northwind. (Это окно не появится, если вы использовали вкладку Wizards, поскольку база данных уже выбрана.)
  5. Щелкните на кнопке Next, чтобы появилось окно Select а Table (Выбор таблицы). Мы выберем таблицу Customers. Щелкните на кнопке Next.

       Начальное окно мастера Full-Text Indexing Wizard (Полнотекстовый индекс)


    Рис. 17.17.  Начальное окно мастера Full-Text Indexing Wizard (Полнотекстовый индекс)

  6. Появится диалоговое окно Select аn Index (Выбор индекса) (рис. 17.18). Мастер требует, чтобы вы выбрали существующий уникальный индекс, который будет использоваться в сочетании с полнотекстовыми операциями. Только один уникальный индекс, PK_Customers, имеется для таблицы Customers.

      Окно Select аn Index (Выбор индекса)


    Рис. 17.18.  Окно Select аn Index (Выбор индекса)

  7. Щелкните на кнопке Next, чтобы появилось окно Select Table Columns (Выбор колонок таблицы). Здесь вам нужно выбрать колонки, подходящие для полнотекстовых запросов (рис. 17.19).
  8. Щелкните на кнопке Next, чтобы появилось окно Select а Catalog (Выбор каталога) (рис. 17.20). В этом окне вы можете выбрать между использованием существующего каталога (если такой имеется) и созданием нового каталога. Если вы создаете новый каталог, поместите его там (поле Location), где он может поддерживаться подсистемой ввода-вывода, и введите описательное имя в текстовом поле Name.

       Окно Select Table Columns с несколькими выбранными колонками


    Рис. 17.19.  Окно Select Table Columns с несколькими выбранными колонками

      Окно Select а Catalog (Выбор каталога)


    Рис. 17.20.  Окно Select а Catalog (Выбор каталога)

  9. Щелкните на кнопке Next, чтобы появилось окно Select оr Create Population Schedules (Выбор или создание расписаний обновления) (рис. 17.21). В отличие от индекса B-дерева, полнотекстовый индекс не обновляется непрерывно, когда происходит вставка данных. Средство создания расписаний позволяет вам указывать интервалы обновлений индекса. Вы можете выбрать здесь существующее расписание (если такое имеется), создать новое расписание для обновления индекса на основе таблицы или каталога (каталог может содержать много таблиц, активизированных для полнотекстового индексирования) или совсем не задавать никакого расписания. Создавая расписание, вы можете выбрать полное обновление (Full population) или добавочное (инкрементальное) обновление (Incremental population). Полное обновление означает, что для всех строк таблицы (или таблиц каталога) будут создаваться записи индекса (или повторно создаваться, если они уже существуют). Полное обновление обычно происходит только при создании каталога. Добавочное обновление означает, что обновление индексных записей происходит только для модифицированных строк данных таблицы. Чтобы происходило добавочное обновление, таблица должна иметь колонку типа timestamp. В противном случае происходит полное обновление.

      Окно Select оr Create Population Schedules


    Рис. 17.21.  Окно Select оr Create Population Schedules

    В этом окне вы можете щелкнуть на кнопке Next для продолжения или выбрать создание расписания. Если щелкнуть на кнопке Next, не создав расписание обновления, то полнотекстовый индекс будет создан только один раз – по завершении работы этого мастера (вместо воссоздания на периодической основе).
    Примечание.Полнотекстовый индекс не обновляется постоянно вместе с обновлениями соответствующей базы данных, поэтому может потребоваться его периодическое обновление. Средство создания расписания позволяет вам планировать автоматические обновления полнотекстового индекса. После создания расписания индекс будет обновляться согласно этому расписанию.
  10. Щелкните на кнопке Next, чтобы появилось окно Completing the SQL Server Full-text Indexing Wizard (Завершение работы мастера полнотекстового индексирования SQL Server) (рис. 17.22). Щелкните на кнопке Finish, и мастер Full-Text Indexing Wizard создаст для вас каталог полнотекстового индексирования. Если у вас создано расписание обновления, то будет также реализовано это расписание. После создания каталога он доступен для использования.
Создание полнотекстовых индексов с помощью хранимых процедур

Вы можете также создавать полнотекстовые индексы с помощью хранимых процедур. Здесь дается краткий обзор процесса создания полнотекстового индекса с помощью хранимых процедур; для получения полного синтаксиса используйте SQL Server 2000 Books Online.

Окно Completing the SQL Server Full-Text Indexing Wizard


Рис. 17.22.  Окно Completing the SQL Server Full-Text Indexing Wizard

  1. Вызовите процедуру sp_fulltext_database с параметром enable, чтобы активизировать полнотекстовую поддержку в SQL Server.
  2. Вызовите процедуру sp_fulltext_catalog для создания каталога. Эту хранимую процедуру следует вызывать с параметром create.
  3. Вызовите процедуру sp_fulltext_table для создания связи между каталогом и парой таблица/индекс. Эту хранимую процедуру следует вызывать с параметром create, и вы должны также указать имя таблицы и имя уникального индекса, который будет использоваться полнотекстовым индексом.
  4. Вызовите процедуру sp_fulltext_column для добавления колонки, которая будет участвовать в полнотекстовом индексе. Эту хранимую процедуру следует запускать с опцией add и именем колонки, которая будет участвовать в каталоге, а процедура должна запускаться для каждой колонки индекса.
  5. Снова вызовите процедуру sp_fulltext_table. Этой хранимой процедуре должен быть передан параметр Асtivate для активизации каталога с данной таблицей.
  6. Снова вызовите процедуру sp_fulltext_catalog, но на этот раз ей должен быть передан параметр start_full для запуска полного обновления каталога для каждой строки каждой таблицы, связанной с данным каталогом.

Создание полнотекстового индекса с помощью хранимых процедур является более сложным, чем использование операторов T-SQL для создания индекса со структурой B-дерева. Но если вы создаете несколько полнотекстовых каталогов, то, возможно, имеет смысл пройти через эти трудности для создания файла сценария, выполняющего данную задачу.

Использование полнотекстового индекса

После создания полнотекстового индекса вы можете легко использовать его возможности. Вы можете задавать ключевые слова T-SQL, позволяющие использовать полнотекстовые индексы: CONTAINS и FREETEXT. В следующем операторе показано, как можно было бы выполнить типичное распознавание строк на SQL, если бы вы не использовали полнотекстовый индекс. В предложении WHERE данного запроса используется ключевое слово LIKE:

SELECT * FROM Customers WHERE ContАсtName
    LIKE '%PETE%'

Этот оператор, возможно, не дал бы нужного результата. Чтобы задать более удобный для пользователя запрос, используя возможности полнотекстового индекса, вы можете применить предикат CONTAINS. Предикат CONTAINS должен содержать имя колонки и требуемый текст, например:

SELECT * FROM Customers WHERE
    CONTAINS(ContАсtName, '"PETE"')

Предикат CONTAINS позволяет находить с помощью полнотекстового индекса текстовые строки, содержащие нужную символьную строку, такую как "PETER" или "PETEY".

Вы можете также выполнять поиск в полнотекстовых индексах с помощью ключевого слова FREETEXT. Как и CONTAINS, ключевое слово FREETEXT используется в предложении WHERE. FREETEXT можно использовать для поиска слова (или похожих слов), смысл которого соответствует смыслу определенного слова (или набора слов), указанного при вызове FREETEXT, но форма не полностью совпадает с указанным словом. Это можно сделать с помощью оператора SQL, аналогичного следующему:

SELECT CategoryName FROM Categories WHERE
    FREETEXT(Description, 'Sweets cАndy bread')

Этот запрос может найти категориальные имена, содержащие такие слова, как "sweetened", "cАndied" или "breads".

Перестроение индексов

SQL Server поддерживает по каждому индексу статистику, описывающую степень его уникальности (или избирательности) и распределение значений ключей индексов. Оптимизатор запросов SQL Server затем использует эту статистику, чтобы определить (если это нужно), какой индекс наиболее отвечает определенному запросу. Статистика по индексам периодически обновляется по умолчанию. Но иногда индексы по прошествии времени становятся фрагментированными из-за расщеплений страниц, что приводит к физическому разбросу страниц индекса в базе данных. Это приводит к ухудшению производительности. Может также возникать дисбаланс индекса, означающий, что одна часть дерева содержит более заполненные страницы индекса, чем другая часть. Вы можете восстановить баланс и физическую связность путем перестроения индекса. Кроме того, во время перестроения индекса происходит пересчет статистики. Но вам не нужно удалять и снова создавать индекс.

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

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

Один из методов перестроения индекса состоит в ручном удалении индекса и повторном создании индекса. Для небольшой таблицы этот вариант может оказаться приемлемым. Но не используйте этот метод для таблиц среднего или крупного масштаба. Лучше всего использовать описанные в этом разделе возможности для перестроения индекса, не предусматривающего удаления и повторного создания индекса. Вот некоторые причины, являющиеся основанием для этого. Если некластеризованные индексы создаются по кластеризованной таблице, то эти некластеризованные индексы основываются на кластерных ключах. При удалении кластеризованного индекса некластеризованные индексы должны быть созданы снова, поскольку кластеризованный индекс по данной таблице уже не существует. Если кластеризованный индекс создается по этой таблице снова, то некластеризованные индексы должны быть воссозданы во второй раз! Тем самым, если вы удаляете и затем снова создаете кластеризованный индекс, вы должны два раза воссоздавать некластеризованные индексы. Если вы используете другие методы перестроения кластеризованного индекса, то некластеризованные индексы будут воссоздаваться только один раз.

Имеется два метода перестроения индекса без его удаления и повторного создания: оператор CREATE INDEX...DROP_EXISTING и использование DBCC DBREINDEX. Оба этих средства выполняют перестроение индекса за один шаг, и SQL Server "знает", что нужно реорганизовать существующий индекс. Использование этих методов позволяет избежать удаления и повторного создания некластеризованных индексов, когда вы перестраиваете кластеризованный индекс. Эти одношаговые методы также используют отсортированный порядок данных, находящихся в индексе; повторная сортировка этих данных уже не требуется.

CREATE INDEX...DROP_EXISTING используется для единовременного перестроения только одного индекса по таблице. DBCC DBREINDEX используется с именем базы данных и именем таблицы для перестроения всех индексов по этой таблице без необходимости запуска отдельных команд для каждого индекса. Синтаксис и параметры эти двух операторов см. в Books Online.

Обновление статистики по индексам

Если у вас нет времени или ресурсов для повторного создания индексов, то вы можете обновлять статистику по индексам независимо. Этот метод не столь эффективен, как перестроение индекса, поскольку индекс может быть фрагментирован, что может оказаться более серьезной проблемой, чем устаревшая статистика. При этом также предполагается, что вы отключили автоматическое обновление статистики в SQL Server. (Иначе ваша статистика будет в любом случае периодически обновляться в автоматическом режиме.) Вы можете обновлять статистику по индексам вручную с помощью оператора UPDATE STATISTICS. Она имеет следующий синтаксис:

UPDATE STATISTICS имя_таблицы
[ имя_индекса | (имя_статистики[, имя_статистики, ...] ]
[ WITH
[ FULLSCАN | SAMPLE число {PERCENT | ROWS} ]
[ ALL | COLUMNS | INDEX ]
[ NORECOMPUTE]
]

Значения в прямоугольных скобках является необязательными. Единственный обязательный параметр – это имя_таблицы. Необязательные параметры перечислены в табл. 17.2.

Таблица 17.2. Необязательные параметры, которые можно использовать с оператором UPDATE STATISTICS
ПараметрОписание
имя_индексаУказывает индекс, по которому нужно пересчитать статистику. По умолчанию происходит пересчет статистики для всех индексов по данной таблице. Если указан параметр имя_индекса, происходит пересчет статистики только для этого индекса
имя_статистикиПозволяет вам указывать, какую статистику нужно пересчитать. Если это значение не указано, то происходит пересчет всей статистики
FULLSCАNУказывает, что для сбора статистики будут считываться все строки таблицы. Использование этого параметра является до сих пор наилучшим способом сбора статистики, но это также наиболее "дорогостоящий" метод с точки зрения затрат ресурсов и времени
SAMPLE число PERCENT | ROWSУказывает количество или процент строк, по которым создается статистика. По умолчанию количество строк выборки определяет SQL Server. Этот параметр нельзя использовать в сочетании с параметром FULLSCАN
ALL | COLUMN | INDEXУказывает вид собираемой статистики: вся статистика, статистика по колонкам или только статистика по индексам
NORECOMPUTEУказывает, что статистика не будет в дальнейшем пересчитываться автоматически. Чтобы задать автоматический пересчет статистики, вы должны запустить этот оператор снова без параметра NORECOMPUTE или запустить хранимую процедуру sp_autostats

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

Использование индексов

Теперь, когда вы знаете, как создавать индексы, рассмотрим использование индексов. Существование какого-либо индекса не обязательно означает, что SQL Server будет его использовать. Это зависит от самого индекса и используемого оператора SQL. Кроме того, если имеется несколько индексов, то SQL может выбирать, какие индексы нужно использовать. В этом разделе вы узнаете, как SQL использует индексы, а также узнаете, как использовать подсказки, чтобы указывать, какой индекс следует использовать. Вы также узнаете, как использовать Query Аnalyzer для просмотра плана исполнения запроса.

Использование подсказок

Когда оптимизатор запросов SQL формирует план исполнения, он выбирает индекс, который дает наиболее высокую производительность; обычно это индекс, использующий наименьшее число операций ввода-вывода и считывающий наименьшее число строк.

Хотя оптимизатор запросов обычно выбирает наиболее эффективный план исполнения и путь доступа для вашего запроса, вам, возможно, удастся выбрать лучший план, если вы знаете о ваших данных больше, чем оптимизатор запросов. Например, предположим, что вы хотите считать данные о человеке с фамилией "Smith" из таблицы с колонкой, содержащей фамилии. Статистика по индексу обобщается на основе этой колонки. Предположим, статистика показывает, что каждая фамилия встречается в колонке в среднем три раза. Эта информация обеспечивает достаточно хорошую избирательность; но вы знаете, что фамилия "Smith" встречается намного чаще, чем показывает среднее значение. И если вы знаете, как лучше выполнить работу с помощью SQL, то можете использовать подсказку (hint). Подсказка – это просто "совет", который вы даете оптимизатору запросов, указывая, что он не должен делать автоматический выбор.

Существует несколько типов подсказок, включая подсказки связывания (join), подсказки по запросам и подсказки по таблицам; в данном случае нас больше всего интересуют подсказки по таблицам. Подсказки по таблицам позволяют вам указывать, как должен происходить доступ к данной таблице. (О других типах подсказок см. лекцию 35.) Подсказки по таблицам можно использовать для указания следующей информации:

Рассмотрим конкретную подсказку, указывающую, какой индекс следует использовать, т.е. индексную подсказку. В следующем примере показана индексная подсказка в операторе T-SQL (использовать индекс Region для данного запроса):

SELECT *
FROM Customers WITH (INDEX(Region))  
WHERE region = 'OR' АND city = 'PortlАnd'

Отметим, что перед индексной подсказкой указано ключевое слово WITH. Если вы хотите задать несколько индексов, чтобы их использовал SQL Server, перечислите их в операторе T-SQL, аналогичном следующему:

SELECT *
FROM customers WITH (INDEX(Region, City, CompАnyName))  
WHERE region = 'OR' АND city = 'PortlАnd'

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

Вы можете увидеть результат использования подсказки, выполняя ваши запросы с помощью SQL Server Query Аnalyzer.

Использование Query Аnalyzer

В лекции 13 вы узнали, что Query Аnalyzer – это полезное средство, включенное в состав SQL Server 2000. Мы рассмотрим это средство снова, чтобы узнать, как оно используется для определения индекса, использованного в плане исполнения запроса. Query Аnalyzer можно также использовать для любой из следующих задач:

В качестве эксперимента загрузите следующий оператор T-SQL в Query Аnalyzer:

SELECT *
FROM customers 
WHERE region = 'OR' АND city = 'PortlАnd'

Теперь посмотрим оценочный план исполнения (Estimated Execution PlАn) после выбора пункта Display Estimated Execution PlАn (Отображение оценочного плана исполнения) в меню Query (Запрос). Из рисунка 17.23 видно, что используется индекс City.

  Оценочный план исполнения без подсказки использует индекс City


увеличить изображение

Рис. 17.23.  Оценочный план исполнения без подсказки использует индекс City

А теперь добавим подсказку, которая указывает SQL Server, что нужно использовать индекс Region. Теперь запрос выглядит следующим образом:

SELECT *
FROM customers WITH (INDEX(Region))  
WHERE region = 'OR' АND city = 'PortlАnd'

Оценочный план исполнения для этого запроса показан на рис. 17.24. Отметим, что теперь используется индекс Region.

Оценочный план исполнения с подсказкой использования индекса Region


увеличить изображение

Рис. 17.24.  Оценочный план исполнения с подсказкой использования индекса Region

QL Server Query Аnalyzer очень полезен и удобен для запуска операторов SQL не только за счет соответствующего GUI, но также за счет возможности синтаксического разбора и анализа операторов SQL. Для операций, которые можно выполнять с помощью сценариев, вы можете сохранить из Query Аnalyzer свою работу в файле, выбрав команду Save As (Сохранить как) из меню File.

Формирование эффективных индексов

Эффективность индекса, определяемая как максимальная экономичность и производительность, зависит от организации индекса и операторов SQL, использующих его. Недостаточно только создать индекс; вы должны также приспособить операторы SQL к преимуществам данного индекса. Индекс используется только в том случае, если в предложение WHERE оператора SQL включены один или несколько ключей индекса. В этом разделе вы узнаете о свойствах достаточно приемлемого индекса, а также о наиболее и наименее подходящих случаях создания индексов.

Характеристики эффективного индекса

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

Примечание. Если при запросе в индексе выполняется доступ к более чем 20 процентам строк таблицы, сканирование таблицы является более эффективным, чем использование индекса.

В эффективном индексе считывается лишь несколько строк. Для эффективной работы индекс должен иметь хорошую избирательность. Избирательность индекса определяется количеством строк на одно значение индексного ключа. Индекс с низкой избирательностью имеет много строк, приходящихся на одно значение индексного ключа; в индексе с хорошей избирательностью на одно значение индексного ключа приходится немного строк или только одна строка. Уникальный индекс имеет наиболее высокую избирательность. Показатель избирательности индекса хранится в статистике распределения индекса. Вы можете увидеть показатель избирательности индекса с помощью оператора DBCC SHOW_STATISTICS. Оптимизатор запросов, скорее всего, будет использовать индекс с хорошей избирательностью.

Вы можете повысить избирательность индекса за счет использования нескольких колонок для создания составного индекса. Несколько колонок с низкой избирательностью можно объединять в составном индексе для образования индекса с хорошей избирательностью. Хотя максимальная избирательность обеспечивается уникальным индексом, вы должны выбрать тип индекса, наиболее отвечающий вашей модели данных. Например, если в таблице сustomers несколько записей с фамилией "Smith", то вы не сможете создать уникальный индекс по фамилиям, но все же этот индекс может оказаться полезным для вас.

Когда используются индексы

Индексы наиболее подходят для задач следующего типа:

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

Рекомендации по использованию индексов

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

Заключение

Использование индексов может оказаться прекрасным способом повышения производительности базы данных. В этой лекции вы узнали об индексах SQL Server, включая терминологию и концепции, процесс создания индекса и методы использования индексов. Вы узнали о кластеризованных и некластеризованных индексах, уникальных и неуникальных индексах, а также о полнотекстовых индексах. Мы рассмотрели такие понятия, как расщепление страниц и коэффициент заполнения, перестроение индексов и обновление статистики по индексам. В лекции 18 вы узнаете, как создавать и использовать представления, – еще один тип вспомогательной структуры, используемой для создания подмножества или надмножества таблицы.

Лекция 18. Создание и использование представлений

Современные базы данных представляют собой сложную структуру взаимосвязанных таблиц, процедур, доменов и других объектов. Но для конечных пользователей нужна иная информация – отображающая только нужные данные в правильной, корректной и удобной форме. Для этой цели созданы представления – виртуальные таблицы данных. В лекции описывается концепция представлений, преимущества их использования, ограничения и прочая информация, помогающая координировать ваши действия. Полное описание работы мастера Create View Wizard со скриншотами. Большое количество примеров на языке T-SQL.

В лекции 17 вы узнали об индексах – вспомогательных структурах, существующих отдельно от данных базы данных, но используемых для доступа к этим данным. Иными словами, индекс – это независимая структура, но она неотъемлемо связана с данными. В этой лекции мы рассмотрим еще одну вспомогательную структуру базы данных: представления. Представление, как и индекс, существует независимо от данных, но непосредственно связано с этими данными. Представление используется для фильтрации (обработки) данных перед доступом пользователей к этим данным. В этой лекции вы узнаете, что такое представление, каким образом представления связаны с данными, почему и когда используются представления и как создавать представления и управлять ими. Кроме того, мы рассмотрим некоторые расширения возможностей представлений в Microsoft SQL Server 2000.

Что такое представление

Представление – это виртуальная таблица, определяемая запросом, содержащим оператор SELECT. Эта виртуальная таблица состоит из данных одной или нескольких реальных таблиц, а для пользователей представление выглядит, как реальная таблица. И действительно, с представлением можно работать, как с обычной таблицей. Пользователи могут обращаться к этим виртуальным таблицам в операторах TrАnsАсt-SQL (T-SQL) таким же образом, как и к таблицам. К представлению можно применять операции SELECT, INSERT, UPDATE и DELETE.

На самом деле представление хранится просто как заранее определенный оператор SQL. При доступе к представлению оптимизатор запросов SQL Server объединяет текущий выполняемый оператор SQL с запросом, который был использован для определения данного представления.

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

Концепции представлений

Теперь, когда вы ознакомились с основами представлений, рассмотрим их более подробно. В этом разделе вы узнаете о типах представлений, о преимуществах использования представлений и ограничениях, которые налагает SQL Server на использование представления.

Типы представлений

Можно создавать несколько типов представлений, каждый из которых имеет свои преимущества в определенных ситуациях. Тип представления, которое вы создаете, целиком зависит от цели, для которой вы хотите его использовать. Вы можете создавать представления в любой из следующих форм:

Примеры использования этих типов представлений см. в разделе "Использование T-SQL для создания представления" далее.

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

Преимущества представлений

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

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

Ограничения представлений

SQL Server налагает несколько ограничений на создание и использование представлений. Это следующие ограничения:

Примечание. Для получения более подробной информации по ограничениям представлений обратитесь к указателю Books Online и найдите "Creating a View" (Создание представления) и затем выберите тему "Creating a View" в диалоговом окне Topics Found (Найденные темы).

Создание представлений

Представления, как и индексы, можно создавать с помощью целого ряда способов. Вы можете создать представление с помощью оператора T-SQL CREATE VIEW. Этот метод предпочтительнее других, если существует вероятность, что вы будете создавать другие представления в будущем, поскольку вы можете помещать операторы T-SQL в файл сценария и затем редактировать и использовать этот файл снова и снова. SQL Server Enterprise MАnager поддерживает графическую среду, в которой вы можете создавать представление. И наконец, вы можете использовать мастер создания представлений Create View Wizard, когда вам требуется помощь, чтобы пройти через процесс создания представления, что может оказаться полезным как для новичка, так и специалиста.

Использование T-SQL для создания представления

Создание представлений с помощью T-SQL – достаточно простой процесс: вы запускаете оператор CREATE VIEW для создания представления с помощью ISQL, OSQL или Query Аnalyzer. Как уже говорилось, использование операторов T-SQL в сценарии предпочтительнее, поскольку эти операторы можно модифицировать и повторно использовать. (Вам следует также хранить определения вашей базы данных в сценариях в случае, если вам нужно воссоздать вашу базу данных.)

Оператор CREATE VIEW имеет следующий синтаксис:

CREATE VIEW имя_представления [(колонка, колонка ...)]
[WITH ENCRYPTION]
AS 
ваш оператор SELECT
[WITH CHECK OPTION]

Создавая представление, вы можете активизировать два средства, которые изменяют поведение представления. Для активизирования этих средств нужно включить в оператор T-SQL ключевые слова WITH ENCRYPTION и/или WITH CHECK OPTION. Рассмотрим эти средства более подробно.

Ключевое слово WITH ENCRYPTION указывает, что определение представления (оператор SELECT, определяющий представление) должно шифроваться. SQL Server использует для шифрования операторов SQL тот же метод, что и для паролей. Этот метод обеспечения безопасности может оказаться полезным, если вы не хотите, чтобы определенные классы пользователей знали, к каким таблицам осуществляется доступ.

Ключевое слово WITH CHECK OPTION указывает, что операции модифицирования данных, применяемые к представлению, должны отвечать критериям, содержащимся в операторе SELECT. Например, можно запретить операцию модифицирования данных, применяемую к представлению для создания строки таблицы, которая не видна внутри этого представления. Предположим, что определяется представление для выборки информации обо всех служащих финансового отдела (finАnce department). Если ключевое слово WITH CHECK OPTION не включено в оператор, то вы можете изменить значение finАnce колонки department на значение, указывающее другой отдел. Но если это ключевое слово указано, то данное изменение не будет допускаться, поскольку изменение значения колонки department в какой-либо строке сделает эту строку недоступной из данного представления. Ключевое слово WITH CHECK OPTION указывает, что вы не можете сделать какую-либо строку недоступной из представления, внося какое-либо изменение внутри этого представления.

Оператор SELECT можно изменять для создания любого нужного вам представления. Его можно использовать для выборки подмножества колонок или подмножества строк либо для выполнения какой-либо операции связывания (join). В следующих разделах вы узнаете, как использовать T-SQL для создания различных типов представлений.

Подмножество колонок

Представление, содержащее подмножество колонок, может оказаться полезным, если вам требуется обеспечить безопасность таблицы, которая должна быть доступна пользователям лишь частично. Рассмотрим один пример. Предположим, что база данных сотрудников предприятия содержит таблицу с именем Employee (Служащие) с колонками данных (рис. 18.1).

Таблица Employee


Рис. 18.1.  Таблица Employee

Большинство из этих данных являются критически важными и должны быть доступны для просмотра только определенным сотрудникам. Однако может оказаться полезным разрешить всем пользователям просмотр некоторых из этих данных. Для этого можно создать представление, которое разрешает всем пользователям доступ только к определенным данным. Это представление можно также использовать, чтобы избежать дублирования данных о сотрудниках в других таблицах данных.

Чтобы создать представление по таблице Employee, в котором имеется доступ только к колонкам name (имя), phone (телефон) и office (комната), используйте следующий оператор T-SQL:

CREATE VIEW emp_vw
AS 
	SELECT  	name, 
          		phone, 
          		office 
	FROM    	Employee

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

Представление emp_vw


Рис. 18.2.  Представление emp_vw

Подмножество строк

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

Таблица Employee с данными


Рис. 18.3.  Таблица Employee с данными

В этом примере вместо ограничения колонок мы ограничим строки, задав их в предложении WHERE, как это показано ниже:

CREATE VIEW emp_vw2
AS 
  	SELECT  		* 
  	FROM    		Employee 
 	 WHERE   		Dept = 1

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

Представление emp_vw2


Рис. 18.4.  Представление emp_vw2

Связывание

Определяя связывание в представлении, вы можете упрощать операторы T-SQL, используемые для доступа к данным, по сравнению с операторами, содержащими оператор JOIN. Рассмотрим один пример. Предположим, у нас имеются две таблицы – MАnager и Employee2 (рис. 18.5).

Таблицы MАnager и Employee2


Рис. 18.5.  Таблицы MАnager и Employee2

Следующий оператор выполняет связывание таблиц Employee2 и MАnager в одну виртуальную таблицу:

CREATE VIEW org_chart
AS 
  	SELECT 		Employee.ename, 
         				MАnager.mname 
  	FROM   		Employee, MАnager 
 	WHERE  		Employee.manager_id = mАnager.id 
  	GROUP  BY 	MАnager.mname, Employee.ename

В данном примере указанные две таблицы связаны значением mАnager_id (идентификатор руководителя). Результирующие данные, содержащиеся в представлении org_chart, сгруппированы по имени руководителя (mАnager_name) (рис. 18.6). Отметим, что если руководитель указан в таблице MАnager, но в таблице Employee2 нет ни одного служащего (employee) для этого руководителя, то в представлении нет ни одной записи для этого руководителя. В представлении также нет ни одной записи для служащего, содержащегося в таблице Employee2, но не имеющего соответствующего руководителя в таблице MАnager. Все это видят пользователи в виртуальной таблице со служащими и руководителями.

Агрегирование

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

Представление org_chart


Рис. 18.6.  Представление org_chart

Примечание.Функции агрегирования SQL Server выполняют расчеты по наборам значений и возвращают одно значение. Это функции AVG, COUNT, MAX, MIN и SUM.

Следующий оператор задает представление, в котором используется функция агрегирования SUM по таблице Employee:

CREATE VIEW sal_vw
AS
  	SELECT 		dept, 
                     SUM(Salary) 
  	FROM   		Employee 
  	GROUP  		BY dept

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

 Представление sal_vw


Рис. 18.7.  Представление sal_vw

Секционирование

Представления обычно используются для слияния секционированных данных в одну виртуальную таблицу. Секционирование используется для снижения размеров таблиц и индексов. Для секционирования данных вы создаете несколько таблиц, заменяющих одну таблицу, и присваиваете каждой новой таблице какой-либо диапазон значений из исходной таблицы. Например, вместо одной большой таблицы базы данных, в которой хранятся данные торговых транзакций вашей компании, вы можете создать много небольших таблиц, каждая из которых содержит данные за одну неделю, и затем использовать представление для их объединения, чтобы увидеть "историю" транзакций. Несколькими небольшими таблицами и соответствующими индексами управлять проще, чем одной большой таблицей базы данных и ее индексом. Кроме того, вы можете легко удалять устаревшие данные путем удаления одной из базовых таблиц с этими устаревшими данными. Рассмотрим эту тему более подробно.

Представление выглядит для пользователей как одна большая таблица, но она образована многими таблицами, каждая из которых имеет собственный индекс (рис. 18.8). (На самом деле здесь подошел бы кластеризованный индекс по дате.)

Как уже говорилось, при секционировании создается система, намного более удобная для управления администратором базы данных (DBA), а слияние секционированных данных упрощает данные для пользователя.

Чтобы создать представление, в котором объединяются секционированные данные (секционированное представление), вы должны сначала создать секционированные таблицы. Эти таблицы будут, скорее всего, содержать данные по продажам. В каждой таблице будут храниться данные за определенный период – обычно за неделю или месяц. Создав эти таблицы, вы можете использовать оператор UNION ALL, чтобы создать представление, содержащее все данные. Например, предположим, что у вас четыре таблицы с именами table_1, table_2, table_3 и table_4. Следующий оператор создает одну большую виртуальную таблицу, содержащую все данные из этих таблиц:

Использование представлений для слияния секционированных данных


Рис. 18.8.  Использование представлений для слияния секционированных данных

CREATE VIEW partview
AS 
  	SELECT * FROM table_1 
  	UNION ALL 
  	SELECT * FROM table_2 
  	UNION ALL 
  	SELECT * FROM table_3 
  	UNION ALL 
  	SELECT * FROM table_4

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

Использование Enterprise MАnager для создания представления

В этом разделе мы будем использовать Enterprise MАnager для создания представления в базе данных Northwind. Следующие шаги позволят вам пройти через этот процесс:

  1. В окне Enterprise MАnager раскройте папку Databases (Базы данных) для сервера, на котором находится база данных Northwind, и щелкните на Northwind. Информация по базе данных появится в правой панели окна (рис. 18.9).
  2. Щелкните правой кнопкой мыши на Northwind в левой панели. Укажите в появившемся контекстном меню команду New (Создать) и затем выберите пункт View (Представление). Появится окно New View (Создание представления) (рис. 18.10). Это окно применяется для определения имени представления, колонок таблиц, используемых в этом представлении, и структуры базовых таблиц.

    Информация по базе данных Northwind


    увеличить изображение

    Рис. 18.9.  Информация по базе данных Northwind

    Окно New View (Создание представления)


    увеличить изображение

    Рис. 18.10.  Окно New View (Создание представления)

    Окно New View состоит из следующих четырех панелей:

    • Панель схемы (Diagram pАne). Показывает данные таблицы, которые используются для создания представления. В этой панели можно выбирать колонки.
    • Панель-сетка (Grid pАne).Показывает колонки, выбранные из таблицы или базовых таблиц. В этой панели можно выбирать колонки.
    • Панель SQL (SQL pАne).Показывает оператор SQL, используемый для определения данного представления. SQL Server генерирует этот оператор SQL, когда вы перетаскиваете элементы панели схемы и выбираете колонки в панели-сетке.
    • Панель результатов (Results pАne). Показывает строки, считанные из представления. Эта информация позволяет вам понять, как выглядят данные.
    Вы можете задавать визуализацию этих панелей, щелкая на соответствующих кнопках в панели инструментов окна New View. Другие кнопки панели инструментов используются для некоторых важных функций. В следующем списке дается описание этих кнопок, начиная с левого края панели инструментов:
    • Save (Сохранить). Сохраняет данное представление.
    • Properties (Свойства).Позволяет вам изменять свойства данного представления. При щелчке на этой кнопке появляется окно Properties, содержащее опции Distinct Values (Неповторяющиеся значения) и Encrypt View (Шифровать представление).
    • Show/Hide PАnes (Показать/Скрыть панели) – четыре кнопки. Позволяют вам показывать или скрывать четыре панели окна New View.
    • Run (Выполнить). Запускает соответствующий запрос и выводит результаты в панели результатов. Эту проверку можно использовать, чтобы убедиться в правильности работы запроса.
    • CАncel Execution Аnd Clear Results (Прекратить выполнение и удалить результаты). Очищает панель результатов.
    • Verify SQL (Проверить SQL). Проверяет запрос на соответствие базовой таблице для подтверждения правильности оператора SQL.
    • Remove Filter (Удалить фильтр). Удаляет все определенные ранее фильтры.
    • Use GROUP BY (Использовать GROUP BY). Добавляет предложение GROUP BY к оператору в панели SQL.
    • Add Table (Добавить таблицу). Позволяет добавить какую-либо таблицу к запросу.
  3. Модифицируйте оператор SELECT в панели SQL в соответствии с оператором SELECT (рис. 18.11). Представление будет содержать колонки CompАnyName, ContАсtName и Phone. Набрав текст оператора SELECT, щелкните на кнопке Verify SQL, чтобы проверить правильность данного запроса. Если это так, то вы должны щелкнуть на кнопке OK в появившемся диалоговом окне, чтобы Enterprise MАnager заполнил панель схемы и панель-сетку. Ваше окно New View будет выглядеть (рис. 18.11).
  4. Закончив проверку того, что представление отвечает вашим требованиям (с помощью панели результатов), и внеся необходимые изменения, закройте окно New View. Если щелкнуть на кнопке Yes (Да), то вы получите запрос на ввод имени данного представления. Введите описательное имя вашего представления и сохраните представление, щелкнув на кнопке OK.

Ваше представление теперь доступно для использования. Вы можете использовать Enterprise MАnager, чтобы задать свойства нового представления, включая полномочия доступа. Окно View Properties (Свойства представления) описывается в разделе "Изменение и удаление представлений" далее.

Заполненное окно New View (Создание представления)


увеличить изображение

Рис. 18.11.  Заполненное окно New View (Создание представления)

Использование мастера Create View Wizard для создания представления

Чтобы использовать мастер Create View Wizard для создания представления, выполните следующие шаги.

  1. В окне Enterprise MАnager выберите пункт Wizards (Мастера) из меню Tools, раскройте в появившемся диалоговом окне папку Database, выберите Create View Wizard и щелкните на кнопке OK. Появится начальное окно Create View Wizard (рис. 18.12).
  2. Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database (Выбор базы данных). В этом окне вы можете указать базу данных, для которой хотите создать представление; в данном случае – базу данных Northwind.
  3. Щелкните на кнопке Next, чтобы появилось окно Select Objects (Выбор объектов) (рис. 18.13). Здесь вы можете выбрать одну или несколько таблиц для данного представления. Если создается простое представление, то вы можете выбрать одну таблицу. Для создания представления путем связывания выберите несколько таблиц.
  4. Щелкните на кнопке Next, чтобы появилось окно Select Columns (Выбор колонок) (рис. 18.14). Здесь вы можете выбрать колонки, которые хотите использовать в этом представлении; в данном примере выбраны колонки CompАnyName, ContАсtName и Phone.

    Начальное окно Create View Wizard


    Рис. 18.12.  Начальное окно Create View Wizard

    Окно Select Objects (Выбор объектов)


    Рис. 18.13.  Окно Select Objects (Выбор объектов)

     Окно Select Columns (Выбор колонок)


    Рис. 18.14.  Окно Select Columns (Выбор колонок)

  5. Щелкните на кнопке Next, чтобы появилось окно Define Restriction (Определить ограничение). Это окно используется, чтобы определить необязательное предложение WHERE, ограничивающее строки базы данных, выбираемые в данном представлении.
  6. Щелкните на кнопке Next, чтобы появилось окно Name the View (Задание имени представления) (рис. 18.15). Введите имя представления в текстовом поле View Name (Имя представления).

    Окно Name the View (Задание имени представления)


    Рис. 18.15.  Окно Name the View (Задание имени представления)

  7. Щелкните на кнопке Next, чтобы появилось окно Completing the Create View Wizard (Завершение работы мастера создания представления) (рис. 18.16). Это окно позволяет вам сохранять данное представление, выполнять обратную трассировку и вносить изменения или отменять создание представления. После щелчка на кнопке Finish (Готово) данное представление становится доступным для использования.

    Окно Completing the Create View Wizard


    Рис. 18.16.  Окно Completing the Create View Wizard

Советы по использованию представлений

Создавая представление, помните, что представление – это оператор SQL, выполняющий доступ к базовым данным, и что именно вы контролируете этот оператор SQL. Кроме того, помните следующие рекомендации, которые могут оказаться полезными для улучшения производительности, управляемости и применимости ваших баз: данных.

Изменение и удаление представлений

Удаление и изменение представлений выполняется с помощью Enterprise MАnager или операторов T-SQL. Работать с Enterprise MАnager проще, как и при выполнении других процедур SQL Server, но операторы T-SQL обеспечивают повторяемость. В этом разделе мы рассмотрим оба метода.

Использование Enterprise MАnager для изменения и удаления представлений

Для изменения и удаления представлений с помощью Enterprise MАnager выполните следующие шаги.

Закончив модифицирование представления, вы можете задать полномочия доступа к этому представлению. Сначала откройте окно View Properties, щелкнув правой кнопкой мыши на имени представления в окне Enterprise MАnager и выбрав из контекстного меню пункт Properties. Затем щелкните на Permissions (Полномочия), чтобы вывести на экран полномочия доступа для данного представления. (О процессе задания полномочий см. лекцию 34.)

Как видите, модифицирование представления с помощью Enterprise MАnager происходит просто. Но если вы модифицируете или удаляете большое число представлений, то будет намного удобнее использовать язык T-SQL, поскольку его можно использовать в сценариях.

Использование T-SQL для изменения и удаления представлений

Для изменения представлений с помощью T-SQL используйте оператор ALTER VIEW. Оператор ALTER VIEW аналогичен оператору CREATE VIEW и имеет следующий синтаксис:

ALTER VIEW имя_представления [(колонка, колонка, ...)]
[WITH ENCRYPTION]
AS 
ваш оператор SELECT
[WITH CHECK OPTION]

Единственным отличием между операторами ALTER VIEW и CREATE VIEW является то, что оператор CREATE VIEW не будет выполняться, если представление уже существует, а оператор ALTER VIEW не будет выполняться, если указанное представление не существует. (Необязательные ключевые слова WITH ENCRYPTION и WITH CHECK OPTION описаны в разделе "Использование T-SQL для создания представления" выше.)

Чтобы увидеть, как действует оператор ALTER VIEW, вернемся к нашему примеру секционирования (описанному в разделе "Секционирование"). Чтобы удалить устаревшую секцию данных и добавить новую секцию, мы можем изменить представление следующим образом:

ALTER VIEW partview
AS 
  	SELECT * FROM table_2 
  	UNION ALL 
  	SELECT * FROM table_3 
  	UNION ALL 
  	SELECT * FROM table_4 
  	UNION ALL 
  	SELECT * FROM table_5

Модифицированное представление будет выглядеть аналогично прежнему виду (до выполнения оператора ALTER VIEW ), но теперь будет выбран другой набор данных. Представление теперь не использует таблицу table_1 и использует таблицу table_5.

Для удаления представления используйте оператор DROP VIEW. Оператор DROP VIEW имеет следующий простой синтаксис:

DROP VIEW имя_представления

Как видите, оба метода – использование Enterprise MАnager и команд T-SQL – удобны для использования. Выберите метод, который наиболее отвечает вашим требованиям.

Расширение возможностей представлений в SQL Server 2000

В SQL Server 2000 включены два расширения по представлениям: секционированные представления теперь можно модифицировать и распределять по серверам, и представления можно теперь индексировать подобно таблицам. Рассмотрим эти расширения чуть подробнее.

Модифицируемые распределяемые секционированные представления

В Microsoft SQL Server версии 7 и более ранних версий данные представлений были статическими и отражали реальное состояние базовой таблицы или таблиц. В SQL Server 2000 модифицирование, примененное к секционированному представлению, изменяет как представление, так и базовую таблицу или таблицы. Кроме того, секционированные представления могут охватывать несколько систем SQL Server 2000. Секционированные представления можно использовать для реализации объединения серверов баз данных. Объединение (federation) – это группа серверов, каждый из которых администрируется независимо от других серверов, но который используется для равномерного распределения нагрузки всей системы. Создавая объединение серверов, вы распределяете данные между серверами, что позволяет вам осуществлять масштабирование системы. Объединение серверов базы данных может расти, поддерживая самые крупные Web-сайты электронной коммерции или системы баз данных предприятий. На рис. 18.21 показан пример конфигурации для объединения серверов баз данных.

 Объединение систем SQL Server


Рис. 18.21.  Объединение систем SQL Server

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

При формировании таблиц-участниц вы секционируете их по горизонтали. Каждая таблица-участница хранит горизонтальный "срез" исходных данных. Это секционирование обычно происходит по диапазонам значений ключей. Этот диапазон основывается на реальных значениях данных в секционируемой колонке. Необходимый диапазон значений для каждой таблицы-участницы обеспечивается ограничением CHECK секционируемой колонки. При секционировании ваших данных следите за ситуациями, когда эти диапазоны данных не полностью охватывают ваши данные. Рассмотрим пример горизонтального секционирования. В этом примере мы будем секционировать таблицу сustomer на четыре таблицы-участницы и поместим каждую таблицу на отдельный сервер. Каждый сервер будет содержать 3000 записей таблицы сustomer. Эти ограничения показаны в следующих операторах CREATE TABLE:

Server 1:
CREATE TABLE Customer_Table_1 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 1 АND 3000), 
   	. 
   	.     	(Дополнительные определения колонки)
   	.
Server 2:
CREATE TABLE Customer_Table_2 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 3001 АND 6000), 
   	. 
   	.     	(Дополнительные определения колонки)
   	.
Server 3:
CREATE TABLE Customer_Table_3 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 6001 АND 9000), 

   	. 
  	.     	(Дополнительные определения колонки)
   	.
Server 4:
CREATE TABLE Customer_Table_4 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 9001 АND 12000), 
   	. 
   	.     	(Дополнительные определения колонки)
   	.

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

Для поддержки прозрачности данных вам потребуется создать определения присоединенного сервера на каждом сервере-участнике. Эти определения обеспечивают сервер-участник всей информацией о соединениях для всех других серверов-участников данного объединения. Это позволяет секционированному представлению на любом сервере осуществлять доступ к данным на других серверах-участниках. Определения присоединенных серверов создаются с помощью операторов T-SQL или Enterprise MАnager.

Присоединение серверов с помощью T-SQL

Оператор T-SQL, используемый для определения присоединенного сервера, имеет следующий вид:

sp_addlinkedserver [ @server = ] 'сервер'
            	    [ , [ @srvproduct = ] 'имя_продукта' ]
                    [ , [ @provider = ] 'имя_провайдера' ]
                    [ , [ @datasrc = ] 'источник_данных' ]
                    [ , [ @location = ] 'местоположение' ]
                    [ , [ @provstr = ] 'строка_провайдера' ]
                    [ , [ @catalog = ] 'каталог' ]

Хранимая процедура sp_addlinkedserver имеет следующие параметры:

Например, следующий оператор T-SQL создает определения присоединенного сервера для обмена данными между серверами Server1, Server2, Server3 и Server4.

Server 1:
sp_addlinkedserver 'Server2' 
sp_setnetname 'Server2', 'sql-server-02' 
sp_addlinkedserverlogin Server2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3' 
sp_setnetname 'Server3', 'sql-server-03' 
sp_addlinkedserverlogin Server3, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4' 
sp_setnetname 'Server4', 'sql-server-04' 
sp_addlinkedserverlogin Server4, 'false', 'sa', 'sa'

Server 2:
sp_addlinkedserver 'Server1' 
sp_setnetname 'Server1', 'sql-server-01' 
sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3' 
sp_setnetname 'Server3', 'sql-server-03' 
sp_addlinkedserverlogin Server3, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4' 
sp_setnetname 'Server4', 'sql-server-04' 
sp_addlinkedserverlogin Server4, 'false', 'sa', 'sa'

Server 3:
sp_addlinkedserver 'Server1' 
sp_setnetname 'Server1', 'sql-server-01' 
sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server2' 
sp_setnetname 'Server2', 'sql-server-02' 
sp_addlinkedsrvlogin Server2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4' 
sp_setnetname 'Server4', 'sql-server-04' 
sp_addlinkedsrvlogin Server4, 'false', 'sa', 'sa'

Server 4:
sp_addlinkedserver 'Server1' 
sp_setnetname 'Server1', 'sql-server-01' 
sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server2' 
sp_setnetname 'Server2', 'sql-server-02' 
sp_addlinkedsrvlogin Server2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3' 
sp_setnetname 'Server3', 'sql-server-03' 
sp_addlinkedsrvlogin Server3, 'false', 'sa', 'sa'

В дополнение к оператору T-SQL sp_addlinkedserver были использованы два оператора. Эти операторы требуются для улучшения обработки распределенного секционированного представления. Обращение к sp_setnetname связывает имя присоединенного сервера в SQL Server с сетевым именем сервера, на котором находится база данных. В этом примере имя присоединенного сервера Server2 находится на сервере с сетевым именем sql-server-02. Мы также задали "верительные данные" для входа на присоединенный сервер. Обращение к sp_addlinkedsrvlogin указывает системе SQL Server, что для доступа к присоединенному серверу нужно использовать заданный идентификатор пользователя (user ID) и пароль.

Присоединение серверов с помощью Enterprise MАnager

Enterprise MАnager тоже позволяет присоединять серверы. Для использования этого метода выполните следующие шаги:

  1. В окне Enterprise MАnager раскройте папку Security (Безопасность) для вашего сервера (рис. 18.22).
  2. Щелкните правой кнопкой мыши на Linked Servers (Присоединенные серверы) в левой панели. Выберите в появившемся контекстном меню New Linked Server (Создать присоединенный сервер). Появится окно Linked Server Properties (Свойства присоединенного сервера) (рис. 18.23).

     Раскрытие папки Security на сервере


    увеличить изображение

    Рис. 18.22.  Раскрытие папки Security на сервере

     Вкладка General (Общие) окна Linked Server Properties


    Рис. 18.23.  Вкладка General (Общие) окна Linked Server Properties

  3. В текстовом поле Linked Server введите имя сервера SQL, который вы хотите присоединить. Щелкните на кнопке выбора SQL Server (рис. 18.24).
  4. Щелкните на вкладке Security. Введите локальное login-имя и установите флажок Impersonate или введите удаленное имя и пароль. На рис. 18.25 показан ввод локального имени.

     Выбор типа присоединенного сервера


    Рис. 18.24.  Выбор типа присоединенного сервера

     Вкладка Security окна Linked Server Properties


    Рис. 18.25.  Вкладка Security окна Linked Server Properties

  5. Щелкните на кнопке OK, чтобы завершить определение присоединенного сервера.

Присоединенный сервер теперь доступен для использования. Вы можете также использовать Enterprise MАnager для модифицирования или удаления свойств присоединенного сервера. Кроме того, вы можете использовать Enterprise MАnager для просмотра таблиц и представлений, имеющихся на присоединенном сервере.

Создание представления

После того как сделаны все определения присоединенных серверов, вы можете создать реальное представление. В следующем примере создается представление с именем sales (продажи), в котором объединяются данные по продажам из таблицы sales на четырех серверах:

CREATE VIEW sales 
AS
  	SELECT * FROM /*Server1.bicycle.dbo.*/l_sales  
    		UNION ALL  
      			SELECT * FROM Server2.bicycle.dbo.l_sales 
    		UNION ALL 
      			SELECT * FROM Server3.bicycle.dbo.l_sales 
    		UNION ALL 
      			SELECT * FROM Server4.bicycle.dbo.l_sales 
GO
Индексированные представления

SQL Server 2000 также позволяет вам создать индекс по представлению. Поскольку представление – это просто виртуальная таблица, она имеет ту же общую форму, что и реальная таблица базы данных. Индекс создается с помощью оператора T-SQL CREATE INDEX, который вы уже использовали для создания индекса по таблице. (Этот оператор описан в лекции 17.) Единственным отличием является то, что вместо имени таблицы вы указываете имя представления. Например, следующий оператор T-SQL создает кластеризованный индекс по представлению с именем partview:

CREATE UNIQUE CLUSTERED INDEX partview_cluidx
  	ON partview (part_num ASC) 
  	 WITH FILLFАСTOR=95 
ON partfilegroup

Создание индексов по представлениям имеет несколько факторов влияния на производительность. Очевидно, что индекс по представлению повышает производительность при доступе к данным в представлении точно так же, как и индекс по таблице.

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

Кроме того, если вы создаете индекс по представлению, оптимизатор запросов SQL Server автоматически использует индекс в запросах, где нет явного указания имени представления в предложении FROM оператора SELECT. Иными словами, если существующий запрос в приложении или хранимой процедуре может получить преимущества от использования индексированного представления, то оптимизатор запросов будет применять для реализации запроса это индексированное представление.

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

Заключение

В этой лекции вы узнали, что представление – это вспомогательная структура данных, которую можно использовать для создания виртуальных таблиц. Эти виртуальные таблицы выглядят, как реальные таблицы базы данных, но это на самом деле просто сохраненные запросы SQL. Эти запросы объединяются с другими запросами для доступа к базовой таблице или таблицам.

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

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

Лекция 19. Транзакции и блокировка транзакций

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

В этой лекции рассматриваются основы использования транзакций и блокировки транзакций. Вы узнаете, что такое транзакция, какими свойствами в Microsoft SQL Server 2000 должны обладать транзакции, чтобы их можно было использовать, как использовать режимы транзакций для указания начала и конца транзакции и как фиксировать (завершать) транзакции и выполнять их "откат" (отмену). Мы рассмотрим типы и режимы блокировки, которые используются в SQL Server при выполнении транзакций, а также концепции блокирования и взаимоблокировки. Лекция заканчивается описанием некоторых подсказок блокировки на уровне таблиц, которые вы можете использовать в ваших транзакциях.

Что такое транзакция?

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

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

ACID-свойства

Чтобы транзакцию можно было считать допустимой для использования, она должна отвечать четырем требованиям. Эти требования называют ACID-свойствами. "ACID" – это сокращение от "atomicity (атомарность), consistency (согласованность), isolation (изолированность) и durability (устойчивость)". В SQL Server включены механизмы, помогающие обеспечивать соответствие транзакций каждому из этих требований.

Атомарность

SQL Server обеспечивает, что в случае успешного выполнения транзакции фиксируются все модификации данных этой транзакции (в виде группы), а в случае неудачного выполнения транзакции не фиксируется ни одна из модификаций; иными словами, SQL Server обеспечивает атомарность своих транзакций. Транзакция должна выполняться как элементарная (атомарная) операция – отсюда термин "атомарность". Чтобы транзакция считалась успешно выполненной, должен быть выполнен каждый шаг (или оператор) этой транзакции. При неудачном выполнении одного из шагов вся транзакция считается неуспешной, и происходит отмена всех модификаций, внесенных с момента начала транзакции. SQL Server содержит механизм управления транзакциями, который автоматически определяет результат завершения транзакции (успешный или неуспешный) и при необходимости (в случае неуспешной транзакции) отменяет любые модификации данных.

Согласованность

SQL Server обеспечивает также согласованность ваших транзакций. Согласованность означает, что после окончания транзакции все данные остаются в согласованном состоянии (сохраняется целостность данных) – будь то успешно или неуспешно завершенная транзакция. Перед началом любой транзакции база данных должна быть в согласованном состоянии, а это означает поддержку целостности данных и правильность внутренних структур, таких как индексы B-деревьев и двунаправленные списки. После выполнения транзакции база данных тоже должна быть в согласованном состоянии – в новом состоянии для успешной транзакции или в том же состоянии, что и перед началом транзакции в случае неуспешного завершения.

Согласованность также является свойством в управлении транзакциями, которое поддерживается в SQL Server. Если ваши данные являются согласованными, а в ваших транзакциях поддерживается логическая согласованность и целостность данных, то SQL Server обеспечит согласованность данных после любой транзакции. Используя репликацию данных в распределенной среде, вы можете задавать различные уровни согласованности от конечной сходимости транзакций, т.е. скрытой согласованности, до непосредственной согласованности транзакций. Уровень согласованности будет зависеть от типа используемой вами репликации. Более подробную информацию о репликациях см. в лекциях 26, 27 и 28.

Изолированность

Изолированность означает, что каждая транзакция действует так же, как если бы она была единственной в системе; иными словами, модификации, выполняемые в одной транзакции, изолируются от модификаций, выполняемых в другой параллельно выполняемой транзакции. Тем самым на любую транзакцию не влияет никакое значение, изменяемое другой транзакцией, пока это изменение не будет зафиксировано. В случае неуспешной транзакции ее модификации не будут оказывать влияния, поскольку будет выполнен откат (отмена) соответствующих изменений. SQL Server позволяет вам задавать уровень изолированности для ваших транзакций. Характер изолируемости транзакций зависит от указанного вами уровня изолированности.

Примечание. Если транзакция фиксируется, то все ее модификации становятся постоянной частью базы данных. При откате транзакции происходит отмена изменений, и база данных работает так, как будто эта транзакция не выполнялась.
Уровни изолированности

SQL Server поддерживает четыре уровня изолированности. Уровень изолированности – значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, т.е. степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных. Указываемый вами уровень изолированности для сеанса SQL Server определяет блокирующее поведение всех операторов SELECT, выполняемых во время этого сеанса (если только вы не задали другой уровень изолированности). Блокирующее поведение описано в разделе "Блокировка транзакций" ниже в этой лекции. Ниже описано четыре уровня изолированности – от низшего до высшего:

Поведение параллельных транзакций

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

В табл. 19.1 приводится список типов поведения, которые допускаются на каждом уровне изолированности. Как можно видеть из таблицы, уровень read uncommitted является наименее ограничивающим уровнем изолированности, а serializable – наиболее ограничивающим. Как уже отмечалось, read committed является в SQL Server принятым по умолчанию уровнем изолированности. По мере роста уровня изолированности SQL Server налагает все более ограничивающую блокировку на все более длительные периоды времени. И, как отмечалось, уровень изолированности влияет на блокирующее поведение операторов SELECT, а это означает, что изолированность влияет на режим блокировки, применяемый к читаемым данным. Режимы блокировки описаны в разделе "Блокировка транзакций" далее.

Таблица 19.1. Поведение при различных уровнях изолированности
Допустимое поведениеЧтение нефиксированных данныхНеповторяемое чтениеФантомное чтение
Read uncommittedДаДаДа
Read committedНетДаДа
Repeatable readНетНетДа
SerializableНетНетНет
Задание уровня изолированности

Вы можете задать уровень изолированности, который будет использоваться для всего сеанса пользователя SQL Server, с помощью операторов Transact-SQL (T-SQL) или с помощью функций в вашем приложении. Вы можете также задать в запросе подсказку блокировки, чтобы переопределить уровень изолированности для данной транзакции. Подсказки блокировки приводятся в секции "Подсказки блокировки" далее. Чтобы задать уровень изолированности с помощью T-SQL или в приложении DB-LIB, используйте оператор SET TRANSACTION ISOLATION LEVEL и задайте один из четырех уровней изолированности. Используется следующий синтаксис:

SET TRANSACTION ISOLATION LEVEL
    READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SERIALIZABLE
GO
Дополнительная информация. Для других типов приложений, использующих, например, ODBC, ADO или OLE-DB, найдите "ACID properties" (ACID-свойства) в Books Online и выберите "Adjusting Transaction Isolation Levels" (Изменение уровней изолированности транзакций) в диалоговом окне Topics Found (Найденные темы).

После того как вы задали определенный уровень изолированности для сеанса, все последующие транзакции в этом сеансе SQL Server будут осуществлять блокировку, обеспечивающую этот уровень изолированности. Чтобы определить, какой уровень изолированности SQL Server применяется в данный момент по умолчанию, используйте команду DBCC USEROPTIONS. Нужно просто указать имя данной команды:

DBCC USEROPTIONS

Эта команда возвращает в результате только те параметры, которые задал пользователь или которые являются активными. Если вы не задали уровень изолированности (оставив принятый по умолчанию уровень SQL Server), то не увидите этот уровень, запустив оператор DBCC USEROPTIONS. Но если вы все-таки задали уровень, отличный от принятого по умолчанию, то увидите этот уровень изолированности. Например, если выполнить следующие операторы, то уровень изолированности будет показан в результатах оператора DBCC USEROPTIONS:

USE pubs
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
DBCC USEROPTIONS
GO

Результаты оператора DBCC USEROPTIONS будут выведены в следующей форме:

Set Option        Value
---------------------------------------------
textsize        64512
language        us_english
dateformat        mdy
datefirst        7
quoted_identifier    SET
arithabort        SET
ansi_null_dflt_on    SET
ansi_defaults      SET
ansi_warnings      SET
ansi_padding      SET
ansi_nulls        SET
concat_null_yields_null  SET
isolation level      serializable

(13 row(s) affected)

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

Устойчивость

Последним из ACID-свойств является устойчивость. Устойчивость означает, что после того, как транзакция фиксирована, влияние этой транзакции в базе данных становится постоянным – даже в случае отказа системы. Устойчивость обеспечивается журналом транзакций SQL Server и вашими резервными копиями базы данных. При отказе SQL Server, операционной системы или какого-либо компонента сервера база данных будет автоматически восстановлена при перезапуске SQL Server. SQL Server использует журнал транзакций для воспроизведения фиксированных транзакций, на которые повлиял отказ системы, а также выполняет откат любых нефиксированных транзакций.

При отказе какого-либо устройства с данными или потере или порче данных вы можете восстановить базу данных, используя резервные копии базы данных и ре-зервные копии журнала транзакций. Имея обоснованный план резервного копирования, вы всегда сможете восстановить свою систему после аварии. К сожалению, при отказе ваших устройств резервного копирования и потере резервной копии, необходимой для восстановления системы, вы, возможно, не сможете восстановить свою базу данных. (О резервном копировании и восстановлении вашей базы данных и журналов транзакций см. лекции 32 и 33.) Теперь, когда вы ознакомились со свойствами транзакции, рассмотрим, как начинать и заканчивать транзакцию.

Режимы транзакций

Транзакция может начинаться в одном из трех режимов: автофиксация ( autocommit ), явный режим ( explicit ) или неявный режим ( implicit ). По умолчанию для SQL Server принят режим автофиксации. Рассмотрим, что означает каждый из этих режимов.

Режим автофиксации

В режиме автофиксации каждый оператор T-SQL фиксируется по его завершении, и в этом режиме не требуется никаких дополнительных операторов для управления транзакциями. Иными словами, каждая транзакция состоит только из одного оператора T-SQL. Режим автофиксации полезен при выполнении операторов с помощью интерактивной командной строки, утилиты OSQL или анализатора очередей SQL Server Query Аnalyzer, поскольку вам не нужно задавать в явном виде запуск и окончание каждой транзакции. Каждый оператор будет рассматриваться системой SQL Server как отдельная транзакция и будет фиксироваться сразу после его завершения. Режим автофиксации будет использоваться в каждом соединении с SQL Server, пока вы не запустите транзакцию в явном режиме с помощью оператора BEGIN TRANSACTION или пока не укажете неявный режим. По окончании явно заданной транзакции или после отключения неявного режима SQL Server возвращается к режиму автофиксации.

Явный режим

Явный режим используется чаще всего для программных приложений, а также для хранимых процедур, триггеров и сценариев. При запуске группы операторов для выполнения какой-либо задачи вам может потребоваться указание начала и конца данной транзакции, чтобы затем выполнить фиксацию всей группы операторов или отмену (откат) модификаций всей группы. Если вы явно указываете начало и конец транзакции, это означает, что вы используете явный режим, и такую транзакцию называют явной транзакцией. Явная транзакция задается с помощью операторов T-SQL или с помощью функций API. В этом разделе рассматривается только метод T-SQL; функции API выходят за рамки изложения этой книги.

Дополнительная информация. Для получения сведений о явных транзакциях, использующих технологию ADO и OLE-DB, найдите "explicit transactions" (явные транзакции) в Books Online и выберите "Explicit Transactions" в диалоговом окне Topics Found. Отметим, что ODBC API не поддерживает явных транзакций, а только транзакции в неявном режиме и режиме автофиксации.
Практические советы.
Использование явной транзакции

Рассмотрим ситуацию, в которой вам потребовалось бы использование явной транзакции для запуска и окончания задачи. Предположим, что у нас имеется хранимая процедура с именем Place_Order (Поместить_Заказ), которая управляет в базе данных задачей размещения заказа покупателя на какой-либо товар. Эта процедура включает в себя следующие шаги: выбор информации о текущем счете покупателя, ввод идентификационного номера нового заказа и наименования товара, расчет стоимости заказа с учетом налогов, обновление остатка на счете покупателя с учетом общей стоимости и проверка наличия товара на складе.

Для согласованности информации в базе данных нам нужно, чтобы были завершены все эти шаги или не был завершен ни один из этих шагов. Для этой цели мы сгруппируем все операторы, управляющие данной задачей, в одну явную транзакцию. Если эти операторы не будут объединены в одну группу, это может привести к несогласованному состоянию данных. Например, при обрыве соединения клиента с сервером после завершения шага, где вводится номер нового заказа, но до обновления остатка на счете покупателя, в базе данных появится новый заказ для данного покупателя, но без снятия денег со счета покупателя. В этом случае SQL Server фиксирует каждый оператор сразу после его окончания, что оставляет хранимую процедуру незаконченной на момент разъединения сети. Но если все указанные шаги определены в рамках одной явной транзакции, то в случае разъединения SQL Server автоматически выполнит откат всей транзакции, а клиент может затем снова подсоединиться к серверу и повторно выполнить данную процедуру. Более подробную информацию см. в разделе "Откаты транзакций" далее.

Использование явных транзакций, когда ваша задача состоит из нескольких шагов, как в предыдущем примере, также дает преимущества, поскольку SQL Server (независимо от использования вами операторов ROLLBACK ) автоматически выполнит откат ваших транзакций в случае серьезных ошибок, таких как обрыв связи в сети, аварийный сбой (базы данных или клиентской системы) или взаимоблокировка. (Взаимоблокировки рассматриваются в разделе "Блокирование и взаимоблокировки" далее.) Для запуска транзакции используется оператор T-SQL BEGIN TRANSACTION. Чтобы указать конец транзакции, используется COMMIT TRANSACTION или ROLLBACK TRANSACTION. В операторе BEGIN TRANSACTION вы можете дополнительно указать имя транзакции и затем ссылаться на эту транзакцию по имени в операторе COMMIT TRANSACTION или ROLLBACK TRANSACTION. Ниже показан синтаксис этих трех операторов:

BEGIN TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции]
COMMIT [TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции]]
ROLLBACK [TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции
    | имя_точки_сохранения | @переменная_с_именем_точки_сохранения]]
Фиксирование транзакций

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

Все ресурсы, используемые транзакцией, такие как блокировки, освобождаются после фиксирования данной транзакции. Фиксирование транзакции считается успешным в случае успешного завершения каждого из ее операторов. Ниже приводится небольшая транзакция с именем update_state, которая изменяет в таблице publishers (издатели) значение колонки state на XX для всех издателей, у которых в этой колонке содержится значение NULL:

USE pubs
GO
BEGIN TRAN update_state

UPDATE publishers SET state = 'XX'
WHERE state IS NULL
COMMIT TRAN update_state
GO

Запустив эту транзакцию, вы увидите, что это повлияло на две строки. Чтобы вернуть таблицу к ее исходному состоянию (как если бы вместо фиксирования произошел откат), выполните следующую транзакцию:

USE pubs
GO
BEGIN TRAN undo_update_state

UPDATE publishers SET state = NULL
WHERE state = 'XX'
COMMIT TRAN undo_update_state
GO

И снова вы увидите, что это повлияло на две строки. Имена транзакций update_state (модифицировать_состояние) и undo_update_state (отменить_модификацию_состояния), используемые в операторе COMMIT TRAN, игнорируются в SQL Server: имена транзакций используются просто для удобства программиста, чтобы можно было указать имя фиксируемой транзакции. SQL Server автоматически фиксирует последнюю нефиксированную транзакцию, запущенную перед фиксированием, независимо от указания имени транзакции.

Создание вложенных транзакций

В SQL Server разрешаются вложенные транзакции, т.е. транзакции внутри транзакции. В случае вложенных транзакций вы должны явно фиксировать каждую внутреннюю транзакцию, чтобы SQL Server получал информацию об окончании внутренней транзакции и мог освободить ресурсы, используемые этой транзакцией, когда будет фиксирована внешняя транзакция. Если ресурсы блокированы, другие пользователи не могут получать доступа к этим ресурсам. Хотя вы должны явным образом включать оператор фиксации COMMIT для каждой транзакции, SQL Server не выполняет фактического фиксирования внутренних транзакций, пока не произойдет успешное фиксирование внешней транзакции; одновременно с этим SQL Server освобождает все ресурсы, используемые внутренними и внешней транзакциями. При неуспешном фиксировании внешней транзакции фиксирование внутренних транзакций не выполняется и происходит откат внешней и всех внутренних транзакций. После фиксирования внешней транзакции выполняется фиксирование внутренних транзакций. Иными словами, SQL Server по сути игнорирует операторы COMMIT внутри внутренних вложенных транзакций – в том смысле, что внутренние транзакции не фиксируются в ожидании окончательного фиксирования или отката внешней транзакции, чтобы определить статус завершения всех внутренних транзакций. (Это разъясняется в примерах на врезках "Практические советы" далее.) Кроме того, в случае использования оператора отката ROLLBACK во внешней транзакции или в любой из внутренних транзакций происходит откат всех этих транзакций. В оператор ROLLBACK нельзя включать имя внутренней транзакции; в этом случае SQL Server возвратит сообщение об ошибке. Можно включать имя внешней транзакции, имя точки сохранения или не включать никакого имени. (Описание точек сохранения приводится в разделе "Точки сохранения" далее.)

Практические советы.
Практические советы

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

USE MyDB
GO
CREATE PROCEDURE Place_Order       --Создает хранимую процедуру
AS
BEGIN TRAN place_order_tran
PRINT 'Здесь должны быть SQL-операторы, выполняющие задачи по заказам'
COMMIT TRAN place_order_tran
GO

BEGIN TRAN Order_tran                --Начинает внешнюю транзакцию
PRINT 'Поместите заказ'
EXEC Place_Order                       --Вызывает хранимую процедуру, которая
                                         --начинает внутреннюю транзакцию
COMMIT TRAN Order_tran               --Фиксирует внутреннюю и внешнюю
                                         --транзакции
GO

Выполнив эту программу, вы увидите результаты обоих операторов PRINT. Транзакция place_order_tran должна содержать внутри хранимой процедуры оператор COMMIT, отмечающий конец этой транзакции, но на самом деле это фиксирование не произойдет, пока не будет выполнено фиксирование транзакции Order_tran. Фиксирование или откат place_order_tran будет зависеть только от фиксирования Order_tran.

Хотя SQL Server не выполняет фактического фиксирования внутренних транзакций по оператору COMMIT, но все же для каждого оператора COMMIT происходит изменение системной переменной @@TRANCOUNT. Эта переменная следит за количеством активных транзакций на одно соединение с пользователем. При отсутствии активных транзакций значение @@TRANCOUNT равно 0. В начале каждой транзакции (с помощью BEGIN TRAN ) значение @@TRANCOUNT увеличивается на 1. После фиксирования каждой транзакции значение @@TRANCOUNT уменьшается на 1. Когда значение @@TRANCOUNT становится равным 0, фиксируется внешняя транзакция. Если во внешней транзакции или в любой из внутренних транзакций выполняется оператор ROLLBACK, то значение @@TRANCOUNT устанавливается равным 0. Помните, что для правильного уменьшения @@TRANCOUNT вы должны указывать фиксирование ( COMMIT ) для каждой внутренней транзакции. Вы можете проверять значение @@TRANCOUNT, чтобы определять наличие активных транзакций. Чтобы увидеть значение @@TRANCOUNT, используйте оператор SELECT @@TRANCOUNT.

Практические советы.
Использование @@TRANCOUNT

Рассмотрим пример того, как SQL Server использует переменную @@TRANCOUNT. Предположим, что имеется вложенная транзакция, состоящая из двух транзакций: одной внутренней и одной внешней, как в предыдущем примере. После запуска обеих транзакций, но до того, как они фиксированы, значение @@TRANCOUNT равно 2. Внешняя транзакция не может быть фиксирована, поскольку @@TRANCOUNT имеет ненулевое значение. После оператора COMMIT внутренней транзакции SQL Server уменьшает @@TRANCOUNT до 1. После оператора COMMIT внешней транзакции значение @@TRANCOUNT уменьшится до 0, и будет выполнено фактическое фиксирование внешней и внутренней транзакций. Следующая программа основана на предыдущем примере, но включает в себя считывание значений @@TRANCOUNT:

USE MyDB 
GO 
DROP PROCEDURE Place_Order 
GO 
CREATE PROCEDURE Place_Order    --Создает хранимую процедуру.
AS
BEGIN TRAN place_order_tran        --Приращение TRANCOUNT
PRINT 'Здесь должны быть SQL-операторы, выполняющие задачи по заказам'
SELECT @@TRANCOUNT as TRANCOUNT_2     
COMMIT TRAN place_order_tran       --Уменьшение TRANCOUNT.
GO

SELECT @@TRANCOUNT as TRANCOUNT_initial 
BEGIN TRAN Order_tran              --Приращение TRANCOUNT.
PRINT 'Place an order'
SELECT @@TRANCOUNT as TRANCOUNT_1
EXEC Place_Order                     --Вызывает хранимую процедуру, которая
                                       --начинает внутреннюю  транзакцию.
SELECT @@TRANCOUNT as TRANCOUNT_3 
COMMIT TRAN Order_tran               --Уменьшение TRANCOUNT.
SELECT @@TRANCOUNT as TRANCOUNT_4
GO

При выполнении этой программы вы увидите на экране значения @@TRANCOUNT, которые выводятся в следующем порядке: 0, 1, 2, 1, 0.

Примечание. Для явных транзакций, в которых используется BEGIN TRAN, вы должны фиксировать каждую транзакцию явным образом. При использовании вложенных транзакций SQL Server не сможет фиксировать внешние и внутренние транзакции, пока не будет указано явное фиксирование всех внутренних транзакций с помощью оператора COMMIT.
Неявный режим

В неявном режиме транзакция автоматически начинается при использовании определенных операторов T-SQL и продолжается, пока не появится оператор явного окончания COMMIT или ROLLBACK. Если оператор окончания не указан, то при отсоединении пользователя происходит откат данной транзакции. Следующие операторы T-SQL являются началом новой транзакции в неявном режиме:

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

Чтобы задать неявный режим транзакций, вы можете использовать следующий оператор T-SQL:

SET IMPLICIT_TRANSACTIONS {ON | OFF}

Значение ON активизирует неявный режим, и OFF отключает его. После отключения неявного режима используется режим автофиксации.

Неявные транзакции полезно использовать, когда запускаются сценарии с модификациями данных, которые требуется защитить внутри транзакции. Вы можете включить неявный режим в начале сценария, выполнить необходимые модификации и отключить этот режим в конце сценария. Во избежание конфликтов параллельных операций отключайте неявный режим после модификации данных и перед просмотром данных. Если вслед за операцией фиксирования следует оператор SELECT, то с него начинается новая транзакция в неявном режиме, и соответствующие ресурсы не будут освобождены, пока не будет фиксирована эта транзакция.

Откаты транзакций

Откаты могут происходить в двух формах: автоматический откат, выполняемый SQL Server, или программируемый вручную откат. В определенных случаях SQL Server выполнит для вас откат. Но для обеспечения логической согласованности в ваших программах вы должны при необходимости явным образом обращаться к оператору ROLLBACK. Рассмотрим более подробно эти два метода.

Автоматические откаты

Как уже говорилось ранее в этой лекции, при сбое транзакции вследствие серьезной ошибки, такой как потеря сетевого соединения при выполнении данной транзакции или отказ клиентского приложения или компьютера, SQL Server выполняет автоматический откат транзакции. Во время отката происходит отмена всех модификаций, выполненных в данной транзакции, и освобождение всех ресурсов, использовавшихся этой транзакцией.

Если при исполнении какого-либо оператора возникает ошибка, такая как нарушение ограничения или правила, то по умолчанию SQL Server автоматически выполняет откат только этого определенного оператора, в котором возникла ошибка. Чтобы изменить это поведение, вы можете использовать оператор SET XACT_ABORT. Если задать для XACT_ABORT значение ON, то в случае ошибки исполнения SQL Server автоматически выполнит откат транзакции. Этот метод полезно использовать, например, когда один оператор вашей транзакции не выполняется из-за того, что он нарушает ограничение по внешнему ключу, и поэтому вы не хотите, чтобы выполнялись последующие операторы. По умолчанию для XACT_ABORT задано значение OFF.

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

Программируемые откаты

С помощью оператора ROLLBACK вы можете указать точку в транзакции, где будет выполнен откат. Оператор ROLLBACK прекращает данную транзакцию и выполняет откат (отмену) всех выполненных изменений. Если вы запускаете откат в середине какой-либо транзакции, то остальная часть этой транзакции игнорируется. Если, например, эта транзакция является хранимой процедурой и оператор ROLLBACK выполняется в этой процедуре, то происходит откат всей процедуры и переход к обработке оператора, следующего после вызова хранимой процедуры.

Если вам нужно выполнить откат, исходя из количества строк, возвращенных оператором SELECT, используйте системную переменную @@ROWCOUNT. Эта переменная содержит количество строк, которое возвращается в результате запроса или на которое влияет модификация или удаление. Если конкретное количество строк не имеет значения и вам просто нужно определить наличие строки или строк для определенного условия, то вы можете использовать совместно с оператором SELECT оператор IF EXISTS. Этот оператор не возвращает количества строк данных, а только значение TRUE или FALSE. Если результат равен TRUE, то выполняется следующий оператор; если результат равен FALSE, то следующий оператор не выполняется. В операторе IF EXISTS может также использоваться предложение ELSE. Рассмотрим пример использования предложения IF EXISTS...ELSE. В следующей транзакции происходит модификация значений ставки арендной платы (royalty) в таблице roysched для двух ставок арендной платы (royalty rates) (16 процентов и 15 процентов), но если ни одна из этих ставок не существует, то ни одна из команд UPDATE выполняться не будет. Для обеспечения такого результата в этой транзакции используется оператор ROLLBACK.

BEGIN TRAN update_royalty                --Начать транзакцию.
USE pubs
IF EXISTS (SELECT titles.title, roysched.royalty FROM titles, roysched
WHERE titles.title_id = roysched.title_id
AND roysched.royalty = 16)
UPDATE roysched SET royalty = 17 WHERE royalty = 16     --Имеется 13 строк.
ELSE
ROLLBACK TRAN update_royalty           --ROLLBACK не выполняется.

IF EXISTS (SELECT titles.title, roysched.royalty FROM titles, roysched
WHERE titles.title_id = roysched.title_id
AND roysched.royalty = 15)                   --Нет ни одной строки.
BEGIN
UPDATE roysched SET royalty = 20 WHERE royalty = 15 
COMMIT TRAN update_royalty 
END 
ELSE                                   --Выполняется ROLLBACK.
ROLLBACK TRAN update_royalty
GO

В этой транзакции первый оператор IF EXISTS (SELECT...) определяет, что существует несколько строк, и поэтому оператор UPDATE выполняется (показывая, что модификация касается 13 строк). Второй оператор SELECT возвращает 0 строк, и поэтому второй оператор UPDATE не выполняется, но выполняется оператор ROLLBACK TRAN update_royalty. Поскольку ROLLBACK выполняет откат всех модификаций до самого начала данной транзакции, то происходит откат первой модификации. Если снова выполнить первый оператор SELECT, то вы по-прежнему увидите 13 строк со значением royalty, равным 16, как и было в исходном состоянии базы данных, когда мы запускали данную транзакцию. И снова изменение royalty на значение 17 будет отменено (будет выполнен откат) из-за оператора ROLLBACK.

Примечание.В этой транзакции было использовано несколько новых ключевых слов: IF, ELSE, BEGIN и END. Эти ключевые слова будут подробно описаны в лекции 20.

Откат транзакции нельзя выполнить после ее фиксирования. (Напомним, что внутренняя транзакция на самом деле не фиксируется, пока не будет фиксирована внешняя транзакция.) Чтобы можно было выполнить явный откат отдельной транзакции, оператор ROLLBACK должен предшествовать оператору COMMIT. В случае вложенных транзакций после фиксирования внешней транзакции (и, тем самым, внутренних транзакций) уже нельзя выполнить откат ни одной из транзакций. Как уже отмечалось, вы не можете выполнить откат только внутренних транзакций; должен быть выполнен откат всей транзакции (всех внутренних транзакций и внешней транзакции). Поэтому, включив имя транзакции в оператор ROLLBACK, проследите за тем, чтобы было указано имя внешней транзакции (во избежание путаницы и сообщения об ошибке от SQL Server). Однако существует обходной путь, позволяющий избежать отката всей транзакции и сохранить часть модификаций: вы можете использовать точки сохранения.

Точки сохранения

Вы можете избежать отката всей транзакции; для этого нужно использовать точку сохранения, которая позволяет выполнять откат только до определенной точки в транзакции, а не до самого начала транзакции. Все модификации, выполненные до точки сохранения, остаются в силе и не подвергаются откату; но для всех операторов, выполняемых после точки сохранения (которую вы должны указать в транзакции) вплоть до оператора ROLLBACK, будет выполнен откат. Затем начнут выполняться операторы, следующие за оператором ROLLBACK. Если вы затем зададите откат транзакции без указания точки сохранения, то, как обычно, будет выполнен откат всех модификаций вплоть до начала данной транзакции, т.е. будет отменена вся транзакция. Отметим, что при откате транзакции до точки сохранения SQL Server не освобождает блокированные ресурсы. Они будут освобождены после фиксирования транзакции или после отката всей транзакции.

Чтобы указать точку сохранения в транзакции, используйте следующий оператор:

SAVE TRAN[SACTION] {имя_точки_сохранения | @переменная_с_именем_точки_сохранения}

Поместите точку сохранения в том месте транзакции, до которого вы хотите выполнять откат. Чтобы выполнить откат до точки сохранения, используйте ROLLBACK TRAN вместе с именем точки сохранения, как это показано ниже:

ROLLBACK TRAN имя_точки_сохранения

Вы можете использовать другие операторы T-SQL, чтобы продолжить транзакцию. Не забудьте включить оператор COMMIT или другой оператор ROLLBACK после первого оператора ROLLBACK, чтобы завершить всю транзакцию.

Дополнительная информация. Для получения более полной информации о точках сохранения и примера их использования найдите "Save Transaction" (Сохранение транзакций) в Books Online и выберите "Save Transaction (T-SQL)" в диалоговом окне Topics Found.

Блокировка транзакций

В SQL Server используется объект, который называется блокировкой (lock) ; он препятствует тому, чтобы несколько пользователей одновременно вносили изменения в базу данных и чтобы один пользователь считывал данные, которые изменяет в этот момент другой пользователь. Блокировка помогает обеспечивать логическую целостность транзакций и данных. Управление блокировками осуществляется внутренним образом из программного обеспечения SQL Server и захват блокировки осуществляется на уровне пользовательского соединения. Если пользователь захватывает блокировку (становится ее владельцем) по какому-либо ресурсу, то эта блокировка указывает, что данный пользователь имеет право на использование данного ресурса. К ресурсам, которые может блокировать пользователь, относятся строка данных, страница данных экстент (8 страниц), таблица или вся база данных. Например, если пользователь владеет блокировкой по странице данных, то другой пользователь не может выполнять операции на этой странице, которые повлияют на операции пользователя, владеющего данной блокировкой. Поэтому любой пользователь не может модифицировать страницу данных, которая блокирована и считывается в данный момент другим пользователем. Кроме того, ни один пользователь не может владеть блокировкой, конфликтующей с блокировкой, которой уже владеет другой пользователь. Например, два пользователя не могут одновременно владеть блокировками на одновременную модификацию одной и той же страницы. Одна блокировка не может одновременно использоваться более чем одним пользователем.

Система управления блокировками SQL Server автоматически захватывает и освобождает блокировки в соответствии с действиями пользователей. Для управления блокировками не требуется никаких действий со стороны DBA (администратора базы данных) или программиста. Однако вы можете использовать программные подсказки (hint), чтобы задать для SQL Server, какой тип блокировки нужно захватывать при выполнении определенного запроса или модификации базы данных (см. раздел "Подсказки блокировки" далее).

В данном разделе мы рассмотрим уровни детализации блокировок, а также режимы блокировки. Но сначала рассмотрим некоторые возможности управления блокировками, которые повышают производительность SQL Server.

Возможности управления блокировками

SQL Server поддерживает блокировку на уровне строк, т.е. позволяет захватывать блокировку по строке страницы данных или страницы индекса. Блокировка на уровне строк – самый высокий уровень детализации, который можно получить в SQL Server. Этот нижний уровень блокировки дает больше возможностей параллельной работы многим приложениям оперативной обработки транзакций (OLTP). Блокировка на уровне строк особенно полезна, когда выполняются вставки, обновления и удаления в таблицах и индексах.

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

Дополнительная информация. См. лекцию 30 с более подробным описанием параметра конфигурирования locks.
Уровни блокировок

Блокировки могут захватываться по целому ряду ресурсов; тип ресурса определяет уровень детализации данной блокировки. В табл. 19-2 приводится список ресурсов, которые может блокировать SQL Server, начиная с самого подробного и до самого крупного уровня детализации.

Таблица 19.2. Блокируемые ресурсы
Ресурс Тип блокировки Описание
Идентификатор строкиУровень строкиБлокирует отдельную строку в таблице
КлючУровень строкиБлокирует отдельную строку в индексе
СтраницаУровень страницы Блокирует отдельную страницу размером 8 Кб в таблице или индексе
ЭкстентУровень экстентаБлокирует экстент – группу из 8 последовательных страниц данных или страниц индекса
ТаблицаУровень таблицыБлокирует всю таблицу
База данныхУровень базы данныхБлокирует всю базу данных

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

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

Режимы блокировки

Режим блокировки указывает, каким образом одновременно работающие пользователи (или транзакции) могут осуществлять доступ к какому-либо ресурсу. Захват каждого типа блокировки происходит в одном из этих режимов. Имеется шесть режимов блокировки: разделяемая блокировка (shared), блокировка изменений (update), монопольная блокировка (exclusive), блокировка намерения (intent), блокировка схемы (schema) и блокировка массовых изменений (bulk update).

Разделяемая блокировка

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

Блокировка изменений

Режим блокировки изменений используется для случаев, когда в данный ресурс могут быть внесены изменения. Только одна транзакция может захватывать блокировку изменений по определенному ресурсу. Если транзакция вносит изменения (например, когда по условию поиска найдены строки для модификации), то блокировка изменений преобразуется в монопольную блокировку (описана ниже); иначе она преобразуется в разделяемую блокировку.

Монопольная блокировка

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

Блокировка намерения

Режим блокировки намерения используется для создания иерархической структуры блокировок. Например, блокировка намерения на уровне таблицы указывает, что SQL Server предполагает захватывать блокировку по одной или нескольким страницами или строкам этой таблицы. Обычно в случае, когда в транзакции требуется захватить блокировку по какому-либо ресурсу, SQL Server сначала проверяет, существуют ли блокировки намерений для данного ресурса. Если блокировка намерения захвачена транзакцией, которая находится в состоянии ожидания этого ресурса, то вторая транзакция не может захватить монопольную блокировку. Если не существует ни одной транзакции, владеющей блокировкой намерения и ожидающей данный ресурс, то текущая транзакция может захватить монопольную блокировку по этому ресурсу. Существует три следующих типа режимов блокировки намерения:

Для получения более подробной информации по этим типам режимов найдите "shared lock mode" (режим разделяемой блокировки) в Books Online и выберите "Understanding Locking in SQL Server" (Ознакомление с блокировкой в SQL Server) в диалоговом окне Topics Found.

Блокировка схемы

Режим блокировки схемы используется в тех случаях, когда выполняется операция изменения схемы таблицы, такая как добавление колонки в таблицу, или когда компилируются запросы. Для таких случаев существует два типа блокировок схемы: блокировка модификации схемы (Sch-M) и блокировка стабильности схемы (Sch-S). Блокировка модификации схемы используется при выполнении операции языка определения данных таблицы (DDL). Блокировка стабильности схемы используется для компиляции запросов. Когда происходит компиляция запроса, другие транзакции могут одновременно с этим запускать и захватывать блокировки по данной таблице (даже монопольные блокировки), но операторы DDL не могут применяться к таблице, если задана блокировка стабильности схемы.

Блокировка массовых изменений

Режим блокировки массовых изменений используется, когда вам нужно выполнить массовое копирование данных в таблицу с подсказкой блокировки TABLOCK или когда вы задаете параметр table lock on bulk load с помощью хранимой процедуры sp_tableoption. Целью блокировки массовых изменений является предоставление процессам разрешения на параллельное массовое копирование данных в одну таблицу, запрещая при этом доступ к этой таблице любым процессам, которые не выполняют массового копирования.

Блокирование и взаимоблокировки

Блокирование (blocking) и взаимоблокировки (deadlock) – это две дополнительные проблемы, которые могут возникать при одновременно выполняемых транзакциях. Они могут приводить к серьезным проблемам системы, а также могут замедлять и даже останавливать работу. Эти проблемы могут разрешаться в приложении, или SQL Server постарается сделать все возможное для их разрешения; они будут описаны здесь только для того, чтобы вы представляли их себе и понимали используемые концепции. Обход и разрешение проблем блокирования и взаимоблокировки являются обязанностью программиста.

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

Взаимоблокировка отличается от блокированной транзакции в том, что взаимоблокировка возникает в случае двух блокированных транзакций, ожидающих друг друга. Например, предположим, что одна транзакция владеет монопольной блокировкой по Таблице 1, а вторая владеет монопольной блокировкой по Таблице 2. Прежде чем будет освобождена любая монопольная блокировка, первой транзакции требуется блокировка по Таблице 2 и второй транзакции – требуется блокировка по Таблице 1. Теперь каждая транзакция ждет, пока другая транзакция освободит свою монопольную блокировку, но ни одна из транзакций не сделает этого, пока не будет выполнено фиксирование или откат для завершения соответствующей транзакции. Ни одна из транзакций не может завершиться, поскольку для продолжения работы ей требуется блокировка, которой владеет другая транзакция, – ситуация взаимоблокировки! Этот сценарий показан на рис. 19.2. При возникновении взаимоблокировки SQL Server прекращает одну из транзакций, и ее требуется запустить заново.

Цепное блокирование


Рис. 19.1.  Цепное блокирование

 Взаимоблокировка


Рис. 19.2.  Взаимоблокировка

Дополнительная информация. Для получения информации о том, как избежать ситуации блокирования и взаимоблокировки, найдите "Blocks" (Блокирование) в Books Online и выберите "Understanding and Avoiding Blocking" (Как избежать блокирования) в диалоговом окне Topics Found. Кроме того, найдите "Deadlocks" (Взаимоблокировки) в Books Online и выберите "Avoiding Deadlocks and Handling Deadlocks" (Как избегать взаимоблокировок и справляться с проблемой взаимоблокировок).

Подсказки блокировки

Подсказки блокировки – это ключевые слова T-SQL, которые можно использовать с операторами SELECT, INSERT, UPDATE и DELETE, чтобы задать для SQL Server использование предпочтительного типа блокировки на уровне таблицы для определенного оператора. Вы можете использовать подсказки блокировки для переопределения принятого по умолчанию уровня изолированности. Вам следует использовать этот метод только в случае абсолютной необходимости, поскольку ваша неаккуратность может привести к блокированию или взаимоблокировкам.

Рассмотрим ситуацию, где может оказаться полезным использование подсказок блокировки. Предположим, что вы используете для всех транзакций принятый по умолчанию уровень изолированности read uncommitted (чтение незафиксированных данных). При этом уровне изолированности по данному ресурсу захватывается разделяемая блокировка только до завершения чтения, и затем эта разделяемая блокировка освобождается. И если какая-либо транзакция читает одни и те же данные дважды, то результаты чтения могут не совпасть, поскольку другая транзакция могла захватить блокировку между первым и вторым чтениями и модифицировать эти данные.

Чтобы избежать проблемы повторяемости чтения, вы можете задать уровень изолированности serializable (упорядочиваемость), но это вынудит SQL Server захватить все разделяемые блокировки, необходимые для операторов SELECT во всех транзакциях, пока не будет завершена каждая транзакция. Иными словами, для целостности транзакций разделяемые блокировки будут захвачены по таблице, указанной в операторе SELECT любой транзакции. Если вы не хотите поддерживать упорядочиваемость для всех ваших транзакций, то можете добавить какую-либо подсказку блокировки для определенного запроса. Подсказка блокировки HOLDLOCK в операторе SELECT указывает SQL Server захват всех разделяемых блокировок по таблице, заданной в операторе транзакции SELECT, вплоть до конца этой транзакции – независимо от уровня изолированности. Тем самым при повторном чтении будет наблюдаться согласованность данных (они не будут изменены другой транзакцией). Использование подсказок блокировки не влияет на уровень изолированности для других транзакций.

Примечание. Оптимизатор запросов SQL Server автоматически определяет наиболее эффективный план исполнения и типы блокировок для запроса. И поскольку оптимизатор запросов автоматически выбирает подходящие тип или типы блокировок, подсказки блокировки следует использовать, если только они хорошо изучены и когда это абсолютно необходимо, иначе они могут отрицательным образом повлиять на параллельно выполняемые задачи.

В следующем списке дается описание существующих подсказок блокировки на уровне таблиц.

Вы можете объединять совместимые подсказки блокировки, такие как TABLOCK и REPEATABLEREAD, но вы не можете объединять конфликтующие подсказки, такие как REPEATABLEREAD и SERIALIZABLE. Чтобы задать подсказку блокировки на уровне таблиц, заключите эту подсказку в круглые скобки после имени таблицы в операторе T-SQL. Следующая последовательность является примером использования подсказок TABLOCKX в операторе SELECT:

USE pubs
SELECT COUNT(ord_num)
FROM sales (TABLOCKX)
WHERE ord_date > "Sep 13 1994"
GO

Подсказка TABLOCK сообщает SQL Server, что нужно захватить монопольную блокировку на уровне таблиц по таблице продаж (sales), пока не будет выполнен данный оператор. Эта подсказка обеспечивает, что никакая другая транзакция не сможет модифицировать данные в таблице sales, пока данный запрос подсчитывает заказы из этой таблицы. Будьте осторожны, используя этот вид подсказки, поскольку блокирование доступа других транзакций к этой таблице может приводить к ожиданию других транзакций, снижению времени отклика и цепному блокированию. И снова напомним: используйте подсказки блокировки на уровне таблиц только в случае абсолютной необходимости.

Заключение

В этой лекции вы ознакомились с транзакциями, включая ACID-свойства транзакции и режимы, используемые для задания начала и конца транзакции. Вы также узнали о возможностях управления блокировками SQL Server уровнях блокировок и режимах блокировок. Мы также ознакомились с блокированием, взаимоблокировками и применением подсказок блокировки. Теперь вы получили хорошее представление об основах транзакций и методах блокировки транзакций. Лекция 20 расширяет описание T-SQL, представленное в лекции 13; в этой лекции вы узнаете, как использовать операторы T-SQL INSERT, UPDATE и DELETE, а также другие операторы, которые могут вам потребоваться при написании транзакций и хранимых процедур.

Лекция 20. Расширенное описание T-SQL

Более углубленное изучение T-SQL продолжается в этой лекции. Рассматриваются новые конструкции: IF...ELSE, WHILE и CASE. Новые операторы, ранее не задействованные в примерах. Примеры и дополнительная информация, в сочетании со справочной системой SQL Server (Books Online) эффективно помогут вам разобраться во всех тонкостях нового материала.

Мы познакомились с этими операторами в предыдущих лекциях. Здесь также описываются ключевые слова T-SQL, используемые для управления последовательностью выполнения операторов. Вы можете использовать эти операторы и ключевые слова в любом месте, где применяется T-SQL, – в командных строках, сценариях, хранимых процедурах, в пакетных заданиях и прикладных проблемах. В частности, мы рассмотрим операторы обработки данных INSERT, UPDATE и DELETE (см. лекцию 13), а также программные конструкции IF...ELSE, WHILE и CASE.

Прежде чем перейти к нашей основной теме, мы создадим таблицу items для использования в наших примерах. (Мы создадим эту таблицу в базе данных MyDB.) Ниже приводятся операторы T-SQL, используемые для создания таблицы items:

USE MyDB
GO
CREATE TABLE items
(
item_category    CHAR(20)        NOT NULL,
item_id          SMALLINT        NOT NULL,
price            SMALLMONEY        NULL,
item_desc        VARCHAR(30)       DEFAULT 'No desc'
)
GO

Колонка item_id могла бы вполне подойти для свойства IDENTITY. (См. раздел "Добавление свойства IDENTITY" в лекции 10). Но поскольку вы не можете явным образом помещать значения в такую колонку, то мы не используем здесь свойство IDENTITY. В данном случае мы будем использовать более гибкий подход в примерах, где используется оператор INSERT.

Оператор INSERT

Оператор INSERT, введенный в лекции 13, используется для добавления новой строки или строк в таблицу или представление. Ниже показан основной синтаксис для оператора INSERT:

INSERT [INTO] имя_таблицы [(список_колонок)] VALUES
  выражение | производная_таблица

Ключевое слово INTO и параметр список_колонок не являются обязательными. Параметр список_колонок указывает, в какие колонки вы помещаете данные; эти значения имеют взаимно-однозначное соответствие (по порядку) со значениями, указанными в выражении (которое может быть просто списком значений). Рассмотрим некоторые примеры.

Вставка строк

В следующем примере показано, как вставить одну строку данных в таблицу items:

INSERT INTO items
    (item_category, item_id, price, item_desc) 
VALUES ('health food', 1, 4.00, 'tofu 6 oz.') 
GO

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

INSERT INTO items
VALUES (1, 'health food', 4.00, 'tofu 6 oz.')
GO
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value 'health food' to a column
of data type smallint.
(Синтаксическая ошибка в результате преобразования varchar-значения 'health food' 
в колонке данных типа smallint)

Невыполнение вставки строки и это сообщение являются следствием неверного порядка значений Мы пытались поместить значение item_id в колонку item_category и значение item_category в колонку item_id. Указанные значения несовместимы с типами данных для этих колонок. Если бы они были совместимы, то SQL Server позволил бы вставить данную строку независимо от порядка следования значений.

Чтобы увидеть, как выглядит строка, которую мы вставили в таблицу, укажите запрос выбора всех строк таблицы с помощью следующего оператора SELECT:

SELECT * from items
GO
Вы получите следующий набор результатов:
item_category    item_id   price      item_desc
-------------------------------------------------------
health food      1         4.0000      tofu 6 oz.

При создании таблицы items было определено, что колонка price (цена) может содержать пустые значения, а для колонки item_desc (описание) было задано значение по умолчанию No desc. (Нет описания). Если в операторе INSERT не указано никакого значения для колонки price, то в эту колонку для новой строки будет помещено значение NULL. Если не указано никакого значения для колонки item_desc, то в эту колонку для новой строки будет помещено значение No desc.

Пропуск значений колонок

В первом примере оператора INSERT в предыдущем разделе мы могли бы пропустить значения, а также имена колонок для колонок price и item_desc, поскольку для них заданы значения по умолчанию. Если пропустить значение для какой-либо колонки, то мы должны включить в список_колонок имена оставшихся колонок, иначе SQL Server сопоставит перечисленные значения с колонками в порядке, указанном при определении колонок в таблице.

Например, предположим, что мы пропустим значение колонки price и вообще не укажем список_колонок, как в следующем запросе:

INSERT INTO items
VALUES ('junk food', 2, 'fried pork skins')
GO

SQL Server попытается поместить значение, заданное для item_desc ( fried pork skins ; третье значение в списке), в колонку price (третья колонка в таблице). В результате появится сообщение об ошибке, поскольку fried pork skins – это данные типа char, в то время как для колонки price был указан тип данных smallmoney. Это несовместимые типы данных. Сообщение об ошибке будет выведено в следующей форме:

Msg 213, Level 16, State 4, Server NTSERVER, Line 1
Insert Error: Column name or number of supplied values
does not match table definition.
(Имя колонки или количество представленных значений не соответствуют определению таблицы)

А теперь предположим, что тип данных для значения fried pork skins был бы совместим с типом данных для колонки price, и представим себе, как это повлияло бы на целостность таблицы. SQL Server поместил бы это значение в неверную колонку, что привело бы к несогласованности данных в таблице.

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

Чтобы избежать ошибок, связанных с несовместимыми типами данных, указывайте имена в списке_колонок в соответствии с порядком соответствующих значений, как это показано ниже:

INSERT INTO items
    (item_category, item_id, item_desc)
VALUES ('junk food', 2, 'fried pork skins')
GO

Поскольку мы не указали цену, в колонку price для данной строки будет помещено значение NULL. А теперь выполните следующий оператор SELECT:

SELECT * FROM items

Вы увидите следующий набор результатов: (в который войдут две введенные нами строки). Отметим, что в колонке price находится значение NULL.

item_category     item_id   price         item_desc
------------------------------------------------------------------
health food         1        4.0000        tofu 6 oz. 
junk food           2       NULL          fried pork skins

А теперь добавим другую строку, не указывая значений для колонок price и item_desc, как это показано ниже:

INSERT INTO items
    (item_category, item_id) 
VALUES ('toys', 3) 
GO

Набор результатов отдельно для этой строки можно получить с помощью следующего запроса:

SELECT * FROM items WHERE item_id = 3

Набор результатов будет представлен в следующей форме:

item_category     item_id   price       item_desc
----------------------------------------------------------
toys              3         NULL        No desc

Отметим, что в колонках price и item_desc находятся соответственно значения NULL и No desc. Вы можете изменить эти значения с помощью оператора UPDATE, как будет показано ниже в этой лекции.

SQL Server автоматически задает значения (когда они не указаны) для четырех типов колонок: для колонок, допускающих пустые значения ( null ), для колонок с заданным значением по умолчанию, для колонок со свойством identity и колонок с временными метками ( timestamp ). Мы уже видели, что происходит с колонками первых двух типов. Колонка identity получает следующее по порядку идентифицирующее значение, в колонку временной метки заносится текущее значение временной метки. (Эти типы колонок описаны в лекции 10.) В большинстве случае вы не можете вручную помещать значения данных в эти два типа колонок.

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

Вы можете также вставлять строки в таблицу из другой таблицы. Для этого можно использовать производную таблицу в операторе INSERT или предложение EXECUTE с хранимой процедурой, которое возвращает строку данных.

Примечание. Производная таблица (derived table) – это результирующий набор из оператора SELECT ; встраивается в предложение FROM другого оператора T-SQL. (Подробнее см. лекцию 14.)

Для выполнения вставки с помощью производной таблицы создадим сначала вторую небольшую таблицу с именем two_newest_items, в которую мы поместим строки из таблицы items. Ниже показан оператор CREATE TABLE для новой таблицы:

CREATE TABLE   two_newest_items
(
item_id          SMALLINT        NOT NULL,
item_desc        VARCHAR(30)   DEFAULT 'No desc'
)
GO

Для вставки двух последних значений из колонок item_id и item_desc таблицы items в таблицу two_newest_items используйте следующий оператор INSERT:

INSERT INTO two_newest_items
    (item_id, item_desc)
SELECT TOP 2 item_id, item_desc FROM items
ORDER BY item_id DESC
GO

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

Для получения всех строк этой новой таблицы мы можем использовать следующий запрос:

SELECT * FROM two_newest_items

Появится следующий набор результатов:

item_id   item_desc
---------------------
3         No desc
2         fried pork skins

Отметим, что мы включили в оператор INSERT предложение ORDER BY item_id DESC. Это предложение указывает SQL Server, что нужно упорядочить результаты по элементу item_id в порядке убывания.

Если создать оператор SELECT в предыдущем примере вставки в виде хранимой процедуры и использовать оператор EXECUTE с именем хранимой процедуры, то мы получим те же результаты, что и в этом примере. (Хранимые процедуры описываются в лекции 21.) Для этого мы сначала удалим с помощью оператора DELETE все существующие строки в таблице two_newest_items, чтобы можно было начать работу с пустой таблицы (см. в раздел "Оператор DELETE" далее). Затем мы создадим хранимую процедуру с именем top_two и применим ее с оператором EXECUTE для вставки двух новых строк в таблицу two_newest_items. Для выполнения этих операций используются следующие операторы T-SQL:

DELETE FROM two_newest_items
GO

CREATE PROCEDURE top_two
AS
SELECT TOP 2 item_id, item_desc FROM items
ORDER BY item_id DESC
GO

INSERT INTO two_newest_items
    (item_id, item_desc)
EXECUTE top_two
GO

Удаляются две строки, вставленные в предыдущем примере, и затем оператор INSERT помещает две новые строки (содержащие те же данные) с помощью хранимой процедуры top_two.

Дополнительная информация. Вы можете также включить в оператор INSERT подсказки блокировки на уровне таблицы. Для получения более подробной информации о подсказках, которые можно использовать с оператором INSERT, щелкните на вкладке Search (Поиск) в Books Online для поиска "Locking Hints" (Подсказки блокировки) и выберите тему "Locking Hints".

Оператор UPDATE

Оператор UPDATE используется для модифицирования или обновления существующих данных. Ниже показан синтаксис оператора UPDATE:

UPDATE имя_таблицы SET имя_колонки = выражение
   [FROM источник_для_таблицы] WHERE условие_поиска
Модифицирование строк

Основываясь на таблице items, мы обновим сначала строку junk food, которую вставили раньше без указания цены (колонка price). Чтобы найти строку, задайте в условии поиска текст fried pork skins. Чтобы задать (заменить) цену на $2, используйте следующий оператор:

UPDATE items SET price = 2.00
WHERE item_desc = 'fried pork skins'
GO
Теперь выберите строку junk food с помощью следующего запроса:
SELECT * FROM items
WHERE item_desc = 'fried pork skins'
GO

Результат для строки junk food появится в следующем виде, причем исходное значение NULL колонки price будет заменено на 2.00:

item_category     item_id   price       item_desc
-------------------------------------------------------------
junk food         2           2.00        fried pork skins

Чтобы увеличить значение этого элемента на 10 процентов, вы можете запустить следующий оператор:

UPDATE items SET price = price * 1.10
WHERE item_desc = 'fried pork skins'
GO

Теперь, выбрав строку junk food, вы увидите, что цена изменилась до $2.20 (значение $2, умноженное на 1.10). Цены других элементов не изменились.

С помощью оператора UPDATE вы можете модифицировать более чем одну строку. Например, чтобы модифицировать все строки в таблице items, увеличив все значения колонки price на 10 процентов, запустите следующий оператор:

UPDATE items SET price = price * 1.10
GO

Теперь в случае проверки таблицы items она будет выглядеть следующим образом:

item_category     item_id   price       item_desc
-------------------------------------------------------
health food       1         4.40        tofu 6 oz.
junk food         2         2.42        fried pork skins
toys              3         NULL        No desc

Строки со значением NULL в колонке price не затрагиваются, поскольку NULL * 1.10 = NULL. Это не является какой-либо проблемой, и вы не получите сообщения об ошибке.

Использование предложения FROM

Оператор UPDATE позволяет вам использовать предложение FROM для указания таблицы, которая будет использоваться как источник данных при модифицировании. В список источников таблиц могут включаться имена таблиц, имена представлений, функции rowset, производные таблицы и связанные таблицы. Источником может быть даже таблица, находящаяся в процессе модифицирования. Чтобы понять, как действует этот процесс, создадим еще одну небольшую таблицу. Ниже показаны оператор CREATE TABLE для нашей новой таблицы с именем tax и оператор INSERT для вставки строки со значением 5.25 в колонку tax_percent (процент налогообложения):

CREATE TABLE tax
(
tax_percent        real                    NOT NULL,
change_date        smalldatetime       DEFAULT getdate()
)
GO
INSERT INTO tax
    (tax_percent) VALUES (5.25)
GO

В колонку change_date (дата изменения) будут помещены текущие дата и время, полученные из ее используемой по умолчанию функции GETDATE, поскольку дата не была задана явным образом.

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

ALTER TABLE items
ADD price_with_tax smallmoney NULL
GO

Затем нам нужно модифицировать новую колонку price_with_tax, чтобы она содержала результат операции items.price * tax.tax_percent для всех строк таблицы items. Для этого используйте следующий оператор UPDATE с предложением FROM:

UPDATE items
SET price_with_tax = i.price +  
    (i.price * t.tax_percent / 100) 
FROM items i, tax t 
GO

Этот оператор UPDATE реально подходит как триггер, который будет запускаться при вставке значения в колонку price. Триггер – это специальный тип хранимой процедуры, которая автоматически выполняется при возникновении определенных условий. (О триггерах см. лекцию 22.)

Использование производных таблиц

Еще одним способом использования оператора UPDATE является применение производной таблицы (или подзапроса) в предложении FROM. Производная таблица используется как входной параметр для внешнего оператора UPDATE. Для этого примера мы будем использовать в данном подзапросе таблицу two_newest_items table и таблицу items во внешнем операторе UPDATE. Нам нужно модифицировать две последние строки в таблице items, чтобы они содержали в колонке price_with_tax значение NULL. Выполняя запрос в таблице two_newest_items, мы можем найти значения item_id для строк, которые требуется модифицировать в таблице items. Это осуществляется с помощью следующего оператора:

UPDATE items
SET price_with_tax = NULL
FROM (SELECT item_id FROM two_newest_items) AS t1
WHERE items.item_id = t1.item_id
GO

Оператор SELECT применяется как подзапрос, результаты которого помещаются во временную производную таблицу с именем t1, которая затем используется в условии поиска (предложение WHERE ). В результате подзапроса мы получаем значения item_id 2 и 3. Таким образом, затрагиваются две строки таблицы items со значениями 2 или 3. Строка со значением item_id, равным 3, уже имеет значение NULL в колонке price_with_tax, поэтому ее значения не изменяются. А в строке со значением item_id, равным 3 vv, значение price_with_tax действительно изменяется на NULL. Набор результатов, где показаны все строки таблицы items, выглядит после этой модификации следующим образом:

item_category     item_id   price       item_desc          price_with_tax
--------------------------------------------------------------------------------
health food         1       4.40        tofu 6 oz.         4.6310
junk food           2       2.42        fried pork skins   NULL 
toys                3       NULL        No desc            NULL
Дополнительная информация. Для получения подробной информации о дополнительных параметрах, которые можно использовать с оператором UPDATE, таких как подсказки для таблиц и запросов, найдите в Books Online "UPDATE" и выберите подтему "Described".

Оператор DELETE

Оператор DELETE используется для удаления строки или строк из таблицы или представления. DELETE не влияет на определение таблицы; он просто удаляет из таблицы строки данных. Ниже показан синтаксис для оператора DELETE:

DELETE [FROM] имя_таблицы | имя_представления
  [FROM источники_для_таблицы] WHERE условие_поиска

Первое ключевое слово FROM не является обязательным, как и второе предложение FROM. Строки не удаляются из источников для таблицы во втором предложении FROM ; они удаляются только из таблицы или представления, указанного после DELETE.

Удаление отдельных строк

Используя предложение WHERE вместе с DELETE, вы можете указывать определенные строки для удаления из таблицы. Например, чтобы удалить из таблицы items все строки со значением toys в колонке item_category, выполните следующий оператор:

DELETE FROM items
WHERE item_category = 'toys'
GO

Этот оператор удаляет из нашей таблицы items одну строку.

Вы можете использовать второе предложение FROM с одним или несколькими источниками для таблицы, чтобы указать другие таблицы и представления, которые можно использовать в условии поиска WHERE. Например, чтобы удалить из таблицы items строки, соответствующие строкам в таблице two_newest_items, выполните следующий оператор:

DELETE items
FROM two_newest_items 
WHERE items.item_id = two_newest_items.item_id 
GO

Отметим, что в этом операторе мы опустили первое необязательное ключевое слово FROM. Первые две строки таблицы two_newest_items содержат в колонке item_id значения 2 и 3. Таблица items содержит в колонке item_id значения 1 и 2. Поэтому удаляется строка со значением item_id, равным 2 (соответствующая условию поиска). Процесс удаления не влияет на две строки в таблице two_newest_items (источник для таблицы).

Удаление всех строк

Чтобы удалить из таблицы все строки, используйте оператор DELETE без предложения WHERE. Следующий оператор DELETE удалит все строки в таблице two_newest_items table:

DELETE FROM two_newest_items
GO

Теперь two_newest_items – пустая таблица: она не содержит никаких данных. Если вы хотите также удалить определение таблицы, используйте оператор DROP TABLE, как это показано ниже. (Об этом операторе см. лекцию 15.)

DROP TABLE two_newest_items
GO
Дополнительная информация. Для получения более подробной информации о способах использования оператора DELETE, таких как использование связанных таблиц (joined tables) в качестве источников для таблицы, а также использование подсказок на уровне таблиц и запросов, найдите "DELETE" в Books Online и выберите подтему "Described".

Ключевые слова для программирования

Вместе с операторами T-SQL можно использовать несколько полезных ключевых слов, позволяющих создавать программные конструкции для управления программной последовательностью. Эти конструкции можно использовать внутри пакетов (групп операторов T-SQL, которые выполняются за один раз), хранимых процедур, сценариев и эпизодических ( ad hoc ) запросов. (Для примеров в этом разделе используется база данных pubs.)

IF...ELSE

Конструкция IF...ELSE используется для наложения условий, определяющих, какие операторы T-SQL нужно выполнить. Для IF...ELSE используется следующий синтаксис:

IF Булево_выражение
Оператор_T-SQL | блок_операторов
[ELSE Оператор_T-SQL | блок_операторов]

Булево_выражение возвращает значение TRUE или FALSE. Если выражение в предложении IF возвращает значение TRUE, то выполняются следующие операторы, а предложение ELSE и его операторы не выполняются. Если выражение возвращает значение FALSE, то выполняются только операторы, следующие после ключевого слова ELSE. Блок_операторов просто указывает на использование более чем одного оператора T-SQL. При использовании блока операторов вы должны задавать ключевые слова BEGIN и END, указывающие начало и конец каждого блока, – будь то блок в предложении IF, предложении ELSE или в обоих предложениях.

Вы можете использовать предложение IF без предложения ELSE. Рассмотрим сначала пример, где используется только IF. В следующем примере происходит проверка выражения, и если результатом этого выражения является значение TRUE, то выполняется последующий оператор PRINT:

IF (SELECT ytd_sales FROM titles
      WHERE title_id = 'PC1035') > 5000 
PRINT 'Year-to-date sales are  
      greater than $5,000 for PC1035.' 
GO

Значение выражения IF будет равно TRUE, поскольку значение ytd_sales для строки с title_id = "PC1035" равно 8780. Будет выполнен оператор PRINT, и на экране будет выведен текст "Year-to-date sales are greater than $5,000 for PC1035" (Объем продаж на текущий год для PC1035 больше $5000).

А теперь добавим к предыдущему примеру предложение ELSE и изменим > 5000 на > 9000. Соответствующий пример показан ниже:

IF (SELECT ytd_sales FROM titles
      WHERE title_id = 'PC1035') > 9000
PRINT 'Year-to-date sales are  
      greater than $9,000 for PC1035.' 
ELSE 
PRINT 'Year-to-date sales are  
      less than or equal to $9,000 for PC1035.' 
GO

В данном случае будет выполнен оператор PRINT, следующий после предложения ELSE, поскольку выражение IF возвращает значение FALSE.

Расширим этот пример, добавив блоки операторов после предложений IF и ELSE. Выводимое сообщение и выполняемый запрос будут зависеть от значения выражения IF ( TRUE или FALSE ). Ниже приводится этот пример:

IF (SELECT ytd_sales FROM titles WHERE title_id = 'PC1035') > 9000
BEGIN
  PRINT 'Year-to-date sales are  
    greater than $9,000 for PC1035.' 
  SELECT ytd_sales FROM titles  
          WHERE title_id = 'PC1035'
END
ELSE    --ytd_sales должно быть <= 9000.
BEGIN
  PRINT 'Year-to-date sales are
    less than or equal to $9,000 for PC1035.'
        SELECT price FROM titles
              WHERE title_id = 'PC1035'
END
GO

Если значение выражения IF равно FALSE, то выполняются операторы между BEGIN и END в предложении ELSE. Сначала выполняется оператор PRINT и затем – оператор SELECT, показывающий, что книга стоит $22.95.

Вы можете также использовать вложенные операторы IF после предложения IF или после предложения ELSE. Например, чтобы использовать вложенные операторы IF...ELSE для определения диапазона, в который попадает среднее значение ytd_sales для всех заголовков, выполните следующий пример:

IF (SELECT avg(ytd_sales) FROM titles) < 10000
      IF (SELECT avg(ytd_sales) FROM titles) < 5000
            IF (SELECT avg(ytd_sales) FROM titles) < 2000
                  PRINT 'Average year-to-date sales are
                  less than $2,000.'
            ELSE
            PRINT 'Average year-to-date sales are
                  between $2,000 and $4,999.'
      ELSE
      PRINT 'Average year-to-date sales are
            between $5,000 and $9,999.'
ELSE
PRINT 'Average year-to-date sales are greater
      than $9,999.'
GO

При выполнении этого примера вы дважды увидите среди результатов следующее предупреждающее сообщение: "Warning: Null value eliminated from aggregate" (Предупреждение: Значение Null исключено из совокупности). Это сообщение просто означает, что пустые значения ( null ) колонки ytd_sales не учитывались как значения при расчете среднего значения. Конечным результатом этого примера будет "Average year-to-date sales are between $5,000 and $9,999" (Среднее значение продаж на текущий год в диапазоне от $5000 до $9999), поскольку среднее значение равно $6090. Будьте аккуратны при использовании вложенных операторов IF. Можно легко запутаться в том, какой IF относится к очередному ELSE, или оставить IF без соответствующего ELSE. Использование символов табуляции для отступов, как в предыдущем примере, упрощает определение соответствующих пар IF...ELSE.

WHILE

Конструкция WHILE используется для проверки условия, которое вызывает повторяющееся выполнение какого-либо оператора или блока операторов, пока значение это условия равно TRUE. Эту конструкцию обычно называют циклом WHILE, так как операторы внутри конструкции WHILE выполняются циклическим образом. Ниже приводится синтаксис:

WHILE Булево_выражение
Оператор_T-SQL | Блок_операторов
[BREAK] Оператор_T-SQL | Блок_операторов
[CONTINUE]

Как и в предложениях IF...ELSE, вы задаете в цикле WHILE блок операторов с помощью BEGIN и END. Ключевое слово BREAK используется для выхода из цикла WHILE, после чего выполнение продолжается с оператора, следующего после конца цикла WHILE. Если цикл WHILE встроен в другие циклы WHILE, то ключевое слово BREAK вызывает выход только из того цикла WHILE, в котором оно находится; любые операторы вне этого цикла, а также внешние циклы продолжают выполняться. Ключевое слово CONTINUE в цикле указывает, что следует повторить операторы между ключевыми словами BEGIN и END в данном цикле, игнорируя любые другие операторы после CONTINUE.

Рассмотрим пример, где простой цикл WHILE используется для выполнения одного оператора UPDATE. В этом цикле WHILE проверяется условие, что среднее значение по колонке royalty меньше 20. Если результатом проверки является значение TRUE, то колонка royalty модифицируется (увеличивается на 5 процентов). Затем условие цикла WHILE проверяется снова и модификация повторяется, пока среднее значение колонки royalty не станет равным или больше 20. Цикл имеет следующий вид:

WHILE (SELECT AVG(royalty) FROM roysched) < 20
UPDATE roysched SET royalty = royalty * 1.05
GO

Поскольку среднее значение колонки royalty (ставка арендной платы) сначала было равно 15, этот цикл WHILE выполнится 6 раз, прежде чем среднее значение не достигнет 20 ; затем выполнение цикла прекращается, поскольку результатом проверяемого условия становится значение FALSE.

Теперь рассмотрим пример, где в цикле WHILE используются BREAK, CONTINUE, BEGIN и END. Вы будет повторять в цикле оператор UPDATE, пока среднее значение royalty не превысит 25 процентов. Но если во время цикла максимальное значение royalty в таблице превысит 27 процентов, то мы прервем цикл независимо от среднего значения. Мы также добавим оператор SELECT после конца цикла WHILE. Ниже приводится соответствующая последовательность T-SQL:

WHILE (SELECT AVG(royalty) FROM roysched) < 25
BEGIN
UPDATE roysched SET royalty = royalty * 1.05
IF (SELECT MAX(royalty)FROM roysched) > 27 
BREAK
ELSE 
CONTINUE
END 
SELECT MAX(royalty) AS "MAX royalty" FROM roysched 
GO

Этот цикл будет выполнен только один раз, поскольку значение royalty больше 27 уже имеется в этой таблице. Оператор UPDATE все же выполняется один раз, так как среднее значение меньше 25 процентов. Затем проверяется условие оператора IF, и результатом является значение TRUE, поэтому выполняется оператор BREAK, вызывающий выход из цикла WHILE. Выполнение программы затем продолжается, начиная с оператора, следующего за ключевым словом END (последний оператор SELECT ).

Напомним, что вы можете также использовать вложенные циклы WHILE, но следует учитывать, что ключевое слово BREAK или CONTINUE применяется только к циклу, из которого оно было вызвано, но не к внешним циклам WHILE.

CASE

Ключевое слово CASE используется для оценки списка условий и возврата одного из нескольких возможных результатов. Возвращаемый результат зависит от того, какое условие совпадает с другим указанным условием или является истинным. Наиболее распространенным применением CASE является замена кодового или сокращенного значения на более понятное значение и упорядочивание значений, как будет показано в наших примерах этого раздела. Имеется два формата для конструкции CASE: простой и поисковый. В простом формате на входе после CASE задается в виде выражения значение, которое проверяется на равенство со значением в выражении или выражениях WHEN. В поисковом формате происходит проверка булева выражения на значение TRUE или FALSE, а не проверка на равенство с каким-либо значением. Сначала рассмотрим простой формат. В простом формате предложение CASE имеет следующий синтаксис:

CASE входное_выражение
  WHEN выражение_для_when THEN результирующее_выражение
  [WHEN выражение_для_when THEN результирующее_выражение...n]
  [ELSE выражение_для_else]
END

Значение результирующего выражения возвращается в том случае, если значение соответствующего выражения WHEN равно значению входного выражения. Выражения сравниваются в порядке их следования в предложении CASE. Если не обнаружено ни одного совпадения, то возвращается значение результирующего выражения ELSE (если оно задано); в противном случае возвращается значение NULL. Отметим, что в простом формате значение входного выражения CASE и значение выражения WHEN должны иметь одинаковый тип данных или допускать неявное преобразование типов.

В следующем примере используется простой формат предложения CASE внутри оператора SELECT. Колонка payterms (сроки платежей) таблицы sales (продажи) содержит одно из следующих значений для каждой строки: Net 30, Net 60, On invoice или None. С помощью следующего оператора T-SQL в колонке payterms можно выводить на экран альтернативные (более понятные) значения:

SELECT 'Payment Terms' =  (сроки платежей)
CASE payterms
      WHEN 'Net 30' THEN 'Payable 30 days    --к оплате в течение 30 дней
            after invoice'                   --после получения счета-фактуры
      WHEN 'Net 60' THEN 'Payable 60 days    --к оплате в течение 60 дней
            after invoice'                   --после получения счета-фактуры
      WHEN 'On invoice' THEN 'Payable upon   --к оплате по
            receipt of invoice'            --получении счета-фактуры
      ELSE 'None'
      END,
title_id
FROM sales
ORDER BY payterms
GO

В этом предложении CASE проверяется значение payterms для каждой строки, указанной в операторе SELECT. Значение результирующего выражения возвращается в том случае, если значение выражения WHEN равно значению колонки payterms. Результаты предложения CASE появляются в колонке Payment Terms результирующего набора, как это показано ниже:

Payment Terms                                 title_id 
----------------------------------------------------
Payable 30 days after invoice                 PC8888
Payable 30 days after invoice                 TC3218
Payable 30 days after invoice                 TC4203
Payable 30 days after invoice                 TC7777
Payable 30 days after invoice                 PS2091
Payable 30 days after invoice                 MC3021
Payable 30 days after invoice                 BU1111
Payable 30 days after invoice                 PC1035
Payable 60 days after invoice                 PS1372
Payable 60 days after invoice                 PS2106
Payable 60 days after invoice                 PS3333
Payable 60 days after invoice                 PS7777
Payable 60 days after invoice                 BU7832
Payable 60 days after invoice                 MC2222
Payable 60 days after invoice                 PS2091
Payable 60 days after invoice                 BU1032
Payable 60 days after invoice                 PS2091
Payable upon receipt of invoice               PS2091
Payable upon receipt of invoice                 BU1032
Payable upon receipt of invoice                 BU2075
Payable upon receipt of invoice                 MC3021

(21 row(s) affected)

А теперь рассмотрим второй формат предложения CASE – поисковый формат. В этом формате предложение CASE имеет следующий синтаксис:

CASE
  WHEN Булево_выражение THEN результирующее_выражение
  [WHEN Булево_выражение THEN результирующее_выражение...n]
  [ELSE результирующее_выражение_для_else]
END

Предложение CASE в поисковом формате отличается от CASE в простом формате тем, что в поисковом формате после ключевого слова CASE нет входного выражения, а после ключевых слов WHEN следуют булевы выражения, которые проверяются на значение TRUE или FALSE (а не на равенство). В поисковом формате предложение CASE проверяет значения булевых выражений и выводит значение результирующего выражения для первого булева выражения, возвращающего значение TRUE. (Выражения проверяются в порядке их следования.)

Например, предложение CASE внутри следующего оператора SELECT проверяет значение колонки price (цена) каждой строки и возвращает символьную строку, соответствующую диапазону цен (Price Range), в который попадает цена данной книги:

SELECT   'Price Range' =
  CASE  
     WHEN price BETWEEN .01 AND 10.00  
              THEN 'Inexpensive: $10.00 or less'    --дешевые
            WHEN price BETWEEN 10.01 AND 20.00
              THEN 'Moderate: $10.01 to $20.00'         --умеренные
            WHEN price BETWEEN 20.01 AND 30.00
              THEN 'Semi-expensive: $20.01 to $30.00'    --не слишком дорогие
            WHEN price BETWEEN 30.01 AND 50.00
              THEN 'Expensive: $30.01 to $50.00'       --дорогие
            WHEN price IS NULL
              THEN 'No price listed'          --цена не указана
          ELSE 'Very expensive!'            --очень дорогие
    END,
    title_id
FROM titles
ORDER BY price
GO

Результирующий набор имеет следующий вид:

Price Range                          title_id
————————————————                        ———— 
No price listed                      MC3026
No price listed                        PC9999
Inexpensive: $10.00 or less          MC3021
Inexpensive: $10.00 or less          BU2075
Inexpensive: $10.00 or less          PS2106
Inexpensive: $10.00 or less          PS7777
Moderate: $10.01 to $20.00           PS2091
Moderate: $10.01 to $20.00           BU1111
Moderate: $10.01 to $20.00           TC4203
Moderate: $10.01 to $20.00           TC7777
Moderate: $10.01 to $20.00           BU1032
Moderate: $10.01 to $20.00           BU7832
Moderate: $10.01 to $20.00           MC2222
Moderate: $10.01 to $20.00           PS3333
Moderate: $10.01 to $20.00           PC8888
Semi-expensive: $20.01 to $30.00       TC3218
Semi-expensive: $20.01 to $30.00       PS1372
Semi-expensive: $20.01 to $30.00       PC1035

(18 row(s) affected)
Примечание. В этих двух примерах предложения CASE мы ставили запятую после ключевого слова END, поскольку все предложение CASE было использовано как часть списка_колонок в предложении SELECT вместе с title_id. Иными словами, все предложение CASE было просто входом в список_колонок. Это наиболее распространенное применение ключевого слова CASE.
Другие ключевые слова

Ниже приводятся другие ключевые слова, которые можно использовать для управления программной последовательностью:

Дополнительная информация. Для получения более подробной информации по использования этих ключевых слов найдите "GOTO", "RETURN" и "WAITFOR" в Books Online и просмотрите темы, приведенные в диалоговом окне Topics Found.

Заключение

В этой лекции мы рассмотрели использование операторов T-SQL INSERT, UPDATE и DELETE. Мы также рассмотрели ключевые слова T-SQL IF, ELSE, WHILE, BEGIN, END и CASE, которые используются для управления программной последовательностью. В лекции 21 вы узнаете, как создавать хранимые процедуры, в которых вы можете использовать эти операторы и конструкции.

Лекция 21. Создание хранимых процедур и управление этими процедурами

Сложность вашей базы данных предполагает объемные запросы, которые становится все труднее выполнять. Хранимые процедуры – наборы операторов T-SQL, которые компилируется системой SQL Server в единый план исполнения – помогут решить возникающие проблемы сложности хранимых процедур. В лекции основное внимание уделено T-SQL, но и Enterprise Manager отводится несколько разделов. Рассматривается мастер Create Stored Procedure Wizard, позволяющий быстро создавать хранимые процедуры для базы данных. Весь материал, изложенный в лекции, сопровождается скриншотами и пояснениями. Вводится системная хранимая процедура sp_helptext. Знакомство с оператором CREATE PROCEDURE и его многочисленными параметрами.

В этой лекции вы ознакомитесь с хранимыми процедурами Microsoft SQL Server 2000, а также с их использованием. Сначала мы рассмотрим типы хранимых процедур, используемых в SQL Server. Затем вы узнаете, как создавать ваши собственные хранимые процедуры и управлять этими процедурами, а также как определять параметры и переменные. Для создания хранимых процедур вы можете использовать четыре метода. В этой лекции описывается, как использовать язык Transact-SQL (T-SQL), утилиту SQL Server Enterprise Manager и мастер создания хранимых процедур Create Stored Procedure Wizard. Четвертый метод создания хранимых процедур – использование SQL Distributed Management Objects (SQL-DMO) – не рассматривается здесь, поскольку он относится к прикладному программированию. Как вы увидите, для всех трех методов, описанных в этой лекции, требуется, чтобы вы использовали операторы T-SQL, поэтому уделите особое внимание описанию первого метода в разделе "Использование оператора CREATE PROCEDURE".

Что такое хранимая процедура?

Хранимая процедура – это набор операторов T-SQL, который компилируется системой SQL Server в единый "план исполнения". Этот план сохраняется в кэш-области памяти для процедур при первом выполнении хранимой процедуры, что позволяет использовать этот план повторно; системе SQL Server не требуется снова компилировать эту процедуру при каждом ее запуске. Хранимые процедуры T-SQL аналогичны процедурам в других языках программирования в том смысле, что они допускают входные параметры и возвращают выходные значения в виде параметров или сообщения о состоянии (успешное или неуспешное завершение). Все операторы процедуры обрабатываются при вызове процедуры. Хранимые процедуры используются для группирования операторов T-SQL и любых логических конструкций, необходимых для выполнения задачи. Поскольку хранимые процедуры сохраняются в виде процедурных блоков, они могут использоваться различными пользователями для согласованного повторяемого выполнения одинаковых задач и даже в различных приложениях. Хранимые процедуры также позволяют поддерживать единый подход к управлению задачей, что помогает обеспечивать согласованное и корректное внедрение любых деловых правил.

Ваше приложение может взаимодействовать с SQL Server двумя способами: вы можете программировать в приложении отправку операторов T-SQL от клиента на SQL Server или можете создавать хранимые процедуры, которые хранятся и выполняются на сервере. Если вы отправляете ваши операторы T-SQL на сервер, то эти операторы передаются через сеть и рекомпилируются SQL Server каждый раз, когда происходит их запуск. Используя хранимые процедуры, вы можете выполнять их путем вызова из вашего приложения с помощью одного оператора. Как уже говорилось, при первом запуске хранимой процедуры происходит ее компиляция и создание плана ее исполнения, который сохраняется в памяти. Затем при последующих вызовах этой процедуры SQL Server использует этот план исполнения без необходимости повторного компилирования. Поэтому в тех случаях, когда для выполнения задачи требуется выполнить несколько операторов T-SQL или когда требуется частая обработка какого-либо оператора, использование хранимой процедуры способствует снижению сетевого трафика и может оказаться эффективнее и быстрее, чем отправка каждого оператора через сеть от клиента на сервер.

Использование хранимых процедур может повысить производительность и в других отношениях. Например, использование хранимых процедур для проверки условий сервера может повысить производительность за счет снижения количества данных, которые должны передаваться между клиентом и сервером, и снижения объема обработки, выполняемой на клиентской машине. Для проверки какого-либо условия из хранимой процедуры можно включить в хранимую процедуру условные операторы (например, конструкции IF и WHILE, см. лекцию 20). Логика этой проверки будет обрабатываться на сервере с помощью хранимой процедуры, поэтому вам не потребуется программировать эту логику в самом приложении а серверу не нужно будет возвращать промежуточные результаты клиенту для проверки данного условия. Вы можете также вызывать хранимые процедуры из сценариев, пакетных заданий и интерактивных командных строк с помощью операторов T-SQL, показанных в примерах далее.

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

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

Дополнительная информация. Чтобы найти информацию об использовании курсоров и глобальных курсоров, выполните поиск "Cursors" (Курсоры) во вкладке Search (Поиск) системы Books Online и найдите темы "Cursors" (в Transact-SQL Reference) и "DECLARE CURSOR (T-SQL)".

Имеется три типа хранимых процедур: системные хранимые процедуры, расширенные хранимые процедуры и простые определяемые пользователем хранимые процедуры. Системные хранимые процедуры предоставляет SQL Server, и они имеют префикс sp_. Они используются для управления SQL Server и вывода на экран информации о базах данных и пользователях. Системные хранимые процедуры были введены в лекции 13. Расширенные хранимые процедуры являются динамически подключаемыми библиотеками (DLL), которые может динамически загружать и выполнять SQL Server. Обычно их пишут на C или C++, и они исполняют процедуры, внешние относительно SQL Server. Расширенные хранимые процедуры имеют префикс xp_. Простые определяемые пользователем хранимые процедуры создаются пользователем и настраиваются для выполнения тех задач, которые требуются данному пользователю.

Примечание. Вы не должны использовать префикс sp_ при создании простых определяемых пользователем хранимых процедур. Если SQL Server обнаруживает хранимую процедуру, имеющую префикс sp_, то он сначала ищет эту хранимую процедуру в главной базе данных (master). И если вы создадите, например, хранимую процедуру с именем sp_myproc в базе данных MyDB, то SQL Server сначала будет искать эту процедуру в главной базе данных, а уж затем в пользовательских базах данных. Разумнее назвать процедуру просто myproc.

В этой лекции мы будет в основном рассматривать простые определяемые пользователем хранимые процедуры. Но прежде чем перейти к изучению этих процедур, мы кратко изложим некоторые базовые сведения о расширенных хранимых процедурах. Расширенные хранимые процедуры придают высокую степень гибкости и расширяемости среде SQL Server. Они позволяют создавать ваши собственные внешние процедуры на C, C++ или других языках программирования. Расширенные внешние процедуры выполняются в том же стиле, что и два других типа хранимых процедур. Вы можете передавать параметры в расширенные хранимые процедуры, как и в другие типы хранимых процедур, и они могут возвращать результирующие наборы и/или сообщения о состоянии.

Как уже говорилось, расширенные хранимые процедуры – это библиотеки DLL, которые динамически загружает и выполняет SQL Server. Они выполняются непосредственно в адресном пространстве SQL Server, и вы можете программировать их, используя интерфейс прикладного программирования (API) SQL Server Open Data Services.

Расширенные хранимые процедуры пишут вне SQL Server. Закончив разработку расширенной хранимой процедуры, вы регистрируете ее в SQL Server с помощью операторов T-SQL или через Enterprise Manager.

Дополнительная информация. Дополнительную информацию о расширенных процедурах и примеры см. в SQL Server Books Online.

Создание хранимых процедур

В этом разделе мы рассмотрим три метода создания хранимой процедуры: использование оператора T-SQL CREATE PROCEDURE, использование Enterprise Manager и использование мастера Create Stored Procedure Wizard. Независимо от выбранного метода не забывайте тестировать каждую процедуру, выполняя при необходимости последующее редактирование, пока она не будет работать должным образом.

Использование оператора CREATE PROCEDURE

Оператор CREATE PROCEDURE имеет следующий синтаксис:

CREATE PROC[EDURE]   имя_процедуры
                             [ {@имя_параметра тип_данных} ] [= по_умолчанию][OUTPUT]
                             [,...,n]
AS оператор(ы)_t-sql

Создадим какую-либо простую хранимую процедуру. Эта процедура будет выбирать (и возвращать) три колонки данных для каждой строки таблицы Orders, в которой дата колонки ShippedDate больше даты колонки RequiredDate. Отметим, что хранимая процедура может быть создана только в текущей базе данных, к которой осуществляется доступ, поэтому сначала следует указать эту базу данных с помощью оператора USE. Прежде чем создать эту процедуру, мы выясним также, существует ли хранимая процедура с именем, которое мы хотим использовать. Если она существует, то мы удалим ее, и затем создадим новую процедуру с этим именем. Ниже показан набор T-SQL, используемый для создания этой процедуры:

USE Northwind
GO

IF EXISTS   (SELECT     name
                 FROM       sysobjects
                 WHERE      name = "LateShipments" AND
                              type = "P")
DROP PROCEDURE LateShipments
GO

CREATE PROCEDURE LateShipments
AS
SELECT   RequiredDate,
           ShippedDate,
           Shippers.CompanyName
FROM     Orders, Shippers
WHERE    ShippedDate    > RequiredDate AND
           Orders.ShipVia = Shippers.ShipperID
GO

Если запустить данный набор, то будет создана хранимая процедура. Для запуска хранимой процедуры просто обратитесь к ней по имени, как это показано ниже:

LateShipments
GO

Процедура LateShipments возвратит 37 строк данных.

Если оператор, вызывающий данную процедуру, входит в пакет операторов и не является первым оператором этого пакета, то вы должны использовать вместе с вызовом процедуры ключевое слово EXECUTE (сокращается до "EXEC"), как это показано в следующем примере:

SELECT getdate()
EXECUTE LateShipments
GO

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

Использование параметров

Теперь добавим к нашей хранимой процедуре входной параметр, чтобы мы могли передавать данные в эту процедуру. Чтобы задать входные параметры в хранимой процедуре, укажите список этих параметров с символом @ перед именем каждого параметра, т.е. @имя_параметра. Вы можете задать в хранимой процедуре до 1024 параметров. В нашем примере мы создадим параметр с именем @shipperName. При запуске хранимой процедуры мы укажем имя компании-грузоотправителя (shipperName), и результатом запроса будут строки только для этого грузоотправителя. Ниже приводится T-SQL-программа, используемая для создания новой хранимой процедуры:

USE Northwind
GO 
 
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = "LateShipments" AND 
                              type = "P")  
DROP PROCEDURE LateShipments 
GO 
 
CREATE PROCEDURE LateShipments @shipperName char(40) 
AS 
SELECT   RequiredDate, 
           ShippedDate, 
           Shippers.CompanyName 
FROM     Orders, Shippers 
WHERE    ShippedDate                  > RequiredDate AND 
           Orders.ShipVia             = Shippers.ShipperID AND 
            Shippers.CompanyName           = @shipperName 
GO

Для запуска этой хранимой процедуры вы должны указать входной параметр. Если параметр не указан, SQL Server выведет сообщение об ошибке, например, в следующей форме:

Procedure LateShipments, Line 0 Procedure 'LateShipments'
expects parameter '@shipperName', which was not supplied.
(Процедура LateShipments, Строка 0 процедуры 'LateShipments',
предполагается параметр '@shipperName', который не был указан)
Чтобы получить строки для грузоотправителя Speedy Express, выполните следующие операторы:
USE Northwind
GO

EXECUTE LateShipments "Speedy Express" 
GO

Вы увидите 12 строк, возвращенные в результате вызова этой хранимой процедуры.

Вы можете также задать для параметра значение по умолчанию, которое будет использоваться, когда этот параметр не указан в обращении к процедуре. Например, чтобы использовать для вашей хранимой процедуры значение по умолчанию United Package, измените текст создаваемой процедуры следующим образом: (изменена только строка CREATE PROCEDURE )

USE Northwind
GO 
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = "LateShipments" AND 
                              type = "P")  
DROP PROCEDURE LateShipments 
GO 


CREATE PROCEDURE LateShipments @shipperName char(40) = "United Package"

AS 
SELECT   RequiredDate, 
           ShippedDate, 
           Shippers.CompanyName 
FROM     Orders, Shippers 
WHERE    ShippedDate                  > RequiredDate AND 
           Orders.ShipVia             = Shippers.ShipperID AND 
           Shippers.CompanyName   = @shipperName 
GO

Теперь при запуске процедуры LateShipments без входного параметра ( @shipperName ) по умолчанию для этого параметра будет использоваться значение United Package ; процедура возвратит 16 строк. Но если вы укажете входной параметр, то его значение заместит значение, определенное по умолчанию.

Для возврата значения параметра хранимой процедуры в вызывающую программу используйте ключевое слово OUTPUT после имени этого параметра. Чтобы сохранить значение в переменной, которую можно использовать в вызывающей программе, используйте при вызове хранимой процедуры ключевое слово OUTPUT. Чтобы увидеть, как это происходит, мы создадим новую хранимую процедуру, которая выбирает цену единицы указанного продукта. Входной параметр @prod_id – это идентификатор продукта, а выходной параметр @unit_price – это возвращаемое значение цены единицы продукта. В вызывающей программе будет объявлена локальная переменная с именем @price, которая будет использоваться для сохранения возвращаемого значения. Ниже приводится набор операторов, используемый для создания хранимой процедуры GetUnitPrice:

USE Northwind
GO

IF EXISTS   (SELECT     name
                 FROM       sysobjects
                 WHERE      name = "GetUnitPrice" AND
                              type = "P")
DROP PROCEDURE GetUnitPrice
GO

CREATE PROCEDURE GetUnitPrice @prod_id int, @unit_price money OUTPUT

AS 
SELECT @unit_price = UnitPrice 
FROM   Products 
WHERE  ProductID = @prod_id 
GO

Прежде чем использовать переменную в вызове хранимой процедуры, вы должны объявить эту переменную в вызывающей программе. Например, в следующей программе мы сначала объявим переменную @price и присвоим ей тип данных money (который должен быть совместим с типом данных выходного параметра), а затем выполним хранимую процедуру:

DECLARE @price money
EXECUTE GetUnitPrice 77, @unit_price = @price OUTPUT
PRINT CONVERT(varchar(6), @price)
GO

Оператор PRINT возвращает значение 13.00 в переменной @price. Отметим, что мы использовали оператор CONVERT для преобразования значения @price в данные типа varchar, чтобы их можно было напечатать как строку, как символьный тип данных или как тип данных, которые могут быть неявно преобразованы в символьный тип, что требуется для оператора PRINT.

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

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

Использование локальных переменных внутри хранимой процедуры

Как показано в предыдущем разделе, для создания локальных переменных используется ключевое слово DECLARE. При создании локальной переменной вы должны задать для нее имя и тип данных, а также поставить перед именем переменной символ @. При объявлении переменной ей первоначально присваивается значение NULL.

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

Рассмотрим пример хранимой процедуры, содержащей локальные переменные. Эта процедура вставляет пять строк в таблицу с помощью циклической конструкции WHILE. Сначала мы создадим таблицу с именем mytable для этого примера и затем создадим хранимую процедуру InsertRows. В этой процедуре мы будем использовать локальные переменные @loop_counter и @start_val, которые объявим вместе и разделим запятой. В следующей T-SQL-программе создается таблица и хранимая процедура:

USE MyDB
GO

CREATE TABLE mytable
(
        column1 int,
         column2 char(10)
)
GO

CREATE PROCEDURE InsertRows @start_value int
AS
DECLARE     @loop_counter int, @start_val int
SET             @start_val = @start_value – 1
SET             @loop_counter = 0
WHILE (@loop_counter < 5)
     BEGIN
     INSERT INTO mytable VALUES (@start_val + 1, "new row")
          PRINT (@start_val)
          SET @start_val = @start_val + 1
          SET @loop_counter = @loop_counter + 1
     END
GO

А теперь выполним эту хранимую процедуру с начальным значением 1, как это показано ниже:

EXECUTE InsertRows 1
GO

Вы увидите пять значений, выведенных для @start_val: 0, 1, 2, 3 и 4.

Выберите все строки из таблицы mytable с помощью следующего оператора:

SELECT *
FROM   mytable
GO

После выполнения этого оператора SELECT мы получим следующие выходные результаты:

column1    column2
-----------------------
1           new row
2           new row
3           new row
4           new row
5           new row

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

PRINT (@loop_counter)
PRINT (@start_val)
GO

Сообщение об ошибке будет иметь следующую форму:

Msg 137, Level 15, State 2, Server JAMIERE3, Line 1
Must declare the variable '@loop_counter'.
(Должна быть объявлена переменная '@loop_counter')
Msg 137, Level 15, State 2, Server JAMIERE3, Line 2 
Must declare the variable '@start_value'.
(Должна быть объявлена переменная '@start_value')

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

USE Northwind
GO

DECLARE @price money
EXECUTE GetUnitPrice 77, @unit_price = @price OUTPUT
PRINT CONVERT(varchar(6), @price)
GO

PRINT CONVERT(varchar(6), @price)
GO

В первом операторе PRINT выводится значение локальной переменной @price из данного пакета. Во втором операторе сделана попытка вывести его снова вне пакета, но в результате появится сообщение об ошибке в следующей форме:

13.00

Msg 137, Level 15, State 2, Server JAMIERE3, Line 2
Must declare the variable '@price'.
(Должна быть объявлена переменная '@price')

Отметим, что первый оператор PRINT выполнен успешно. (Он вывел значение 13.00.)

Возможно, вам потребуется использовать операторы BEGIN TRANSACTION, COMMIT и ROLLBACK в хранимой процедуре, которая содержит более одного оператора T-SQL. Это позволяет указывать, какие операторы должны быть сгруппированы как одна транзакция. (Об использовании транзакций и этих операторов см. лекцию 19.)

Использование RETURN

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

Сначала рассмотрим пример использования RETURN просто для выхода из хранимой процедуры. Мы создадим модифицированную версию процедуры GetUnitPrice, которая проверяет, было ли задано входное значение, и если нет, то выводит сообщение для пользователя и возвращается в вызывающую программу. Для этого мы определим входной параметр со значением по умолчанию NULL и затем будем проверять это значение в процедуре; если входной параметр имеет значение NULL, это означает, что входное значение не задано. Ниже приводится пример удаления и повторного создания этой процедуры:

USE Northwind
GO

IF EXISTS   (SELECT     name
                 FROM       sysobjects
                 WHERE      name = "GetUnitPrice" AND
                              type = "P")
DROP PROCEDURE GetUnitPrice
GO

CREATE PROCEDURE GetUnitPrice @prod_id int = NULL
AS
IF @prod_id IS NULL
     BEGIN
          PRINT "Please enter a product ID number"
          RETURN
     END
ELSE
     BEGIN
          SELECT   UnitPrice
          FROM     Products
          WHERE    ProductID = @prod_id
     END
GO

А теперь запустим GetUnitPrice без ввода входного значения и посмотрим результаты. Для запуска этой хранимой процедуры вы должны указать оператор EXECUTE, поскольку вызов процедуры не является первым оператором этого пакета. Используйте следующую последовательность:

PRINT "Before procedure"
EXECUTE GetUnitPrice
PRINT "After procedure returns from stored procedure"
GO

Результаты будут выведены в следующей форме:

Before procedure (До процедуры)
Please enter a product ID number (Введите идентификационный номер продукта)
After procedure returns from stored procedure (После возврата из хранимой процедуры)

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

Теперь рассмотрим использование RETURN для возврата значения в вызывающую программу. Возвращаемое значение должно быть целым. Это может быть константа или переменная. Вы должны объявить в вызывающей программе переменную, в которой будет храниться возвращаемое значение для дальнейшего использования в этой программе. Например, следующая процедура возвратит значение 1, если цена единицы продукции для продукта, указанного во входном параметре, меньше $100 ; иначе она возвратит значение 99.

CREATE PROCEDURE CheckUnitPrice @prod_id int
AS
IF   (SELECT UnitPrice
      FROM   Products
      WHERE  ProductID = @prod_id) < 100
      RETURN 1
ELSE
      RETURN 99
GO

Для вызова этой хранимой процедуры и использования возвращаемого значения объявите в вызывающей программе переменную и приравняйте ее возвращаемому значению хранимой процедуры (указав значение 66 в ProductID для входного параметра):

DECLARE @return_val int
EXECUTE @return_val = CheckUnitPrice 66
IF (@return_val = 1) PRINT "Unit price is less than $100"
GO

В результате будет выведен текст "Unit price is less than $100" (Цена единицы продукции меньше $100), поскольку цена единицы продукции для указанного продукта равна $17 и, тем самым, возвращаемое значение равно 1. Убедитесь в том, что вы задали целый тип данных, когда объявляете переменную, которая используется для хранения значения, возвращаемого оператором RETURN, поскольку этот оператор возвращает целое значение.

Использование SELECT для возвращаемых значений

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

Рассмотрим пару примеров. Сначала мы создадим новую хранимую процедуру с именем PrintUnitPrice, которая возвращает цену единицы продукции для продукта, указанного во входном параметре (с помощью идентификатора этого продукта). Используется следующая последовательность:

CREATE PROCEDURE PrintUnitPrice @prod_id int
AS
SELECT     ProductID,
             UnitPrice
FROM       Products
WHERE      ProductID = @prod_id
GO

Вызовите эту процедуру со значением входного параметра 66, как это показано ниже:

PrintUnitPrice 66
GO

Результаты будут выведены в следующей форме:

ProductID       UnitPrice
------------------------------------------
66                    17.00
(1 row(s) affected)

Для возврата значений переменных с помощью оператора SELECT, укажите после SELECT имя соответствующей переменной. В следующем примере мы снова создадим хранимую процедуру CheckUnitPrice, которая возвращает значение переменной, а также зададим заголовок выводимой колонки:

USE Northwind
GO  
 
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = "CheckUnitPrice" AND 
                              type = "P")  
DROP PROCEDURE CheckUnitPrice 
GO 

CREATE PROCEDURE CheckUnitPrice @prod_id INT 
AS 
DECLARE @var1 int 
IF   (SELECT     UnitPrice 
      FROM       Products 
      WHERE      ProductID = @prod_id) > 100 
      SET          @var1 = 1 
ELSE 
      SET    @var1 = 99 
SELECT "Variable 1" = @var1 
PRINT "Can add more T-SQL statements here" 
GO

Вызовите эту процедуру со значением входного параметра 66, как это показано ниже:

CheckUnitPrice 66 
GO

Результаты выполнения этой хранимой процедуры будут выведены в следующей форме:

Variable   1 
--------------
           99 
 
(1 row(s) affected) 
 
Can add more T-SQL statements here

Мы вывели текст оператора PRINT "Can add more T-SQL statements here" (Здесь можно добавить другие операторы T-SQL), чтобы показать отличие между возвратом значения с помощью SELECT и возвратом значения с помощью RETURN. Оператор RETURN прекращает работу хранимой процедуры в том месте, где он находится, а оператор SELECT возвращает свой результирующий набор, после чего продолжается выполнение хранимой процедуры.

Если бы в этом примере мы не задали заголовок колонки (просто указали бы SELECT @var1 ), то получили бы результат без заголовка, как это показано ниже:

--------------
99
 
(1 row(s) affected)
Использование Enterprise Manager

Теперь, когда вы знаете, как использовать T-SQL для создания хранимых процедур, рассмотрим, как использовать для их создания Enterprise Manager. Чтобы создать хранимую процедуру с помощью Enterprise Manager, вам по-прежнему нужно знать, как записываются операторы T-SQL. Enterprise Manager просто снабжает вас графическим интерфейсом, в котором можно создавать вашу процедуру. Мы опробуем этот метод, повторно создав хранимую процедуру InsertRows, как это описано ниже.

  1. Чтобы удалить хранимую процедуру, сначала раскройте папку базы данных MyDB в левой панели. Enterprise Manager и щелкните на папке Stored Procedures (Хранимые Процедуры). В правой панели появятся все хранимые процедуры этой базы данных. Щелкните правой кнопкой мыши на хранимой процедуре InsertRows (она должна существовать – мы создали ее ранее в этой лекции) и выберите из контекстного меню пункт Delete (Удалить). (Вы можете также переименовать или скопировать хранимую процедуру через это контекстное меню.) Появится диалоговое окно Drop Objects (Удаление объектов) (рис. 21.1). Щелкните на кнопке Drop All (Удалить все), чтобы удалить хранимую процедуру.
  2. Щелкните правой кнопкой мыши на папке Stored Procedures и выберите из контекстного меню пункт New Stored Procedure (Создать хранимую процедуру). Появится диалоговое окно Stored Procedure Properties (Свойства хранимой процедуры) (рис. 21.2).

    Диалоговое окно Drop Objects (Удаление объектов)


    Рис. 21.1.  Диалоговое окно Drop Objects (Удаление объектов)

     Окно Stored Procedure Properties (Свойства хранимой процедуры)


    Рис. 21.2.  Окно Stored Procedure Properties (Свойства хранимой процедуры)

  3. В поле Text (Текст) вкладки General (Общие) замените [OWNER].[PROCEDURE NAME] ([Владелец].[Имя процедуры]) на имя хранимой процедуры – в данном случае, – InsertRows. Затем введите текст T-SQL-программы для этой хранимой процедуры. На рис. 21.3 показано окно Stored Procedure Properties после ввода текста T-SQL-программы для процедуры InsertRows.

    Текст T-SQL-программы для новой хранимой процедуры


    Рис. 21.3.  Текст T-SQL-программы для новой хранимой процедуры

  4. Щелкните на кнопке Check Syntax (Проверить синтаксис), чтобы SQL Server указал ошибки синтаксиса T-SQL в хранимой процедуре. Исправьте найденные синтаксические ошибки и снова щелкните на кнопке Check Syntax. После успешной проверки синтаксиса вы увидите окно сообщения (рис. 21.4). Щелкните на кнопке OK

    Окно сообщения об успешной проверке синтаксиса хранимой процедуры


    Рис. 21.4.  Окно сообщения об успешной проверке синтаксиса хранимой процедуры

  5. Щелкните на кнопке OK в окне Stored Procedure Properties, чтобы создать вашу хранимую процедуру и вернуться в окно Enterprise Manager. Щелкните на папке Stored Procedures в левой панели Enterprise Manager, чтобы показать новую хранимую процедуру в правой панели (рис. 21.5).

    Новая хранимая процедура в окне Enterprise Manager


    увеличить изображение

    Рис. 21.5.  Новая хранимая процедура в окне Enterprise Manager

  6. Чтобы присвоить пользователям полномочия выполнения новой хранимой процедуры, щелкните правой кнопкой мыши на имени этой хранимой процедуры в правой панели Enterprise Manager и выберите из контекстного меню пункт Properties (Свойства). В появившемся окне Stored Procedure Properties щелкните на кнопке Permissions (Полномочия). Появится окно Object Properties (Свойства объектов) (рис. 21.6). Установите флажки в колонке EXEC для пользователей или ролей базы данных, которым вы хотите разрешить выполнение этой хранимой процедуры. В данном примере полномочия выполнения хранимой процедуры InsertRows предоставлены трем пользователям.

    Вкладка Permissions окна Object Properties (Свойства объектов)


    Рис. 21.6.  Вкладка Permissions окна Object Properties (Свойства объектов)

  7. Щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK, чтобы присвоить выбранные вами полномочия и вернуться в окно Stored Procedure Properties. Для завершения щелкните на кнопке OK.

Вы можете также использовать Enterprise Manager для редактирования хранимой процедуры. Для этого щелкните правой кнопкой мыши на имени этой процедуры и выберите из контекстного меню пункт Properties. Выполните редактирование процедуры в окне Stored Procedure Properties (рис. 21.3), проверьте синтаксис, щелкнув на кнопке Check Syntax, щелкните на кнопке Apply и затем щелкните на кнопке OK.

Кроме того, вы можете использовать Enterprise Manager для управления полномочиями по хранимой процедуре. Для этого щелкните правой кнопкой мыши на имени хранимой процедуры в окне Enterprise Manager, укажите в контекстном меню пункт All Tasks (Все задачи) и выберите пункт Manage Permissions (Управление полномочиями). Вы можете также создавать публикацию для репликации (см. лекцию 26), генерировать сценарии SQL и отображать зависимости (dependencies) для хранимой процедуры из подменю All Tasks. Если вы решите генерировать сценарии SQL, то SQL Server автоматически создаст файл сценария (с указанным вами именем), который будет содержать определение хранимой процедуры. Затем вы сможете при необходимости повторно создать процедуру, используя этот сценарий.

Использование мастера Create Stored Procedure Wizard

Третий метод создания хранимых процедур – использование мастера создания хранимых процедур Create Stored Procedure Wizard – дает вам основу для написания ваших процедур из шаблонных операторов T-SQL. Вы можете применить мастер для создания хранимой процедуры, используемой для вставки, удаления или обновления строк таблиц. Этот мастер не помогает создавать процедуры, которые считывают строки из таблицы.

Мастер позволяет вам создавать несколько хранимых процедур в одной базе данных без необходимости выхода из мастера и его перезапуска. Однако для создания процедуры в другой базе данных вы должны снова запустить мастер. Для запуска этого мастера выполните следующие шаги.

  1. В окне Enterprise Manager выберите из меню Tools (Сервис) пункт Wizards (Мастера), чтобы появилось диалоговое окно Select Wizard (Выбор мастера). Раскройте папку Database и щелкните на строке Create Stored Procedure Wizard (рис. 21.7).

     Диалоговое окно Select Wizard (Выбор мастера)


    Рис. 21.7.  Диалоговое окно Select Wizard (Выбор мастера)

  2. Щелкните на кнопке OK, чтобы появилось начальное окно мастера Create Stored Procedure Wizard (рис. 21.8).

     Начальное окно мастера Create Stored Procedure Wizard (Создание хранимых процедур)


    Рис. 21.8.  Начальное окно мастера Create Stored Procedure Wizard (Создание хранимых процедур)

  3. Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database (Выбор базы данных). Введите имя базы данных, в которой вы хотите создать хранимую процедуру.
  4. Щелкните на кнопке Next, чтобы появилось окно Select Stored Procedures (Выбор хранимых процедур) (рис. 21.9). Здесь вы увидите список всех таблиц в выбранной базе данных с тремя колонками флажков. Эти колонки представляют три типа хранимых процедур, которые можно создать с помощью этого мастера: хранимые процедуры, которые выполняют вставку (Insert), удаление (Delete) и обновление (Update) данных. Установите нужные флажки в колонках рядом с именем каждой таблицы.

     Окно Select Stored Procedures (Выбор хранимых процедур)


    Рис. 21.9.  Окно Select Stored Procedures (Выбор хранимых процедур)

    В данном примере показаны две таблицы, которые использовались на протяжении всей этой книги. Как видно из рисунка, таблице Bicycle_Inventory были присвоены две процедуры: процедура вставки (insert)) и процедура обновления (update). Как показано в последующих шагах, вы можете изменять эти процедуры до их реального создания.
    Примечание. Одна хранимая процедура может выполнять несколько типов модификаций данных, но мастер Create Stored Procedure Wizard создает каждый тип модификаций в виде отдельной хранимой процедуры. Вы можете изменять любую из создаваемых этим мастером процедур, добавляя другие операторы T-SQL.
  5. Щелкните на кнопке Next, чтобы появилось окно мастера Create Stored Procedure Wizard (рис. 21.10). В этом окне содержится список имен и описаний всех хранимых процедур, которые будут созданы, когда вы завершите работу мастера.
  6. Чтобы переименовать и отредактировать хранимую процедуру, начните с выбора ее имени в окне Completing the Create Stored Procedure Wizard и затем щелкните на кнопке Edit (Правка), чтобы появилось окно Edit Stored Procedure Properties (Редактирование свойств хранимой процедуры) (рис. 21.11). Это окно содержит список колонок таблицы, на которые повлияет данная процедура. Колонки, для которых установлен флажок в колонке Select, будут использоваться в данной хранимой процедуре.

     Окно мастера Completing the Create Stored Procedure Wizard


    Рис. 21.10.  Окно мастера Completing the Create Stored Procedure Wizard

    Окно Edit Stored Procedure Properties (Редактирование свойств хранимой процедуры)


    Рис. 21.11.  Окно Edit Stored Procedure Properties (Редактирование свойств хранимой процедуры)

    В этом примере показано шесть колонок таблицы Bicycle_Inventory, на которые может повлиять процедура вставки с текущим именем insert_Bicycle_Inventory_1. Для каждой колонки таблицы установлен флажок в колонке Select. Эти флажки указывают, что при выполнении данной хранимой процедуры потребуется ввод значений во все шесть колонок и что хранимая процедура вставит эти шесть значений в соответствующие шесть колонок.
  7. Для переименования хранимой процедуры удалите существующее имя в текстовом поле Name и замените его новым именем.
  8. Для редактирования хранимой процедуры щелкните на кнопке Edit SQL (Редактировать SQL), чтобы появилось диалоговое окно Edit Stored Procedure SQL (Редактирование SQL хранимой процедуры) (рис. 21.12). Здесь вы можете видеть T-SQL-программу для хранимой процедуры. Как видно из рисунка, здесь используются довольно простые операторы T-SQL. В данном примере пять параметров, которые вы указываете при вызове этой хранимой процедуры, – это значения, которые вставляются в виде новой строки в таблицу. Для редактирования этой процедуры просто введите ваши изменения в текстовом окне. Закончив правку, щелкните на кнопке Parse (Синтаксический разбор), чтобы проверить синтаксис, исправьте ошибки и затем щелкните на кнопке OK, чтобы вернуться в окно мастера Completing the Create Stored Procedure Wizard.

      Диалоговое окно Edit Stored Procedure SQL


    Рис. 21.12.  Диалоговое окно Edit Stored Procedure SQL

  9. После внесения возможных изменений и проверки процедуры щелкните на кнопке Finish (Готово), чтобы создать хранимые процедуры. Не забудьте задать полномочия по каждой из хранимых процедур после создания этих процедур. (См. раздел "Использование Enterprise Manager" выше.)

Как видите, этот мастер нельзя назвать очень полезным. Если вы знаете, как писать программы на языке T-SQL, то вы можете также использовать сценарии или Enterprise Manager для создания ваших собственных хранимых процедур.

Управление хранимыми процедурами с помощью T-SQL

Теперь, когда мы знаем, как создавать хранимые процедуры, рассмотрим, как использовать операторы T-SQL для изменения, удаления и просмотра содержимого хранимой процедуры.

Оператор ALTER PROCEDURE

Оператор T-SQL ALTER PROCEDURE используется для изменения хранимой процедуры, созданной с помощью оператора CREATE PROCEDURE. При использовании оператора ALTER PROCEDURE сохраняются исходные полномочия, установленные для данной хранимой процедуры, а изменения не влияют на любые зависимые процедуры или триггеры. (Зависимая процедура или триггер – это соответствующий объект, который вызывается процедурой.)

Синтаксис оператора ALTER PROCEDURE аналогичен синтаксису оператора CREATE PROCEDURE:

ALTER PROC[EDURE]     имя_процедуры
                               [ {@имя_параметра тип_данных} ] [= по_умолчанию] [OUTPUT]
                              [,...,n]
AS оператор(ы)_t-sql

В операторе ALTER PROCEDURE вы должны переписать всю хранимую процедуру, внося нужные изменения. Например, изменим хранимую процедуру GetUnitPrice, которую мы использовали в предыдущем примере, добавив условие проверки цен единицы продукции, превышающих $100, как это показано ниже:

USE Northwind
GO
 
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = "GetUnitPrice" AND 
                              type = "P")  
DROP PROCEDURE GetUnitPrice 
GO 
 
CREATE PROCEDURE GetUnitPrice   @prod_id    int, 
                             @unit_price money OUTPUT 
AS 
SELECT   @unit_price = UnitPrice 
FROM     Products 
WHERE    ProductID = @prod_id 
GO  
ALTER PROCEDURE GetUnitPrice   @prod_id    int, 
                            @unit_price money OUTPUT 
AS 
SELECT   @unit_price = UnitPrice 
FROM     Products 
WHERE    ProductID = @prod_id AND 
           UnitPrice > 100 
GO

Теперь предоставим полномочия выполнения по этой хранимой процедуре пользователю DickB с помощью следующего оператора:

GRANT EXECUTE ON GetUnitPrice TO DickB
GO

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

ALTER PROCEDURE GetUnitPrice   @prod_id    int,
                       @unit_price money OUTPUT 
AS 
SELECT   @unit_price = UnitPrice 
FROM     Products 
WHERE    ProductID = @prod_id AND 
           UnitPrice > 200 
GO

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

Оператор DROP PROCEDURE

Оператор T-SQL DROP PROCEDURE действует просто – он удаляет хранимую процедуру. Вы не сможете восстановить хранимую процедуру после ее удаления. Если вам нужно использовать удаленную процедуру, вы должны полностью воссоздать ее с помощью оператора CREATE PROCEDURE. Все полномочия по удаленной хранимой процедуре будут утрачены, и они должны быть предоставлены снова. Ниже приводится пример использования DROP PROCEDURE для удаления процедуры GetUnitPrice:

USE Northwind
GO
 
DROP PROCEDURE GetUnitPrice 
GO
Примечание. Для удаления хранимой процедуры вы должны использовать базу данных, в которой она находится. Напомним, что для использования какой-либо базы данных нужно применить оператор USE, после которого указывается имя этой базы данных.
Хранимая процедура sp_helptext

Системная хранимая процедура sp_helptext позволяет вам просматривать определение любой хранимой процедуры и оператора, который использовался для создания этой процедуры. (Ее можно также использовать для просмотра определения триггера, представления, правила или значения по умолчанию.) Это средство полезно, если вы хотите быстро воспроизвести определение процедуры (или одного из только что упомянутых объектов), когда используете ISQL, OSQL или анализатор запросов SQL Query Analyzer. Вы можете также направлять выходные результаты в файл, чтобы создать из этого определения сценарий, который можно использовать для редактирования или повторного создания процедуры. Чтобы использовать sp_helptext, вы должны указать в качестве параметра имя вашей хранимой процедуры (или имя другого объекта). Например, для просмотра операторов, которые использовались выше для создания процедуры InsertRows, используйте следующую команду. (И здесь для выполнения данной команды вы должны использовать базу данных, в которой находится процедура.)

USE MyDB GO sp_helptext InsertRows GO

Выводимые результаты выглядят следующим образом:

Text
---------------------------------------------------------------------
CREATE PROCEDURE InsertRows   @start_value int 
AS 
DECLARE    @loop_counter int, 
               @start_val    int 
SET            @start_val = @start_value – 1 
SET            @loop_counter = 0 
WHILE (@loop_counter < 5) 
     BEGIN 
          INSERT INTO mytable VALUES (@start_val + 1, 'new row') 
          PRINT (@start_val) 
          SET      @start_val        = @start_val + 1 
          SET      @loop_counter   = @loop_counter + 1 
   END

Заключение

В этой лекции вы узнали, что такое системные хранимые процедуры и определяемые пользователем хранимые процедуры и почему они используются. Вы также узнали, как создавать хранимые процедуры с помощью операторов T-SQL, Enterprise Manager или мастера Create Stored Procedure Wizard, и увидели, чем отличаются эти методы. Кроме того, вы узнали, как использовать параметры и переменные и как выполнять хранимые процедуры. Мы также рассмотрели операторы T-SQL, используемые для изменения, удаления и просмотра текста хранимой процедуры. В лекции 22 мы рассмотрим триггеры – специальный тип хранимых процедур, – которые автоматически запускаются при определенных условиях.

Лекция 22. Создание и использование триггеров

Специальный класс хранимых процедур – триггер – предназначен для автоматического запуска системой SQL Server при модифицировании какой-либо таблицы одним из трех операторов: UPDATE, INSERT или DELETE. Введение триггеров обусловлено желанием создать более безопасные и устойчивые базы данных. Почти вся лекция строится на использовании T-SQL, а вот Enterprise Manager уделено не так много материала, в связи с тем, что написание хранимых процедур лучше всего производить в T-SQL для обеспечения требуемой функциональности.

Триггер – это специальный класс хранимой процедуры. В этой лекции вы узнаете, что выполняют триггеры и когда их следует использовать. Вы также узнаете о расширении возможностей триггеров в Microsoft SQL Server 2000. Вы изучите на практике два метода создания триггеров: с помощью операторов Transact-SQL (T-SQL) и с помощью SQL Server Enterprise Manager. Вы также узнаете, как управлять триггерами и модифицировать их.

Что такое триггер?

Триггер – это специальный тип хранимой процедуры, которая запускается автоматически системой SQL Server при модифицировании какой-либо таблицы одним из трех операторов: UPDATE, INSERT или DELETE. Триггеры, как другие хранимые процедуры, могут содержать простые или сложные операторы T-SQL. В отличие от других типов хранимых процедур триггеры запускаются автоматически при указанных модификациях данных; их нельзя запустить вручную по имени. Когда происходит запуск триггера, говорят, что он активизируется (fire). Триггер создается по одной таблице базы данных, но он может осуществлять доступ и к другим таблицам и объектам других баз данных. Триггеры нельзя создать по временным таблицам или системным таблицам, а только по определенным пользователем таблицам или представлениям. Таблица, по которой определяется триггер, называется таблицей триггера.

Существует пять типов триггеров: UPDATE, INSERT, DELETE, INSTEAD OF и AFTER. Как следует из названий, триггер UPDATE активизируется, когда выполняются изменения (обновления) в какой-либо таблице, триггер INSERT активизируется, когда происходит вставка данных в таблицу и триггер DELETE активизируется, когда из таблицы удаляются данные. Триггер INSTEAD OF выполняется вместо операции вставки, обновления или удаления. Триггер AFTER активизируется после какой-либо запускающей операции и обеспечивает механизм управления порядком выполнения нескольких триггеров.

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

Например, вы можете создать триггер, который будет активизироваться, когда происходит выполнение оператора UPDATE или INSERT, и такой триггер мы будем называть триггером UPDATE/INSERT. Вы можете даже создать триггер, который будет активизироваться при возникновении любого из трех событий модификации данных (триггер UPDATE/INSERT/DELETE ).

Вам следует знать некоторые из других общих правил, относящихся к триггерам. Это следующие правила:

При активизации триггера результаты (если они есть) возвращаются вызывающей программе, как и при использовании хранимых процедур. Обычно результаты не возвращаются из оператора INSERT, UPDATE или DELETE (это операторы, вызывающие активизацию триггера). Результаты обычно возвращаются из запросов SELECT. Поэтому, чтобы избежать результатов, возвращаемых в приложение из триггера, откажитесь от использования операторов SELECT и присваивания переменных в определении триггера. Если вам все-таки нужно, чтобы триггер возвращал результаты, вы должны включить в приложение специальную обработку там, где разрешены модификации в таблице, содержащей триггер, чтобы приложение получало возвращаемые данные и обрабатывало их нужным образом.

Если вам нужно назначить переменную внутри триггера, используйте оператор SET NOCOUNT ON в начале триггера, чтобы не было возвращаемых результирующих строк. Оператор SET NOCOUNT указывает, нужно ли возвращать сообщение, указывающее, сколько строк было затронуто запросом или оператором (например, "23 rows affected"). По умолчанию для SET NOCOUNT задается значение OFF, а это означает выдачу сообщения о количестве затронутых строк. Отметим, что этот параметр не влияет на реальные возвращаемые результаты из оператора SELECT ; он влияет только на возврат сообщений о количестве строк.

Расширение возможностей триггеров в SQL Server 2000

В SQL Server 2000 включены два новых триггера: триггер INSTEAD OF и триггер AFTER. Триггер INSTEAD OF выполняется вместо запуска оператора SQL. Тем самым переопределяется действие запускающего оператора. Вы можете задать по одному триггеру INSTEAD OF на один оператор INSERT, UPDATE или DELETE. Триггер INSTEAD OF можно задать для таблицы и/или представления. Вы можете использовать каскады триггеров INSTEAD OF, определяя представления поверх представлений, где каждое представление имеет отдельный триггер INSTEAD OF. Триггеры INSTEAD OF не разрешается применять для модифицируемых представлений, содержащих опцию WITH CHECK. Прежде чем задавать триггер INSTEAD OF для одного из этих представлений, вы должны удалить опцию WITH CHECK из модифицируемого представления с помощью команды ALTER VIEW. Более подробную информацию по созданию представлений см. в лекции 18.

Триггер AFTER активизируется после успешного выполнения всех операций, указанных в запускающем операторе или операторах SQL. Сюда включается весь каскад действий по ссылкам и все проверки ограничений. Если у вас имеется несколько триггеров AFTER, определенных по таблице для определенного оператора или набора операторов, то вы можете задать, какой триггер будет активизирован первым и какой триггер – последним. Если у вас определено больше двух триггеров, то вы можете задать порядок активизации только первого и последнего триггера. Все остальные триггеры активизируются случайным образом. Порядок активизации задается с помощью оператора T-SQL sp_settriggerorder.

Кроме новых триггеров, SQL Server 2000 позволяет также задавать триггеры как по представлениям, так и по таблицам. В предыдущих версиях SQL Server разрешалось задавать триггеры только по таблицам. Триггеры по представлениям действуют точно так же, как и триггеры по таблицам.

Когда использовать триггеры

Триггеры, как и ограничения, можно использовать для поддержки целостности данных и деловых правил, но триггер не следует использовать как замену ограничения, когда достаточно использовать только ограничение. (Ограничения описаны в лекции 16.) Например, вам не нужно создавать триггер, который проверяет наличие значения в колонке первичного ключа одной таблицы, чтобы определить, можно ли вставить это значение в соответствующую колонку другой таблицы; в этой ситуации прекрасно подойдет ограничение FOREIGN KEY. Однако вам может потребоваться триггер для каскадирования изменений, вносимых в связанные таблицы базы данных. Например, вы можете создать триггер DELETE по колонке title_id в таблице titles базы данных pubs, который удалит строки в таблицах sales, roysched и titleauthor, если удаляется соответствующая строка в таблице titles. (Мы увидим в следующем разделе, как создать этот триггер DELETE.)

Вы можете также использовать триггеры для проведения более сложных проверок по данным, чем это допускается при использовании ограничения CHECK. (Ограничения CHECK подробно описываются в лекции 16.) Дело в том, что триггеры могут обращаться к колонкам таблиц, отличных от таблицы, по которой они определены, в то время как ограничения CHECK действуют в рамках только одной таблицы.

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

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

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

Создание триггеров

Теперь, зная, что такое триггеры и когда они используются, перейдем к особенностям создания триггеров. В этом разделе мы рассмотрим сначала метод создания триггеров с помощью T-SQL и затем – метод с использованием Enterprise Manager. Чтобы использовать Enterprise Manager для создания триггеров, вам нужно знать программирование с помощью T-SQL, как и в случае, когда вы используете Enterprise Manager для создания других типов хранимых процедур.

Использование оператора CREATE TRIGGER

Чтобы использовать T-SQL для создания триггера, нужно применить оператор CREATE TRIGGER. (В методе с Enterprise Manager также используется этот оператор.) Оператор CREATE TRIGGER имеет следующий синтаксис:

CREATE TRIGGER имя_триггера
ON {таблица | представление}
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF}  
    {[DELETE] [,] [INSERT] [,] [UPDATE]}  
        [WITH APPEND]  
        [NOT FOR REPLICATION]  
AS
        оператор_sql [...n]

Как видно из этого описания, вы можете создать триггер для оператора INSERT, UPDATE, DELETE, INSTEAD OF или AFTER или для любой комбинации из этих пяти операторов. Вы должны задать хотя бы одну опцию с предложением FOR. Это предложение указывает, возникновение какого типа события модификации данных (или типов событий) по указанной таблице приведет к активизации данного триггера.

При вызове триггера будут выполнены операторы SQL, указанные после ключевого слова AS. Вы можете поместить сюда несколько операторов, включая программные конструкции, такие как IF и WHILE. В определении триггера не допускаются следующие операторы:

Использование таблиц deleted и inserted

Как уже говорилось, при создании триггера вы имеете доступ к двум временным таблицам с именами deleted и inserted. Их называют таблицами, но они отличаются от реальных таблиц баз данных. Они хранятся в памяти, а не на диске.

Эти две таблицы имеют одинаковую структуру с таблицей (одинаковые колонки и типы данных), по которой определяется данный триггер. Таблица deleted содержит копии строк, на которые повлиял оператор DELETE или UPDATE. Строки, удаляемые из таблицы данного триггера, перемещаются в таблицу deleted. После этого к данным таблицы deleted можно осуществлять доступ из данного триггера. Таблица inserted содержит копии строк, добавленных к таблице данного триггера при выполнении оператора INSERT или UPDATE. Эти строки добавляются одновременно в таблицу триггера и в таблицу inserted. Поскольку оператор UPDATE обрабатывается как DELETE, после которого следует INSERT, то при использовании оператора UPDATE старые значения строк копируются в таблицу deleted, а новые значения строк – в таблицу триггера и в таблицу inserted.

Если вы попытаетесь проверить содержимое таблицы deleted из триггера, который активизирован в результате выполнения оператора INSERT, эта таблица окажется пустой, но сообщение об ошибке не возникнет. Выполнение оператора INSERT не приводит к копированию значений строк в таблицу deleted. Аналогичным образом, если вы попытаетесь проверить содержимое таблицы inserted из триггера, который активизирован в результате выполнения оператора DELETE, эта таблица окажется пустой. Выполнение оператора DELETE не приводит к копированию значений строк в таблицу inserted. И здесь просмотр пустой таблицы не приведет к сообщению об ошибке; поэтому для использования этих таблиц с целью просмотра результатов модификаций убедитесь в том, что для доступа из триггера у вас выбрана соответствующая таблица.

Примечание. Значения таблиц inserted и deleted доступны только из триггера. После завершения работы триггера эти таблицы больше не доступны.
Создание вашего первого триггера

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

USE MyDB
GO
CREATE   TABLE Bicycle_Inventory
(
           make_name           char(10)         NOT NULL,
           make_id             tinyint          NOT NULL,
           model_name          char(12)         NOT NULL,
           model_id            tinyint          NOT NULL,
           in_stock            tinyint          NOT NULL,
           on_order            tinyint          NULL,
)
GO

IF EXISTS (SELECT name
    FROM       sysobjects
     WHERE      name = "Print_Update" AND
                            type = "TR")
DROP TRIGGER Print_Update
GO
CREATE TRIGGER Print_Update
ON Bicycle_Inventory
FOR UPDATE
AS
PRINT "The Bicycle_Inventory table was updated"
GO

Чтобы проверить ваш триггер, выполним вставку строки в эту таблицу и затем модифицируем ее:

INSERT   INTO Bicycle_Inventory VALUES ("Trek",1,"5500",5,1,0)
GO

UPDATE   Bicycle_Inventory
SET        make_id = 2
WHERE    model_name = "5500"
GO

Будет возвращено сообщение "The Bicycle_Inventory table was updated", так как в результате выполнения оператора UPDATE был запущен триггер. В данном примере мы задали в нашем триггере вывод сообщения, чтобы можно было увидеть работу этого триггера. Но обычно не требуется, чтобы триггер возвращал выходные данные. Однако в определенных обстоятельствах это может оказаться полезным. Например, предположим, что вы создаете триггер типа UPDATE, который выполняет свои операторы, только когда в указанную колонку заносится определенное значение, но эта модификация происходит неверно. Если добавить в триггер оператор PRINT, который выводит значение этой колонки до выполнения других операторов триггера, это, видимо, поможет определить, где лежит источник проблемы – в логике самого триггера или в модифицируемых данных.

Создание триггера типа DELETE

Перейдем к более сложному примеру – триггер типа DELETE, который каскадирует изменения в связанные таблицы. Мы создадим триггер, который будет удалять строки из таблиц sales, roysched и titleauthor базы данных pubs, когда соответствующая строка удаляется из таблицы titles. Мы будем использовать таблицу deleted, чтобы указывать, какие строки нужно удалить из связанных таблиц. (Напомним, что при удалении какой-либо строки из таблицы триггера эта строка копируется в таблицу deleted; затем вы можете проверить содержимое таблицы deleted и удалить соответствующие записи в других таблицах.) Чтобы этот триггер мог работать, нам нужно было бы удалить ограничения FOREIGN KEY из таблиц titleauthor, roysched и sales, которые связаны с колонкой title_id таблицы titles. В данном примере мы создадим триггер так, как будто этих ограничений FOREIGN KEY не существует. Если все же попытаться удалить строку из таблицы titles, не удалив ограничений FOREIGN KEY, то вы получите сообщение об ошибке от SQL Server и удаление не произойдет.

Примечание. Если вы не возражаете против изменения вашей базы данных pubs, попытайтесь удалить ограничения FOREIGN KEY самостоятельно и затем создать данный триггер. Проще всего удалить ограничения FOREIGN KEY с помощью схемы базы данных в окне Enterprise Manager. (Этот процесс описан в лекции 16.) Не забудьте удалить ограничения FOREIGN KEY, связанные с title_id.

Ниже показана программа T-SQL для этого триггера:

USE pubs
GO
IF EXISTS   (SELECT       name 
                 FROM        sysobjects 
                 WHERE       name = "Delete_Title" AND 
                                 type = "TR") 
DROP TRIGGER Delete_Title 
GO 
 
CREATE TRIGGER Delete_Title 
ON titles 
FOR DELETE 
AS 
DELETE   sales 
FROM     sales, deleted 
WHERE    sales.title_id = deleted.title_id 
PRINT    "Deleted from sales" 
DELETE   roysched 
FROM     roysched, deleted 
WHERE    roysched.title_id = deleted.title_id 
PRINT    "Deleted from roysched" 
DELETE   titleauthor 
FROM     titleauthor, deleted 
WHERE    titleauthor.title_id = deleted.title_id 
PRINT    "Deleted from titleauthor" 
GO

Чтобы проверить этот триггер, используйте оператор DELETE следующим образом:

DELETE     titles
WHERE      title_id = "PC1035"
GO

Если выполнить этот оператор DELETE, то произойдет активизация триггера (при условии, что вы удалили отмеченные выше ссылки на внешние ключи [FOREIGN KEY] ). Вы увидите сообщение с количеством затронутых строк для события модификации данных по таблице titles, после которого следуют сообщения, заданные в трех операторах PRINT из этого триггера, и сообщения о количестве затронутых строк в трех других таблицах; эти выходные сообщения показаны ниже:

(1 row(s) affected)
 
Deleted from sales 
 
(5 row(s) affected) 
 
Deleted from roysched 
 
(1 row(s) affected) 
Deleted from titleauthor 
 
(1 row(s) affected)

Еще одно применение таблицы deleted – это сохранение всех строк, удаленных из таблицы, в резервной таблице для последующего анализа данных. Например, чтобы сохранить строки, удаленные из таблицы roysched, в новой таблице с именем roysched_backup, используйте следующую программу:

USE pubs
GO
CREATE TABLE roysched_backup 
( 
       title_id          tid NOT NULL, 
       lorange           int NULL, 
       hirange           int NULL, 
       royalty           int NULL 
) 
 
CREATE TRIGGER tr_roysched_backup 
ON roysched 
FOR DELETE 
AS 
INSERT INTO roysched_backup SELECT * FROM deleted 
GO 
 
SELECT * FROM roysched_backup 
GO

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

Создание триггера типа INSERT

В этом примере мы создадим триггер типа INSERT (триггер, который активизируется при выполнении оператора INSERT ) по таблице sales. Этот триггер при вставке строки в таблицу sales будет модифицировать колонку ytd_sales в таблице titles добавляя в нее значение, которое было помещено в колонку qty таблицы sales. Этот триггер запрашивает таблицу inserted, чтобы получить значение qty, которое было помещено в таблицу sales. Мы включим в этот запрос оператор SELECT *, с помощью которого увидим, что содержит таблица inserted. Ниже приводится T-SQL-текст для этого триггера:

USE pubs
GO
IF EXISTS   (SELECT     name
                 FROM       sysobjects
                 WHERE      name = "Update_ytd_sales" AND
                              type = "TR")
DROP TRIGGER Update_ytd_sales
GO
CREATE TRIGGER Update_ytd_sales
ON sales
FOR INSERT
AS
SELECT   *
FROM       inserted
UPDATE     titles
SET          ytd_sales = ytd_sales + qty
FROM       inserted
WHERE      titles.title_id = inserted.title_id
GO

Отметим, что мы использовали в операторе UPDATE предложение FROM источник_для_таблицы (FROM inserted), чтобы указать, что значение qty должно поступать из таблицы inserted. Теперь выполним следующий оператор INSERT для просмотра результатов из этого триггера:

INSERT INTO sales VALUES(7066, 1, "March 7, 2000", 100, "Net 30",
"BU1111") 
GO

Вы увидите следующие результаты. В первом наборе результатов показана строка, выбранная из таблицы inserted, и второе сообщение "1 row(s) affected" получено из оператора UPDATE.

stor_id    ord_num     ord_date              qty    payterms      title_id
----------------------------------------------------------------------------------------
7066         1          2000-03-07 00:00:00.000       100    Net 30      BU1111

(1 row(s) affected)


(1 row(s) affected)
Создание триггера типа UPDATE

Теперь создадим UPDATE -триггер, который будет просматривать колонку price (цена) при модификации таблицы titles, чтобы убедиться, что цена книги не возросла более чем на 10 процентов. В противном случае будет использован оператор ROLLBACK, который выполнит откат данного триггера и оператора, вызвавшего триггер. Если триггер активизирован из транзакции, то произойдет откат всей транзакции. Таблицы deleted и inserted используются в данном примере для проверки изменения цены. Ниже приводится определение этого триггера:

USE pubs
GO
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = "Update_Price_Check" AND 
                              type = "TR") 
DROP TRIGGER Update_Price_Check  
GO 
 
CREATE TRIGGER Update_Price_Check 
ON titles 
FOR UPDATE 
AS 
DECLARE   @orig_price money, @new_price money 
SELECT      @orig_price = price from deleted 
PRINT       "orig price ="  
PRINT       CONVERT(varchar(6),@orig_price) 
SELECT      @new_price = price from inserted 
PRINT       "new price ="  
PRINT       CONVERT(varchar(6),@new_price) 
IF (@new_price > (@orig_price * 1.10)) 
BEGIN 
      PRINT "Rollback occurred" 
      ROLLBACK 
END 
ELSE  
PRINT "Price is OK" 
GO

Чтобы проверить этот триггер, выполните сначала следующие операторы, чтобы проверить текущую цену книги с идентификатором заголовка (title_id) BU1111:

SELECT   price
FROM     titles
WHERE    title_id = "BU1111" 
GO

Цена составляет $11.95. Теперь попробуем увеличить цену на 15 процентов с помощью следующих операторов:

UPDATE   titles
SET        price = price * 1.15
WHERE    title_id = "BU1111"
GO

Вы увидите следующие результаты:

orig price = (исходная цена)
11.95
new price =  (новая цена)
13.74
Rollback occurred (Произошел откат)

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

Теперь снова проверим цену, чтобы убедиться, что был выполнен откат этой модификации. Используйте следующий T-SQL-набор:

SELECT   price
FROM     titles
WHERE    title_id = "BU1111" 
GO

Цена снова стала равной $11.95, а это означает, что был выполнен откат модификации.

Теперь увеличим цену на 9 процентов и убедимся, что цена изменена. Для этой модификации используется следующий T-SQL-набор:

UPDATE   titles
SET        price = price * 1.09 
WHERE    title_id = "BU1111" 
GO 
 
SELECT   price 
FROM     titles 
WHERE    title_id = "BU1111" 
GO

Цена стала равной $13.03, и поскольку изменение составило меньше 10 процентов, то триггер не инициировал откат.

Создавая триггер UPDATE, вы можете задать, чтобы этот триггер выполнял определенные операторы только в случае модификации определенной колонки или колонок. Например, давайте снова создадим предыдущий триггер, но на этот раз будет использовать предложение IF UPDATE, чтобы указать, что триггер проверяет колонку price, только если была обновлена сама эта колонка:

USE pubs
GO
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = "Update_Price_Check" AND 
                              type = "TR") 
DROP TRIGGER Update_Price_Check  
GO 
 
CREATE TRIGGER Update_Price_Check 
ON titles 
FOR UPDATE 
AS 
IF UPDATE (price) 
BEGIN 
DECLARE   @orig_price money, @new_price money 
      SELECT      @orig_price = price 
      FROM        deleted 
      PRINT       "orig price ="  
      PRINT       CONVERT(varchar(6),@orig_price) 
      SELECT      @new_price = price 
      FROM        inserted 
      PRINT       "new price ="  
      PRINT CONVERT(varchar(6),@new_price) 
      IF (@new_price > (@orig_price * 1.10)) 
      BEGIN 
            PRINT "Rollback occurred" 
            ROLLBACK 
      END 
      ELSE  
      PRINT "Price is OK" 
END 
GO

Теперь в случае модификации одной или нескольких колонок в таблице titles, за исключением колонки price, триггер пропустит операторы между ключевыми словами BEGIN и END в операторе IF, т.е. фактически будет пропущен весь триггер.

Чтобы проверить этот триггер, выполните следующие операторы T-SQL, модифицирующие сумму продаж за год (значение в колонке ytd_sales) для книги со значением BU1111 в колонке title_id.

UPDATE   titles
SET        ytd_sales = 123
WHERE    title_id = "BU1111"
GO

Отметим, что в выходные результаты не будут включены никакие сообщения, указанные в операторах PRINT данного триггера. Сам триггер активизируется, так как мы модифицировали таблицу titles. Но поскольку была модифицирована колонка ytd_sales, а не колонка price, то результатом условия IF было значение FALSE. Поэтому операторы данного триггера не выполнялись. Этот метод препятствует тому, чтобы SQL Server обрабатывал ненужные операторы.

Создание триггера INSTEAD OF

Триггер INSTEAD OF позволяет вам управлять тем, что происходит, когда выполняются функции INSERT, UPDATE или DELETE. Триггер INSTEAD OF используется в первую очередь при модификации объединенного представления (union view). Обычно объединенные представления недоступны для модификации, поскольку SQL Server "не знает", какую базовую (underlying) таблицу или таблицы нужно модифицировать. Для обхода этой ситуации вы определяете по данному представлению триггер INSTEAD OF, позволяющий модифицировать базовые (underlying) таблицы. Рассмотрим один пример. Следующие операторы T-SQL создают представление под именем TitlesByAuthor со ссылкой на таблицы authors, titles и titleauthor. (О создании представлений см. лекцию 18.)

USE pubs
GO

CREATE   VIEW TitlesByAuthor
AS
SELECT   authors.au_id, authors.au_lname, titles.title
FROM     authors INNER JOIN
           titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN
    titles ON titleauthor.title_id = titles.title_id 
GO

Теперь после создания представления мы используем следующий набор T-SQL для вывода всех строк (они также показаны здесь), отвечающих критериям данного представления:

USE pubs
GO

SELECT *
FROM   TitlesByAuthor
GO

au_id             au_lname           title
————— ——————— —————————————————————
238-95-7766     Carson             But Is It User Friendly?
724-80-9391     MacFeather         Computer Phobic AND Non-Phobic Individuals:
756-30-7391     Karsen             Computer Phobic AND Non-Phobic Individuals:
267-41-2394     O’Leary            Cooking with Computers:
724-80-9391     MacFeather         Cooking with Computers: 
486-29-1786     Locksley           Emotional Security: A New Algorithm 
648-92-1872     Blotchet-Halls       Fifty Years in Buckingham Palace Kitchens
899-46-2035     Ringer             Is Anger the Enemy?
998-72-3567     Ringer             Is Anger the Enemy? 
998-72-3567     Ringer             Life Without Fear 
486-29-1786     Locksley           Net Etiquette 
807-91-6654     Panteley           Onions, Leeks, and Garlic: 
172-32-1176       White              Prolonged Data Deprivation: Four Case Studies
427-17-2319     Dull               Secrets of Silicon Valley
846-92-7186     Hunter             Secrets of Silicon Valley
712-45-1867     del Castillo       Silicon Valley Gastronomic Treats
274-80-9391     Straight           Straight Talk About Computers
267-41-2394     O’Leary            Sushi, Anyone?
472-27-2349     Gringlesby         Sushi, Anyone?
672-71-3249     Yokomoto           Sushi, Anyone?
213-46-8915     Green              The Busy Executive’s Database Guide
409-56-7008     Bennet             The Busy Executive’s Database Guide
722-51-5454     DeFrance           The Gourmet Microwave
899-46-2035     Ringer             The Gourmet Microwave
213-46-8915     Green              You Can Combat Computer Stress!


(25 row(s) affected)

Если вы попытаетесь удалить из этого представления строку, в которой значение колонки au_lname равно Carson, то появится следующее сообщение:

Server: Msg 4405, Level 16, State 1, Line 1 View or function 'TitlesByAuthor' is not updatable 
because the FROM clause names multiple tables. (Представление или 
функция 'TitlesByAuthor' недоступна для модифицирования, 
поскольку предложение FROM ссылается names на несколько таблиц)

Чтобы обойти эту ситуацию, мы создадим для операции удаления триггер INSTEAD OF. Следующий набор операторов T-SQL создает триггер INSTEAD OF с именем Delete_It:

Примечание. В следующем наборе операторов не происходит реального удаления строки из таблицы authors базы данных pubs. В целях данного примера здесь просто переименовывается строка.
USE pubs
GO
 
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = 'Delete_It' AND 
                              type = 'TR') 
DROP TRIGGER Delete_It 
GO 
 
CREATE TRIGGER Delete_It 
ON TitlesByAuthor 
INSTEAD OF DELETE 
AS 
PRINT       'Row from authors before deletion...' 
SELECT      au_id, au_lname, city, state 
FROM        authors 
WHERE       au_lname = 'Carson' 
PRINT       'Deleting row from authors...' 
UPDATE      authors 
SET           au_lname = 'DELETED' 
WHERE       au_lname = 'Carson' 
PRINT       'Verifying deletion...' 
SELECT      au_id, au_lname, city, state 
FROM        authors 
WHERE       au_lname = 'Carson' 
GO

И если теперь мы введем операторы для удаления строки Carson из этого представления, то произойдет активизация триггера INSTEAD OF и мы получим следующие выходные результаты:

Row from authors before deletion...  (Строка из authors перед удалением)
au_id           au_name             city          state
-----------------------------------------------------------------------------------
238-95-7766   Carson                Berkeley         CA

(1 row(s) affected)
Deleting row from authors...            (Удаление строки из authors)
(1 row(s) affected)
Verifying deletion...:                       (Проверка удаления)
au_id           au_name             city             state
-----------------------------------------------------------------------------------

(0 row(s) affected)
Использование триггеров AFTER

Как уже говорилось ранее в этой лекции, триггер AFTER – это просто триггер, который активизируется после завершения указанного события модификации данных. Если у вас определен по таблице более чем один триггер AFTER для определенного события или набора событий, то вы можете задать, какой триггер будет активизироваться первым и какой – последним. Любые другие триггеры, определенные по данной таблице для этого события или набора событий, будут активизироваться в случайном порядке. Первый и последний триггеры задаются с помощью оператора T-SQL sp_settriggerorder. Этот оператор имеет следующий синтаксис:

sp_settriggerorder   [@triggername =] 'имя_триггера',
                             [@order=] {'first' | 'last' | 'none'}

Рассмотрим один пример. Предположим, что у нас четыре триггера, определенных по таблице: MyTrigger, MyOtherTrigger, AnotherTrigger и YetAnotherTrigger. Мы хотим убедиться, что после запускающего события AnotherTrigger активизируется первым и MyTrigger активизируется последним. Мы вводим следующие операторы T-SQL:

sp_settriggerorder @triggername = 'AnotherTrigger', @order = 'first'
go
sp_settriggerorder @triggername = 'MyTrigger', @order = 'last'
go
sp_settriggerorder @triggername = 'MyOtherTrigger', @order = 'none'
go
sp_settriggerorder @triggername = 'YetAnotherTrigger', @order = 'none'
go

Обозначение "none" для MyOtherTrigger и YetAnotherTrigger указывает, что SQL Server должен активизировать эти триггеры случайным образом после активизации AnotherTrigger и до активизации MyTrigger. Поскольку этот случайный порядок активизации принят для триггеров по умолчанию, то вы не обязаны явно запускать оператор sp_settriggerorder для триггеров, которые запускаются случайным образом.

Использование вложенных триггеров

Вложенные триггеры – это триггеры, которые активизируются другими триггерами. Они отличаются от рекурсивных триггеров, которые активизируют сами себя. Вложенный триггер инициируется, когда событие модификации данных внутри другого триггера активизирует этот вложенный триггер. Как и в SQL Server 7, SQL Server 2000 допускает до 32 уровней вложенности триггеров. Один триггер активизирует второй триггер, который, в свою очередь, активизирует третий триггер, и т.д. вплоть до 32-го триггера. Использование вложенных триггеров разрешается в SQL Server 2000 по умолчанию. Вы можете указать, разрешается ли в SQL Server использование вложенных триггеров, задав соответствующий параметр конфигурации сервера для вложенных триггеров Например, чтобы блокировать использование вложенных триггеров, выполните следующую команду:

sp_configure "nested triggers", 0
GO

Значение 0 блокирует использование вложенных триггеров; значение 1 разрешает их использование. Рассмотрим пример использования вложенных триггеров. В этом примере мы создадим вложенные триггеры, которые будут выполнять каскадные удаления при удалении заголовка книги из таблицы titles. (См. раздел "Создание триггера типа DELETE" ранее.) Мы создали отдельный триггер, который выполняет эту операцию. Сначала мы удалим этот триггер, чтобы он не активизировался. Затем мы создадим три триггера. Второй и третий триггеры будут вложенными триггерами. Первый триггер будет активизировать второй триггер, который будет активизировать третий триггер. Вот эта программа:

USE pubs
GO 
IF EXISTS   (SELECT     name 
                 FROM       sysobjects 
                 WHERE      name = "Delete_Title" AND 
                              type = "TR") 
DROP TRIGGER Delete_Title 
GO 
 
CREATE TRIGGER TR_on_titles 
ON titles 
FOR DELETE 
AS 
DELETE   sales 
FROM     sales, deleted 
WHERE    sales.title_id = deleted.title_id 
PRINT    "Deleted from sales" 
GO 

CREATE TRIGGER TR_on_sales 
ON sales 
DELETE   roysched 
FROM     roysched, deleted 
WHERE    roysched.title_id = deleted.title_id 
PRINT    "Deleted from roysched" 
GO 
 
CREATE TRIGGER TR_on_roysched 
ON roysched 
DELETE   titleauthor 
FROM     titleauthor, deleted 
WHERE    titleauthor.title_id = deleted.title_id 
PRINT    "Deleted from titleauthor" 
GO

Для успешной работы этих триггеров вы должны удалить ограничения FOREIGN KEY по таблицам, указанным в этих триггерах (см. раздел "Создание триггера типа DELETE" ранее). Чтобы проверить, работают ли все эти триггеры, запустите следующий оператор DELETE:

DELETE
FROM     titles 
WHERE    title_id = "PS7777" 
GO

Вы увидите следующий набор результатов:

(2 row(s) affected)  

(1 row(s) affected)  

Deleted from titleauthor     (Удалено из titleauthor)

(2 row(s) affected)

Deleted from roysched    

(Удалено из roysched)

(1 row(s) affected)

Deleted from sales             (Удалено из sales)

(1 row(s) affected)

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

Использование Enterprise Manager

Чтобы создать триггер с помощью Enterprise Manager, вы просто вводите свои операторы T-SQL в окне Trigger Properties (Свойства триггера). Для использования этого метода выполните следующие шаги.

  1. В окне Enterprise Manager щелкните правой кнопкой мыши на имени таблицы, по которой вы хотите создать триггер. В появившемся контекстном меню укажите All Tasks (Все задачи) и затем выберите из подменю All Tasks пункт Manage Triggers (Управление триггерами). Появится окно Trigger Properties (рис. 22.1).

    Окно Trigger Properties (Свойства триггера)


    Рис. 22.1.  Окно Trigger Properties (Свойства триггера)

  2. Введите в окне Text предложения T-SQL для вашего триггера. На рис. 22.2 показано окно Trigger Properties, содержащее T-SQL-текст триггера с именем Print_Update.

     Окно Trigger Properties с текстом триггера


    Рис. 22.2.  Окно Trigger Properties с текстом триггера

  3. Щелкните на кнопке Check Syntax (Проверить синтаксис) для проверки синтаксиса. При отсутствии синтаксических ошибок появится диалоговое окно, показанное на рис. 22.3. В противном случае внесите необходимые исправления. Щелкните на кнопке Apply (Применить), чтобы создать данный триггер. Имя нового триггера теперь появится в раскрывающемся списке Name (Имя). На рис. 22.4 показан список с включенным в него именем вашего нового триггера.

     Диалоговое окно с сообщением об успешном завершении синтаксической проверки


    Рис. 22.3.  Диалоговое окно с сообщением об успешном завершении синтаксической проверки

  4. Окно Trigger Properties остается открытым, что позволяет вам создавать новые триггеры по данной таблице. Если вам не нужно создавать новые триггеры, щелкните на кнопке Close (Закрыть).

    Имя нового триггера в раскрывающемся списке Name


    Рис. 22.4.  Имя нового триггера в раскрывающемся списке Name

Управление триггерами

Теперь, когда вы знаете, как создавать триггер, вам надо научиться управлять триггерами. В этом разделе мы рассмотрим сначала управления триггерами с помощью команд T-SQL, а затем – управление с помощью Enterprise Manager.

Управление триггерами с помощью операторов T-SQL

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

Просмотр текста триггера

Информацию о триггерах можно получить с помощью двух системных хранимых процедур: sp_helptext и sp_helptrigger. Процедура sp_helptext, после которой указывается имя триггера, используется для вывода на экран текста, который использовался для создания этого триггера. Например, для просмотра определения созданного ранее триггера Print_Update используйте следующий оператор:

USE MyDB
GO
sp_helptext Print_Update
GO

Результаты выглядят следующим образом:

Text 
-------------------------------------------------
CREATE TRIGGER Print_Update 
ON Bicycle_Inventory 
FOR UPDATE 
AS 
PRINT "The Bicycle Inventory table was updated."
Просмотр триггеров, имеющихся по какой-либо таблице

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

USE MyDB
GO 
sp_helptrigger MyTable 
GO

Ниже приводятся результаты:

trigger_name     trigger_owner   isupdate     isdelete  isinsert   isafter   isinsteadof
-----------------------------------------------------------------------------------------------
Print_Update      dbo            1             0          0          1         0
 
(1 row affected)

В результатах показано имя триггера, владелец триггера и тип события модификации данных (или типы событий), активизирующего данный триггер.

Результирующие колонки isupdate, isdelete, isinsert, isafter и isinsteadof содержат значение 1, если триггер активизируется событием модификации данных, которое указано именем колонки, или 0 в противном случае. Если триггер активизируется более чем одним типом событий модификации данных, то значение 1 может быть в нескольких колонках.

Использование оператора ALTER TRIGGER

Чтобы изменить определение триггера, вы можете удалить и заново создать соответствующий триггер или использовать оператор ALTER TRIGGER. Для этого оператора используется тот же синтаксис, что и для оператора CREATE TRIGGER. Если вы модифицируете триггер, то должны переопределить весь этот триггер. Например, для изменения триггера Print_Update, чтобы он активизировался при выполнении операторов INSERT или UPDATE, которые влияют на таблицу Bicycle_Inventory, используйте следующий текст:

USE MyDB
GO
ALTER TRIGGER Print_Update 
ON Bicycle_Inventory 
FOR UPDATE, INSERT 
AS 
PRINT "Bicycle_Inventory was updated or a row was inserted" 
GO

Теперь старая версия данного триггера не существует; она заменена новой версией. Теперь этот триггер будет активизироваться при изменениях в Bicycle_Inventory и при вставке строк в эту таблицу. Ниже показаны примеры операторов, используемых для выполнения этих операций:

INSERT   INTO Bicycle_Inventory VALUES ("Trek",1,"Lance S.E.",1,0,1)
GO

UPDATE   Bicycle_Inventory
SET        in_stock = 1
WHERE    model_name = "Lance S.E."
GO
Использование оператора DROP TRIGGER

Для удаления триггера из таблицы используйте оператор DROP TRIGGER. Вы можете удалить триггер, который вам больше не нужен. Этот оператор имеет следующий синтаксис:

DROP TRIGGER имя_триггера
Чтобы удалить триггер Print_Update, используйте следующий оператор:
USE Bicycle_Inventory
GO 
DROP TRIGGER Print_Update 
GO

Теперь при попытке увидеть существующие триггеры по таблице MyTable (с помощью следующих операторов T-SQL) вы увидите, что нет ни одного триггера:

USE MyDB
GO 
sp_helptrigger MyTable 
GO
Примечание. Если вы удаляете таблицу, то при этом автоматически удаляются все триггеры по данной таблице.
Блокирование (disabling) и разблокирование (enabling) триггеров

Вы можете использовать оператор ALTER TABLE для разблокирования и блокирования триггера без удаления определения этого триггера из таблицы. Поскольку каждый триггер создается по определенной таблице, то мы используем оператор ALTER TABLE вместо оператора ALTER TRIGGER. Создадим триггер из первого примера этой лекции, чтобы использовать его в следующем примере:

USE MyDB
GO
IF EXISTS   (SELECT     name
                 FROM       sysobjects
                 WHERE     name = "Print_Update" AND
                             type = "TR")
DROP TRIGGER Print_Update
GO

CREATE TRIGGER Print_Update
ON Bicycle_Inventory
FOR UPDATE
AS
PRINT "Bicycle_Inventory table was updated"
GO

В момент создания этот триггер автоматически становится доступен для активизации (он разблокирован). Чтобы блокировать активизацию этого триггера (до момента, когда будет снова задано разблокирование) с сохранением определения этого триггера в соответствующей таблице, используйте опцию DISABLE TRIGGER, как это показано ниже:

ALTER TABLE Bicycle_Inventory
DISABLE TRIGGER Print_Update 
GO

Теперь после этого изменения в таблице Bicycle_Inventory триггер Print_Update не будет активизироваться, пока не будет явно задано разблокирование с помощью опции ENABLE TRIGGER, как это показано ниже:

ALTER TABLE Bicycle_Inventory
ENABLE TRIGGER Print_Update
GO

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

Управление триггерами с помощью Enterprise Manager

Используя Enterprise Manager, вы можете управлять вашими триггерами с помощью графического интерфейса. Но вам по-прежнему нужно знать, как создаются программы на языке T-SQL.

Удаление триггера

Чтобы удалить триггер с помощью Enterprise Manager, выполните следующие шаги.

  1. Откройте окно Trigger Properties, щелкнув правой кнопкой мыши на имени таблицы, указав в контекстном меню All Tasks и выбрав пункт Manage Triggers из подменю All Tasks.
  2. В окне Trigger Properties выберите имя данного триггера из раскрывающегося списка Name и щелкните на кнопке Delete (Удалить).
  3. Появится диалоговое окно подтверждения (рис. 22.5). Щелкните на кнопке Yes (Да), чтобы удалить выбранный вами триггер.

    Диалоговое окно, в котором вы подтверждаете удаление триггера


    Рис. 22.5.  Диалоговое окно, в котором вы подтверждаете удаление триггера

Модифицирование триггера

Чтобы модифицировать триггер с помощью Enterprise Manager, выполните следующие шаги.

  1. Откройте окно Trigger Properties, щелкнув правой кнопкой мыши на имени таблицы, указав в контекстном меню All Tasks и выбрав пункт Manage Triggers из подменю All Tasks.
  2. Выберите имя данного триггера из раскрывающегося списка Name.
  3. Отредактируйте текст T-SQL в окне Text. Для отступов в тексте используйте клавиши Ctrl+Tab. Вы можете использовать оператор CREATE TRIGGER или ALTER TRIGGER. В обоих случаях SQL Server удалит существующий триггер и создаст его заново. Вы можете даже использовать оператор CREATE TRIGGER, указав после него имя существующего триггера. Вы не получите сообщения об ошибке, которое возникло бы при использовании интерактивных OSQL или ISQL. Закончив редактирование, щелкните на кнопке Apply. После SQL Server автоматически модифицирует определение данного триггера.

Заключение

В этой лекции вы ознакомились со специальным типом хранимых процедур, который называется триггером, и узнали о пяти типах триггеров, которые могут быть созданы по определенной таблице: INSERT, UPDATE, DELETE, AFTER и INSTEAD OF. Вы также узнали, как создавать и модифицировать эти триггеры с помощью операторов T-SQL и Enterprise Manager. В лекции 23 вы узнаете, как осуществлять доступ к SQL Server 2000 из Internet с помощью таких технологий, как ADO и XML.

Лекция 23. Доступ к Microsoft SQL Server 2000 из Internet

Все большее распространение сети Internet заставило разработчиков SQL Server встроить специальные функции в SQL Server 2000 для работы с базой данных в сети посредством операционной системы Windows 2000 и службы IIS5. Обзор применения технологий ISAPI и XML для работы в сети позволит вам самостоятельно решить, какие настройки и функциональность требуется для продуктивной работы.

Появление Microsoft SQL Server 2000 на платформе операционной системы Microsoft Windows 2000 упростило публикацию баз данных SQL Server в Internet. Сочетание Windows 2000 и Microsoft Internet Information Server (IIS) 5 образует обширный массив компонентов и интерфейсов, которые можно использовать для связи и взаимодействия с вашими базами данных SQL Server 2000. Эта лекция знакомит вас с базовыми концепциями доступа к Microsoft SQL Server из Internet с использованием разнообразных методов. Поскольку эта книга не является руководством по разработке, в данной лекции дается лишь обзор различных методов доступа. Выпущено много хороших книг, из которых вы можете получить информацию об особенностях программирования.

Эта лекция начинается с описания концепций программирования для Internet и используемых по умолчанию интерфейсов программирования для Internet, доступных в среде Microsoft Windows 2000. Вы ознакомитесь с основами ODBC-программирования и с ADO. Вы также ознакомитесь с ISAPI и ASP как средствами доступа к SQL Server. И, наконец, вы ознакомитесь с языком XML, узнаете, что это такое, и как его использовать. Эта лекция охватывает много тем, но она поможет вам понять работу базовых инструментов программирования для Internet.

Концепции программирования для Internet

В этом разделе вы ознакомитесь с основами подсоединения к SQL Server приложений, снабженных средствами Internet. Эти приложения содержат два различных интерфейса, причем необходимы оба интерфейса, поскольку они выполняют различные задачи: это интерфейс для пользователя и интерфейс для SQL Server. Данный раздел знакомит вас с возможностями соединения между приложением и SQL Server, и в нем рассматриваются методы соединения с помощью служб IIS и механизма ODBC.

Использование Windows 2000 и IIS 5 как платформы для Internet

Используя Windows 2000 IIS 5 как платформу для Internet-приложений, разработчики получают непревзойденные средства доступа к возможностям SQL Server. Разработчики могут использовать такие возможности, как сценарии выполняемые на сервере (server-side scripting) с интегрированным доступом к базам данных, источники данных открытого интерфейса доступа к базам данных, OLE DB (обширный набор интерфейсов модели компонентных объектов [COM] для универсального доступа к данным) и архитектура Web-приложений, известная под названием ISAPI (Internet Server API – интерфейс прикладного программирования Internet-сервера) (сильный "конкурент" традиционных приложений на основе общего шлюзового интерфейса CGI [Common Gateway Interface]).

Использование источников данных ODBC

ODBC, несомненно, является наиболее предпочтительным интерфейсом баз данных для платформы Microsoft Windows. Используя ODBC, разработчики могут получать доступ к широкому спектру разнородных источников данных, начиная с простых текстовых файлов, электронных таблиц Microsoft Excel и до баз данных Microsoft Access и SQL Server. ODBC обеспечивает общедоступный и при этом мощный уровень абстрагирования для программиста баз данных.

Разработка Internet-приложений с использованием SQL Server не является исключением. Источники данных ODBC являются главным средством доступа к базам данных SQL Server через Web-серверы. Они осуществляют это с помощью набора COM-объектов OLE DB, которые называют объектами данных ActiveX (ADO). ADO обеспечивает объектно-ориентированный интерфейсный доступ в источники данных ODBC, что является более простым методом, чем использование интерфейса API ODBC C. Используя ADO, разработчики могут реализовать простые объекты, представляющие соединения с базой данных, команды (такие как операторы SQL или хранимые процедуры) и наборы записей, аналогичные курсорам клиента и обладающие в значительной степени такими же функциональными возможностями, как курсоры баз данных сервера. Все эти объекты и интерфейсы баз данных делают Internet-разработку с помощью SQL Server почти тривиальной, обеспечивая при этом некоторые из более сильных возможностей, доступных в ODBC, такие как организация пула соединений (связного пула).

Наиболее важным аспектом Web-приложения на основе ODBC является надлежащее использование пула соединений. Организация пулов соединений позволяет приложению среднего звена поддерживать и использовать разделяемым образом соединения с базами данных SQL Server. Разделяемые (совместно используемые) соединения остаются открытыми в течение заданного периода времени и доступными для разделяемого использования пользователями. Установление соединений часто является операцией с интенсивным использованием ресурсов и может налагать большую дополнительную нагрузку на сервер базы данных. Поскольку Web-серверы и связанные с ними Internet-приложения обрабатывают большой объем трафика, то установление и, что еще более важно, – повторное установление соединений следует минимизировать с помощью пула соединений базы данных. Это позволит сократить время соединений для пользователей и снизит дополнительную нагрузку на ресурсы сервера баз данных. По умолчанию служба IIS 5 активизирует пул соединений с базами данных.

Примечание. При использовании источников данных ODBC и ADO вам следует использовать объекты соединений ADO на страничной основе. Создавая объекты соединений, только когда это требуется для страницы и освобождая их, когда они больше не нужны (в отличие от использования объекта для всего сеанса пользователя) соединение с базой данных можно возвращать в пул быстрее для использования другим соединением. Тем самым радикально снижается время ожидания соединения пользователями вашего Internet-приложения.
Выбор сетевой библиотеки

Хотя SQL Server поддерживает сетевые библиотеки, такие как named pipes (именованные каналы) и Banyan Vines, вам следует при развертывании базы данных SQL Server в Internet использовать в качестве сетевой библиотеки TCP/IP. TCP/IP обеспечивает гибкое использование сети и самую быструю возможность соединений при максимальной производительности среди всех сетевых библиотек в SQL Server. (О сетевых библиотеках см. лекцию 11.)

Используя в качестве сетевой библиотеки TCP/IP, вы ограничены использованием стандартного метода обеспечения безопасности как метода безопасности SQL Server. В этом методе для аутентификации используется учетная запись подключения (login-запись) SQL Server. Использование интегрированной системы безопасности, которая не поддерживается TCP/IP и в которой для аутентификации используются учетные записи Windows, обеспечивает более надежную защиту, и можно доказать, что эта система является наиболее эффективным средством поддержки централизованного управления учетными записями на предприятии. Однако по ряду причин использование интегрированной системы безопасности может приводить к снижению производительности*.

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

Во-вторых, соединения, базирующиеся на сетевой библиотеке named pipes (именованные каналы), наиболее часто используемой с интегрированной системой безопасности, обычно имеют низкую скорость. Кроме того, использование библиотеки named pipes создает проблемы для пулов соединений. Вы можете использовать пулы соединений в сочетании с named pipes путем использования учетной записи Anonymous как допустимого входа в SQL Server, но в большинстве реализаций для создания отдельных соединений с SQL Server используется аутентификация с запросом/подтверждением или базовая аутентификация. Это фактически сводит на нет любые улучшения производительности, которые могут быть получены с помощью пула соединений.

Если SQL Server инсталлируется на машине, отличной от Web-сервера, то использование интегрированной системы безопасности также ограничивает доступные возможности аутентификации. В этом случае нельзя использовать аутентификацию с запросом/подтверждением, и остаются только варианты базовой аутентификации и анонимной аутентификации. Анонимная аутентификация для системы, которая защищена каким-либо иным образом в Internet, обычно не рекомендуется, и, как уже отмечалось, использование базовой аутентификации ограничивает преимущества организации пула соединений.

Использование ISAPI для доступа к SQL Server

ISAPI – это набор вызовов функций, предназначенных для того, чтобы снабдить разработчиков Internet-приложений мощным методом расширения функциональных возможностей IIS. Приложения ISAPI показывают очень высокую производительность и позволяет осуществлять низкоуровневое управление. Фактически приложения ISAPI могут работать лучше других существующих Web-приложений для IIS. Кроме того, используя ISAPI, разработчик получает доступ ко всему массиву функций Win32 API.

Приложения ISAPI реализуются как динамически подключаемые библиотеки (DLL), которые поставляются в двух формах: расширения и фильтры. Поскольку библиотеки DLL – это обычно откомпилированные программные компоненты для данного типа машины, они выполняются намного быстрее, чем любая интерпретируемая программа или сценарий. Если высокая производительность и масштабируемость являются важными факторами вашего Internet-приложения (в ущерб простоте программирования и модифицирования), то расширение или фильтр ISAPI наиболее подходят для этой цели. В следующих двух разделах подробно описываются расширения и фильтры ISAPI, а в следующем за ними разделе рассматриваются ограничения программирования и использование приложений ISAPI.

Расширения ISAPI

Расширения ISAPI реализуются как библиотеки DLL и загружаются либо в пространство процесса IIS, либо в пространство отдельного процесса. У вас имеется этот выбор для каждого расширения ISAPI, которое вы индексируете на вашем Web-сервере. Если стабильность приложений является важным фактором, то расширения следует загружать в пространство отдельного процесса, чтобы ошибка расширения ISAPI не привела к аварийному отказу всего сервера (что возможно в случае экспериментальных или непроверенных расширений ISAPI).

Для обращения к расширению ISAPI используется виртуальный адрес .dll-файла в URL. Пример: http://www.mydomain.com/SampleISAPI.dll.

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

Фильтры ISAPI

Фильтры ISAPI также реализуются как библиотеки DLL, но они загружаются в пространство процесса IIS, когда происходит запуск Web-сервера, и остаются в памяти, пока он не будет закрыт. Фильтры ISAPI можно сконфигурировать для получения любого количества уведомлений о событиях фильтра (filter event notifications), возникающих для каждого запроса протокола HTTP (протокола гипертекстовой передачи), который обрабатывается IIS, и для каждого HTTP-ответа, который генерируется IIS. При загрузке фильтра ISAPI он сообщает IIS (посредством специальной передаваемой структуры), о каких типах событий следует оповещать фильтр. При возникновении такого события уведомление об этом событии передается на каждый фильтр ISAPI, который зарегистрировал свою "заинтересованность" в этом событии.

Фильтры ISAPI являются довольно мощным средством и могут быть использованы для реализации сжатия или шифрования данных, нестандартной аутентификации, регистрации и анализа Web-трафика и даже сценарных механизмов на сервере (server-side scripting engines). Вы можете создать фильтр ISAPI, который просматривает каждый набор Web-страниц, который должен быть доставлен клиенту, ищет специальные теги разметки и действует в соответствии с этими инструкциями подобно тому, как это делает ASP-страница.

Способность проверки и модифицирования каждого входного и выходного потока данных делает фильтры ISAPI мощным и гибким средством. Однако слишком интенсивное использование фильтров ISAPI приводит к резкому снижению общей производительности и масштабируемости сайта. Например, при фильтрации каждой входной и выходной страницы это может стать слишком большой нагрузкой, чтобы с ней могла справляться система, поскольку это требует передачи большого объема дополнительной информации. Следует уделять огромное внимание тому, чтобы свести к минимуму объем работы, выполняемой фильтрами ISAPI. Например, в заказной схеме шифрования фильтр должен выполнять шифрование, а IIS должна выполнять обмен данными с клиентом. Это позволяет снизить количество задач, которые должен выполнять данный фильтр ISAPI.

Ограничения ISAPI

Технология ISAPI может обеспечивать наиболее высокую производительность, но она имеет некоторые недостатки. Для разработки расширений и фильтров ISAPI требуется больше времени, чем для разработки сценарных страниц, поскольку расширения и фильтры ISAPI обычно пишутся на C или C++, и по этой же причине возрастают трудности сопровождения. Для перехода на расширение или фильтр ISAPI требуется повторная компиляция всего приложения, а не просто замена какого-либо одного файла. Хотя расширения и фильтры ISAPI обычно работают быстрее, чем их сценарные аналоги на сервере, они не дают абсолютной гарантии полной масштабируемости. И наконец, определенные абстракции программирования, которые считают очевидными большинство разработчиков сценариев для сервера (в особенности сеансовый объект – session object), почему-то отсутствуют в ISAPI-программировании. ISAPI-программирование происходит на существенно более низком уровне, чем создание сценариев на сервере.

Использование ASP для доступа к SQL Server

ASP – это среда сценариев для сервера, которую могут использовать разработчики для создания интерактивных динамических Web-страниц, используемых для создания мощных Web-приложений. ASP-файл – это текстовый файл с расширением имени .asp, который может содержать любое сочетание текста, тегов HTML и сценариев для сервера. Хотя ASP используются исключительно для сервера, разработчики могут включать сценарий для клиентской стороны со своим HTML-текстом, который обрабатывается не Web-сервером, а клиентским браузером.

Если Web-сервер получает запрос на ASP-файл, то он обрабатывает сценарии для сервера, содержащиеся в специальных тегах этого файла, для создания Web-страницы. В результате получается чисто HTML-файл, который также может включать сценарные компоненты для клиентской стороны. Этот файл передается затем клиентскому браузеру. Клиентский браузер воспроизводит эти компоненты на экране. Ничего из исходного текста ASP не передается клиенту. Весь синтаксический разбор и структурирование выполняются на сервере. Пользователи не могут увидеть команды сценария, с помощью которых была создана страница, представленная на их экране.

Кроме сценариев для сервера ASP-файлы могут содержать вызовы COM-компонентов, которые выполняют множество задач, включая доступ к базам данных, и реализуют объекты бизнес-логики (деловых правил), которые могут совместно использоваться в нескольких средствах разработки.

Технология ASP нейтральна в языковом смысле. Разработчики, имеющие опыт работы с такими языками, как Microsoft Visual Basic Scripting Edition (VBScript), Microsoft JScript или Perl, обнаружат много знакомого в разработке ASP-файлов. В ASP-страницах может использоваться язык сценариев, для которого Web-сервер имеет инсталлированный совместимый с COM механизм обработки сценариев. Механизм (машина) обработки сценариев – это программа, обрабатывающая команды, написанные на определенном языке. В IIS включены механизмы обработки сценариев для популярных языков VBScript (основывается на Visual Basic) и JScript (реализация Microsoft для спецификации языка 262 Европейской ассоциации производителей компьютеров [ECMA]). Механизмы сценариев для популярных языков, таких как Perl, можно получить от независимых поставщиков.

ASP имеет ряд преимуществ по сравнению с традиционными CGI-приложениями. Как уже говорилось, разработчикам, уже знакомым с VBScript или JScript, не нужно изучать новый язык, такой как C или Perl. ASP содержит расширенные функциональные возможности, включающие объекты для сеансов пользователей, запросов и ответов, что намного упрощает разработку индивидуализированного содержания. Кроме того, при обработке и сборе информации HTML-форм и ее сохранении в базе данных для ASP-файла требуется намного меньше времени и объема программирования, чем для полного CGI-приложения, написанного и откомпилированного на языке C. А поскольку весь текст ASP непосредственно встраивается в HTML-документ, это увеличивает удобство сопровождения.

Использование XML для доступа к SQL Server

"XML" – это сокращение от "Extensible Markup Language" (расширяемый язык разметки), но на самом деле XML – это не язык. Это, скорее, система определения других языков и общего синтаксиса для выражения структуры данных. В отличие от языка HTML, который является языком разметки, используемым строго для описания того, как будет представлен Web-документ, XML описывает содержание и структуру документа. Структурированные данные – это данные, которые размечены для своего содержимого или использования.

XML является расширяемым по своей сути. Разработчики используют XML для определения данных внутри Web-страниц, а уровень детализации определяется только потребностями самого разработчика. Например, разработчик будет использовать теги <AUTHOR> (автор) или <TITLE> (заголовок) для описания информации о книгах и публикациях. Если требуются дополнительные определения, то разработчик может добавить теги <RETAILPRICE> (розничная цена), <PUBLISHER (издательство) или даже <ISBN> (стандартный международный код книги).

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

Поскольку XML не описывает представление на экране, то XML-документ можно написать один раз и затем выводить его разнообразными способами с использованием различных устройств: через Web-браузер, сотовый телефон, на дисплеях, используемых в автомобилях, и т.д. Каждое из этих устройств может иметь свои требования к отображению: монитор компьютера может выводить изображение с разрешением 800 x 600 пикселов, в то время как беспроводное Internet-устройство – только 200 x 200 пикселов. Так как XML определяет только структуру и содержание документа, то каждое устройство может визуализировать версию документа, адаптируемую к своему дисплею с помощью собственного интегрированного браузера. В отличие от HTML-документов XML-документы могут еще долго применяться после того, как устареют технологии разработки и визуализации, использовавшиеся в период написания этих XML-документов.

Реальным преимуществом XML является способность взаимодействия с объектной моделью документов (DOM) – интерфейсом, который определяет механизмы доступа к данным в документе. Используя DOM, разработчики могут писать сценарии динамического содержимого в стандартизованной форме. Например, разработчики могут использовать модель DOM, чтобы определенная часть содержимого формировалась определенным образом. С помощью этого метода можно реализовать небольшие эффекты, такие как добавление части текста, например заголовка книги, в тег XML с именем <TITLE>, который изменяет цвета, когда устройство указания пользователя перемещается вокруг него, и является гиперссылкой на онлайновый книжный магазин. Получение таких эффектов является в настоящее время не слишком простой задачей при использовании специализированных моделей DOM и спецификаций страниц стилей, однако новые стандарты DOM от консорциума World Wide Web (W3C) помогут разработчикам XML поддерживать настоящую независимость от используемых платформ.

Кроме того, XML быстро становится стандартом обмена данными и документами. XML используется для обмена данными между разнородными системами баз данных в Internet. Например, поставщик компонентов для автомобилей может использовать XML для обмена данными о запасах с производителем автомобилей, даже если они используют совершенно различные системы баз данных на двух различных платформах. А поскольку XML описывает, как структурированы данные, то он может связывать без каких-либо проблем две несовместимые иным образом системы.

Заключение

В этой лекции вы ознакомились с основами разработки Internet-приложений при использовании SQL Server и IIS 5 на платформе операционной системы Windows 2000. Существует широкий диапазон средств разработки – от сред разработки сценариев, таких как ASP, до использования откомпилированных продуктов, таких как расширения и фильтры ISAPI. Каждый из этих вариантов имеет свои преимущества и недостатки. Выбирая инструментарий для разработки вашего полномасштабного Internet-приложения, тщательно проанализируйте компромиссы каждого варианта, чтобы избежать последующих проблем.

Лекция 24. Загрузка базы данных

Если предприятие работает достаточно долго, то, наверняка, создалась огромная база данных результатов работы. Возможно даже, что она была создана в отличных от SQL Server системах. Но, решив переходить на SQL Server 2000, вы столкнетесь с проблемой перенесения базы данных из прошлой системы в новую. Понять принципы загрузки базы данных в SQL Server, самостоятельно осуществлять массовое копирование с помощью BCP, обеспечивать целостность данных вы сможете, изучив данный материал.

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

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

Каждый из этих методов обладает различными возможностями и характеристиками. Вы обязательно найдете хотя бы один метод, отвечающий вашим требованиям.

Примечание. Восстановление базы данных из файла резервной копии можно также рассматривать как форму загрузки в базу данных, но поскольку резервное копирование и восстановление описываются в главах 32 и 33, эти темы здесь не рассматриваются. Определенные параметры конфигурирования базы данных являются общими для программы BCP и для оператора BULK INSERT. Эти параметры базы данных определяют, как выполняется массовое копирование. Эти параметры должны быть заданы до начала операций загрузки данных.

Для вас могут оказаться полезными следующие дополнительные операции:

Производительность операций загрузки

В этом разделе мы рассмотрим три параметра конфигурирования, которые обычно используются для повышения производительности операций загрузки. Два из этих трех параметров влияют на журнальное протоколирование во время операций массового копирования и третий параметр влияет на блокировку. Массовое копирование – это операция, при которой данные копируются большими порциями; копирование данных большими порциями является наиболее эффективным способом для воспроизведения данных.

Параметры журнального протоколирования

SQL Server использует достаточно сложный механизм протоколирования, чтобы исключить потери данных в случае отказа системы. Журнальное протоколирование имеет важное значение для целостности данных в системе, но оно может существенно увеличивать нагрузку на систему. Вы можете снижать эту нагрузку за счет уменьшения количества протоколируемых данных во время массовых загрузок.

Примечание.. После отказа системы SQL Server восстановит базу данных. Для всех транзакций, которые не были фиксированы на момент отказа, будет выполнен откат (отмена). Все транзакции, которые были фиксированы на момент отказа, будут повторно выполнены (восстановлены). Откат и повторное выполнение транзакций возвратят систему в состояние, в котором она находилась перед отказом. (О резервном копировании и восстановлении см. главы 32 и 33.)

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

Полное протоколирование этих операций массового копирования отключается при выполнении всех следующих условий:

Еще один параметр базы данных – trunc. log on chkpt – отключает сохранение журнальных записей, когда для этого параметра задано значение TRUE. В этом случае происходит усечение журнала транзакций каждый раз, как встречается контрольная точка. Это повышает производительность массового копирования, но означает, что вы не получите ни повторного выполнения, ни отката в случае отказа системы.

Внимание. Если вы активизируете параметр trunc. log on chkpt (задав для него значение TRUE ), то вам следует делать это, только если вы первоначально загрузили данные в базу данных. Полное отключение протоколирования влияет на всю базу данных и может сделать систему невосстанавливаемой. Таким образом, этот параметр никогда не следует использовать в производственной системе при обычных операциях, когда восстановление важно для системы. Если вы все-таки задали значение TRUE для параметра trunc. log on chkpt, не забудьте отключить его, когда закончите операцию массовой загрузки.

Чтобы задать этот параметр с помощью хранимой процедуры, используйте sp_dboption со следующими параметрами:

exec sp_dboption имя_базы_данных, "trunc. log on chkpt", TRUE
Примечание. Вы можете задать дополнительные параметры во вкладке Options (Параметры) окна Properties (Свойства) базы данных(рис. 24.1). Флажок Restrict Access (Ограничить доступ) ограничивает доступ определенными ролями или одним пользователем. Флажок Read Only (Только чтение) запрещает доступ к базе данных по записи. Флажок ANSI NULL Default (Значение NULL по умолчанию) указывает, какое значение задается для колонок, допускающих пустые значения, – NULL или NOT NULL. Флажок Recursive Triggers (Рекурсивные триггеры) просто разрешает рекурсивную активизацию триггеров. Флажок Auto Update Statistics (Автоматическое обновление статистики) разрешает SQL Server обновлять любую устаревшую статистику во время оптимизации. Флажок Torn Page Detection (Обнаружение дефектных страниц) разрешает удалять незавершенные страницы. Флажок Auto Close (Автоматическое закрытие) указывает, что база данных будет закрыта после освобождения всех ее ресурсов и отсоединения всех пользователей. Флажок Auto Shrink (Автоматическое сжатие) указывает, что SQL Server будет периодически сжимать файлы базы данных. Флажок Auto Create Statistics (Автоматическое создание статистики) разрешает SQL Server автоматически создавать статистику во время оптимизации. И флажок Use Quoted Identifiers (Использование идентификаторов в кавычках) активизирует правила ANSI по использованию кавычек.

 Вкладка Options (Параметры) окна Properties (Свойства) базы данных


Рис. 24.1.  Вкладка Options (Параметры) окна Properties (Свойства) базы данных

Параметр блокировки

Вы можете также повысить производительность массового копирования путем активизации параметра table lock on bulk load (блокировка таблицы при массовой загрузке). Этот параметр позволяет вам использовать для операции массового копирования одну табличную блокировку вместо нескольких блокировок по строкам. Значение параметра table lock on bulk load задается с помощью хранимой процедуры sp_tableoption со следующими параметрами:

exec sp_tableoption "имя_таблицы", "table lock on bulk load", TRUE

(Не забудьте восстановить в исходное состояние параметр trunc. log on chkpt после завершения загрузки.) Поскольку параметр table lock on bulk load влияет на режим блокировки данной таблицы только во время массовой загрузки, то если вы не выполняете массовую загрузку, никакого ухудшения производительности не происходит.

Примечание. Чтобы использовать преимущества параметра table lock on bulk loadv, вы должны использовать подсказку TABLOCK.

Программа массового копирования (BCP)

С помощью BCP вы можете выполнять копирование из файла данных в SQL Server или из SQL Server в файл данных. BCP полезна для передачи данных в SQL Server из других баз данных, а также для передачи данных, создаваемых пользователем. В этом разделе вы узнаете об использовании программы BCP и ее параметров, а также о форматировании данных, чтобы их можно было копировать с помощью BCP в SQL Server и из SQL Server.

Синтаксис BCP

BCP – это исполняемая из командной строки программа, которая вызывается из окна приглашения на ввод команды (окна командной строки). Для BCP требуется указывать определенные обязательные параметры, и вы можете использовать с этой программой много дополнительных (необязательных) параметров. Ниже приводится формат команды BCP. (Указаны все обязательные и необязательные параметры.)

bcp    {[[имя_базы_данных.][владелец].]{имя_таблицы | имя_представления} | "запрос"}
       {in | out | queryout | format} файл_данных
       [-m максимум_ошибок] [-f форматный_файл] [-e файл_ошибок]
       [-F первая_строка] [-L последняя_строка] [-b размер_группы]
       [-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6]
       [-q] [-C кодовая_страница] [-t ограничитель_полей] [-r разделитель_строк]
       [-i входной_файл] [-o выходной_файл] [-a размер_пакета]
       [-S имя_сервера[\имя_экземпляра]] [-U login_id] [-P пароль]
       [-T] [-v] [-R] [-k] [-E] [-h "подсказка [,...n]"]
Обязательные параметры

Обязательные параметры указывают, в частности, местоположение для извлечения данных и местоположение для вставки данных. Как уже говорилось, с помощью BCP вы можете извлекать данные из файла данных и помещать их таблицу (или представление) SQL Server или извлекать данные из таблицы (или представления) и помещать их в файл данных.

Вы можете указывать таблицу или представление, используемые в операции массового копирования, одним из двух способов. Во-первых, вы можете использовать параметр определение_таблицы/представления. Самое простое определение состоит из имени таблицы или представления. Как показано выше в формате этой команды, вы можете задавать имя базы данных, где находится указанная таблица или представление, и/или владельца таблицы или представления. Если имя базы данных не указано, то это принятая по умолчанию база данных, указанная в учетной записи подключения (login) данного пользователя. (Об определении пользователя см. главу 34.)

В качестве альтернативного способа вы можете указывать таблицу или представление с помощью запроса. Используя этот способ, вы указываете, какие данные будут извлекаться из этой таблицы или представления. (Чтобы указать таблицу или представление для извлечения или вставки данных можно использовать параметр определение_таблицы/представления. Этот запрос заключается в кавычки и может состоять из оператора SELECT с предложениями, такими как ORDER BY. Если вы задаете определение запроса, вы должны также задать параметр queryout (см. табл. 24.1).

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

И наконец, вы должны задать один или несколько параметров, перечисленных в табл. 24.1.

Таблица 24.1. Управляющие описатели массового копирования
ПараметрОписание
In (В базу данных)Указывает, что массовое копирование будет выполняться из файла данных в таблицу или представление базы данных SQL Server
Out (Из базы данных)Указывает, что массовое копирование будет выполняться из таблицы или представления базы данных SQL Server в файл данных
Queryout (Извлечение с помощью запроса)Указывает, что данные будут извлекаться из базы данных SQL Server с помощью определенного запроса. Затем операция массового копирования будет копировать данные, выбранные с помощью этого запроса, в файл данных
Format (Формат)Указывает, что в дополнение к операции массового копирования программа BCP будет создавать форматный файл. Для создания этого форматного файла используются параметры форматирования ( -n, -c, -w, -6 или -N ) и ограничители (разделители) таблицы или представления. Параметр format должен использоваться в сочетании с опцией -f. Форматный файл позволяет вам сохранять определения программы BCP, чтобы вам не требовалось повторять их при последующем использовании BCP
Необязательные параметры

Вы можете использовать необязательные (дополнительные) параметры, перечисленые в табл. 24.2, для модифицирования работы программы BCP при выполнении массового копирования.

Таблица 24.2. Необязательные описатели массового копирования
ПараметрОписание
-a размер_пакетаУказывает количество байтов в сетевом пакете, передаваемом между клиентом и сервером
-b размер_группыУказывает количество строк, которое нужно включить в группу (пакетное задание). Каждая группа копируется как одна транзакция. По умолчанию все строки файла данных копируются как одна группа с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка таких групп, что позволит выполнять другую обработку
-cУказывает, что BCP использует символьный тип данных
-e файл_ошибокУказывает путь доступа к файлу ошибок, в котором протоколируются ошибки при работе BCP
-f форматный_файлУказывает путь доступа к форматному файлу, который ранее использовался программой BCP. Форматный файл создается в том случае, если BCP запускается с параметром format, который описан выше. При использовании форматного файла другие параметры форматирования можно не указывать
-h "подсказка [,.n]"Указывает подсказки, которые будут использоваться при массовом копировании. Это могут быть следующие подсказки:
  • ORDER (колонка [ASC | DESC] ). Указывает на сортировку данных в указанной колонке
  • ROWS_PER_BATCH = число. Указывает количество строк на одну группу (пакетное задание). Этот параметр аналогичен -b, но его не следует использовать в сочетании с -b. Параметр -b задает передачу указанной группы строк в SQL Server в виде одной транзакции. Если -b не указан, то весь файл данных передается на SQL Server в виде одной транзакции, а параметр ROWS_PER_BATCH используется для того, чтобы помочь SQL Server оценить объем нагрузки. Эта информация используется для оптимизации нагрузки внутренним образом
  • KILOBYTES_PER_BATCH = число. Указывает приблизительное количество килобайт на одну группу. Этот параметр аналогичен -b, но для указания размера группы используются килобайты, а не количество строк
  • TABLOCK. Указывает, что в течение массовой загрузки будет использоваться блокировка на уровне таблицы. Этот метод существенно повышает производительность загрузки за счет снижения конкуренции блокировок по данной таблице
  • CHECK_CONSTRAINTS. Указывает на необходимость проверки ограничений во время массовой загрузки. По умолчанию ограничения игнорируются
-i входной_файлУказывает имя файла ответов. Файл ответов содержит ответы на вопросы, задаваемые программой BCP, когда база данных работает в интерактивном режиме
-kУказывает, что в пустые колонки заносятся значения null, а не значения по умолчанию
-m максимум_ошибокУказывает, сколько ошибок должно произойти, чтобы BCP прекратила работу. Если этот параметр не указан, то используется значение по умолчанию, равное 10
-nУказывает, что BCP использует собственные (native) типы данных
-o выходной_файлУказывает выходной файл, в который поступает выходная информация программы BCP. Это обычный текстовый файл, который можно читать с помощью Notepad (Блокнота) или других утилит
-qУказывает, что для имен таблицы и представления требуются заключенные в кавычки идентификаторы, содержащие символы, отличные от стандарта ANSI, такие как пробел
-r разделитель_строкУказывает символ окончания строк. По умолчанию используется символ новой строки
-t ограничитель_полейУказывает ограничитель полей. По умолчанию используется символ табуляции (tab)
-vВыводит номер версии и информацию об авторских правах программы BCP
-wУказывает, что BCP использует символы Unicode
-C кодовая_страницаУказывает кодовую страницу данных в файле данных
-EУказывает, что копируемый файл содержит значения для идентификации колонок
-F первая_строкаУказывает первую строку, с которой начинается массовое копирование. Если этот параметр не указан, по первой строкой будет строка 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных
-L последняя_строкаУказывает последнюю строку для выполнения массового копирования. Принятое по умолчанию значение 0 указывает, что последней строкой для копирования является последняя строка файла данных. Этот параметр полезно использовать, если вы хотите копировать только определенное количество строк
-NУказывает, что BCP использует собственные типы данных для несимвольных данных и Unicode для символьных данных
-P парольУказывает пароль для идентификатора учетной записи подключения (login ID), который используется в параметре -U.
-RУказывает, что для денежных единиц, даты и времени используется региональный формат клиентской системы
-S имя_сервераУказывает имя сервера, на который выполняется копирование
-TУказывает, что используется доверяемое соединение. Если используется этот параметр, то переменные login_id и пароль не требуются; используются данные учетной записи пользователя сети
-U login_id Указывает login ID пользователя (идентификатор учетной записи подключения), под которым будет выполняться копирование данных
-V 60 | 65 | 70Выполняет массовое копирование с использованием типов данных из более ранней версии SQL Server. Этот параметр следует использовать в сочетании с параметрами -c и -n
-6Указывает, что BCP использует типы данных Microsoft SQL Server 6 или Microsoft SQL Server 6.5

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

Использование BCP

В этом разделе мы рассмотрим несколько примеров использования BCP для загрузки данных в SQL Server и из SQL Server. Эти примеры не охватывают все возможности, но они дадут вам хорошее представление о разнообразных режимах и методах работы с помощью BCP.

Вы можете использовать BCP из командной строки, как это описано выше, или в интерактивном стиле. Для вызова BCP без какого-либо дополнительного взаимодействия с этой программой, вы должны задать параметр -n, -c, -w или -N. Если не указан ни один из этих параметров, то программа BCP будет работать в интерактивном режиме.

Примечание.Во всех следующих примерах используется таблица Customers из базы данных Northwind.
Загрузка данных путем интерактивного использования BCP

Использование BCP для загрузки данных в интерактивном режиме может вызывать определенные трудности, поскольку этот метод требует, чтобы вы указывали ширину и типы колонок. Вы не обязаны это делать, если используете параметры командной строки, как это описано в следующем разделе. Хотя использование BCP в интерактивном режиме не рекомендуется, мы рассмотрим пример использования этого метода, чтобы вы имели полное представление о том, как работает BCP. В этом примере мы выполним копирование данных из файла data2.file в таблицу Customers базы данных Northwind с записью ошибок в файл err.file. Вы должны иметь заранее созданный файл данных data2.file. Этот файл содержит данные, которые вам нужно загрузить в таблицу Customers. Для запуска интерактивного сеанса в качестве системного администратора введите следующий оператор:

bcp Northwind.dbo.Customers in data2.file -e err.file -Usa

Затем у вас будет запрошен пароль. Введите пароль системного администратора (sa).

Далее программа BCP будет запрашивать у вас информацию, касающуюся данных, которые вы хотите копировать. Ниже приводится пример интерактивного сеанса. Отметим, что ввод пользователя показан полужирным шрифтом.

Enter the file storage type of field CustomerID [nchar]: char
(Введите тип файлового хранения для поля ...)
Enter prefix-length of field CustomerID [1]: 0
(Введите длину префикса поля ...)
Enter length of field CustomerID [26]: 5
(Введите длину поля ...)
Enter field terminator [none]: ,
(Введите ограничитель поля ...)

Enter the file storage type of field CompanyName [nvarchar]: char
Enter prefix-length of field CompanyName [1]: 0
Enter length of field CompanyName [189]: 40
Enter field terminator [none]: ,
Enter the file storage type of field ContactName [nvarchar]: char
Enter prefix-length of field ContactName [1]: 0
Enter length of field ContactName [143]: 30
Enter field terminator [none]: ,


Enter the file storage type of field ContactTitle [nvarchar]: char
Enter prefix-length of field ContactTitle [1]: 0
Enter length of field ContactTitle [143]: 30
Enter field terminator [none]: , 

Enter the file storage type of field Address [nvarchar]: char 
Enter prefix-length of field Address [1]: 0
Enter length of field Address [283]: 60
Enter field terminator [none]: , 
 
Enter the file storage type of field City [nvarchar]: char 
Enter prefix-length of field City [1]: 0
Enter length of field City [73]: 15
Enter field terminator [none]: , 

Enter the file storage type of field Region [nvarchar]: char 
Enter prefix-length of field Region [1]: 0
Enter length of field Region [73]: 15
Enter field terminator [none]: , 
 
Enter the file storage type of field PostalCode [nvarchar]: char 
Enter prefix-length of field PostalCode [1]: 0
Enter length of field PostalCode [49]: 10
Enter field terminator [none]: , 
 
Enter the file storage type of field Country [nvarchar]: char 
Enter prefix-length of field Country [1]: 0
Enter length of field Country [73]: 15
Enter field terminator [none]: ,

Enter the file storage type of field Phone [nvarchar]: char 
Enter prefix-length of field Phone [1]: 0
Enter length of field Phone [115]: 24
Enter field terminator [none]: ,
 
Enter the file storage type of field Fax [nvarchar]: char 
Enter prefix-length of field Fax [1]: 0
Enter length of field Fax [115]: 24
Enter field terminator [none]: ,
 
Do you want to save this format information in a file? [Y/n]: Y
(Хотите сохранить эту информацию о формате в файле?)
Host filename [bcp.fmt]: data.fmt
(Имя файла)
Starting copy...

(Начало копирования)
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver] Unexpected EOF  
encountered in BCP data-file
(Ошибка = ... непредвиденный конец файла в файле данных BCP)
 
5 rows copied.
(Скопировано 5 строк)
Network packet size (bytes): 4096
(Размер сетевого пакета [в байтах])
Clock Time (ms.): total       51 Avg       10 (98.04 rows
per sec.)
(Время (мс): всего 51 В среднем 10 (98.04 строк в сек.)

Как видно из данного примера, вы должны знать эти значения, прежде чем начнете копирование. Когда программа BCP достигла конца файла, было выдано сообщение об ошибке, поскольку мы не указали количество строк для копирования.

Загрузка данных программой BCP с помощью параметров командной строки

Как уже говорилось, вам будет намного проще использовать BCP для загрузки данных, если вы будет использовать параметры командной строки. В примере этого раздела мы будем использовать BCP для загрузки данных из файла данных, состоящего из символьных колонок, разделенных символами табуляции (tab). Чтобы указать, что в файле данных используется символьный формат, мы будем использовать параметр -c. Кроме того, использование параметра -c позволяет выполнять BCP в неинтерактивном режиме. Следующая команда копирует 25 строк данных из файла данных data.file. в таблицу Customers базы данных Northwind:

bcp Northwind.dbo.Customers in data.file -e err.fil -c -Usa

Поскольку параметр -c указывает символьные данные, вам не нужно задавать длину полей и длину префиксов. Если предположить, что вы создали файл data.file с 25 строками данных, разделенных символом tab в соответствии с колонками таблицы Customers, и ввели пароль sa, то соответствующий сеанс будет иметь следующую форму: (Размер вашего сетевого пакета и время работы, возможно, будут отличаться.)

Starting copy...

25 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.): total       80 Avg        3 (312.50 rows per sec.)

В этом примере направление копирования было указано параметром in, т.е. данные копировались в базу данных. Всегда имеет смысл указывать файл ошибок, в котором ведется журнал ошибок, возникших во время сеанса BCP. Если вы не указываете файл ошибок, эти ошибки выводятся на экран и, в конце концов, в результате прокрутки исчезают с экрана.

Загрузка данных с помощью параметра -f (format)

В нашем первом примере раздела "Использование BCP" мы создали форматный файл с именем data.fmt. Вместо ввода вручную всех параметров форматирования, таких как storage type (тип хранения), prefix length (длина префикса), field length (длина поля) и field terminator (разделитель полей), вы можете использовать форматный файл. Для вызова этого файла используется параметр -f (format), как это показано ниже:

bcp Northwind.dbo.Customers in data2.file -e err.fil -f data.fmt
-L 5 -Usa

В предположении, что вы ввели пароль sa и создали data2.file, сеанс будет иметь следующую форму:

Starting copy...

5 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.): total       50 Avg       10 (100.00 rows
per sec.)

В дополнение к параметру -f в данном примере включен параметр -L. Этот параметр указывает последнюю строку для копирования из входного файла. В данном примере последней обрабатываемой строкой была пятая строка. В результате здесь не появится сообщение об ошибке EOF (конец файла), которое мы видели в предыдущем примере.

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

Использование BCP в интерактивном режиме для копирования данных из базы данных проще, чем использование BCP для копирования в базу данных, поскольку при извлечении данных BCP самостоятельно заполняет для вас параметры длины полей. Мы используем следующую команду для интерактивного копирования данных из таблицы Customers базы данных Northwind:

bcp Northwind.dbo.Customers out dataout.dat -e err.fil -U sa

После ввода этой команды и пароля sa начнется выполнение сеанса. (Ввод пользователя показан полужирным шрифтом.)

Enter the file storage type of field CustomerID [nchar]: char 
Enter prefix-length of field CustomerID [1]: 0
Enter length of field CustomerID [26]: 
Enter field terminator [none]: ,
 
Enter the file storage type of field CompanyName [nvarchar]: char
Enter prefix-length of field CompanyName [1]: 0
Enter length of field CompanyName [189]: 
Enter field terminator [none]: ,
 
Enter the file storage type of field ContactName [nvarchar]: char
Enter prefix-length of field ContactName [1]: 0
Enter length of field ContactName [143]: 
Enter field terminator [none]: ,

Enter the file storage type of field ContactTitle [nvarchar]: char
Enter prefix-length of field ContactTitle [1]: 0
Enter length of field ContactTitle [143]: 
Enter field terminator [none]: , 

Enter the file storage type of field Address [nvarchar]: char
Enter prefix-length of field Address [1]: 0
Enter length of field Address [283]: 
Enter field terminator [none]: , 
 
Enter the file storage type of field City [nvarchar]: char
Enter prefix-length of field City [1]: 0
Enter length of field City [73]: 
Enter field terminator [none]: , 

Enter the file storage type of field Region [nvarchar]: char
Enter prefix-length of field Region [1]: 0
Enter length of field Region [73]: 
Enter field terminator [none]: , 
 
Enter the file storage type of field PostalCode [nvarchar]: char
Enter prefix-length of field PostalCode [1]: 0
Enter length of field PostalCode [49]: 
Enter field terminator [none]: ,
 
Enter the file storage type of field Country [nvarchar]: char
Enter prefix-length of field Country [1]: 0
Enter length of field Country [73]: 
Enter field terminator [none]: , 

Enter the file storage type of field Phone [nvarchar]: char 
Enter prefix-length of field Phone [1]: 0
Enter length of field Phone [115]: 
Enter field terminator [none]: , 
 
Enter the file storage type of field Fax [nvarchar]: char 
Enter prefix-length of field Fax [1]: 0
Enter length of field Fax [115]: 
Enter field terminator [none]: , 
 
Do you want to save this format information in a file? [Y/n]: n
Host filename [bcp.fmt]: 

Starting copy... 
 
96 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.): total    10 Avg     0 (9600.00 rows per sec.)

В этом интерактивном сеансе BCP создается файл с разделителями – символами табуляции (напомним, что символ табуляции является разделителем по умолчанию); этот файл можно просматривать с помощью Notepad. Это текстовый файл, и все его данные являются данными символьного типа. К сожалению, BCP не добавляет символ новой строки в конце каждой строки. Тем самым при просмотре файл с помощью Notepad вы увидите одну очень длинную строку данных.

Извлечение данных с помощью BCP с параметрами командной строки

Чтобы создать более удобный для чтения файл данных, в котором данные разделены символом табуляции, а каждая строка заканчивается символом новой строки, используйте параметр -c, как это показано ниже:

bcp Northwind.dbo.Customers out dataout.dat -e err.fil -c -U sa

После ввода этой команды и пароля sa начнется выполнение сеанса, как показано ниже:

Starting copy...
 
96 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.): total      1 Avg      0 (96000.00 rows per sec.)
Извлечение данных с использованием параметра queryout

В нашем последнем примере для извлечения данных используется параметр queryout. Это параметр позволяет вам задавать запрос при копировании данных из базы данных SQL Server. С помощью этого запроса происходит выбор определенных данных и копирование только этих данных. Параметр queryout достаточно прост для использования – просто не забывайте указывать запрос в кавычках, как это показано ниже:

bcp "SELECT CustomerID, CompanyName FROM Northwind..Customers" 
queryout dataout.dat -e err.fil -c -U sa

Как обычно, введите пароль sa; сеанс будет показан в следующей форме:

Starting copy...
 
96 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.): total      1 Avg      0 (96000.00 rows per sec.)

Результатом этого запроса будет файл данных с разделителями в виде символов табуляции и признаками конца строк; этот файл состоит из двух колонок: CustomerID и CompanyName. Это способ полезно использовать, если вы хотите извлечь только определенные колонки или строки базы данных.

Оператор BULK INSERT

Оператор T-SQL BULK INSERT аналогичен программе BCP – в том смысле, что оба средства можно использовать для массового копирования данных из файла данных в базу данных SQL Server. Но, в отличие от BCP, оператор BULK INSERT нельзя использовать для извлечения данных из баз данных SQL Server. Это ограничение уменьшает его функциональные возможности, но поскольку оператор BULK INSERT выполняется как поток внутри SQL Server, это устраняет необходимость передачи данных из одной программы в другую, что повышает производительность при загрузке данных. Таким образом, оператор BULK INSERT загружает данные более эффективно, чем программа BCP.

Синтаксис BULK INSERT

Как и BCP, оператор BULK INSERT имеет несколько обязательных параметров и много необязательных. Вызов BULK INSERT из SQL Server (с помощью ISQL, OSQL или анализатора запросов [Query Analyzer]) происходит с помощью следующего оператора. (Здесь приводятся все обязательные и необязательные параметры.)

BULK INSERT   [['имя_базы_данных'.]['владелец'].]
                       {'имя_таблицы' | 'имя_представления' FROM 'файл_данных' }
  [WITH   (  
                    [BATCHSIZE [ = размер_группы ]]
                    [[,] CHECK_CONSTRAINTS ]
                    [[,] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'кодовая_страница']]
                    [[,] DATAFILETYPE [ = {'char'|’native’|
                                                   'widechar'|’widenative’}]]
                    [[,] FIELDTERMINATOR [ = 'ограничитель_полей' ]]
                    [[,] FIRSTROW [ = первая_строка ]]
                    [[,] FIRETRIGGERS [ = триггеры ]]
                    [[,] FORMATFILE [ = 'путь_к_форматному_файлу' ]]
                    [[,] KEEPIDENTITY ]
                    [[,] KEEPNULLS ]  
                    [[,] KILOBYTES_PER_BATCH [ = килобайт_на_группу ]]
                    [[,] LASTROW [ = последняя_строка ]]
                    [[,] MAXERRORS [ = максимум_ошибок ]]
                    [[,] ORDER ( { колонка [ ASC | DESC ]}[ ,...n ])]
                    [[,] ROWS_PER_BATCH [ = строк_на_группу ]]
                    [[,] ROWTERMINATOR [ = 'разделитель_строк' ]]
                    [[,] TABLOCK ]
                      )]
Обязательные параметры

Местоположение файла данных указывается параметром файл_данных. Это должен быть допустимый путь доступа к файлу.

Местоположение базы данных, в которую помещаются данные, задается определением таблицы или представлением. Как видно из определения синтаксиса оператора, вы можете также указывать владельца таблицы или представления и/или имя базы данных. Если использовать эту команду массовой вставки для вставки данных в какое-либо представление, то вы можете затрагивать только одну из базовых таблиц, указываемую в предложении FROM этого представления.

Необязательные параметры

Вы можете использовать необязательные параметры и ключевые слова, которые перечислены в табл. 24.3, чтобы модифицировать поведение BULK INSERT. Как вы увидите из описания, параметры, которые можно использовать с оператором BULK INSERT, аналогичны параметрам программы BCP.

Таблица 24.3. Необязательные параметры для оператора BULK INSERT
Необязательный параметрОписание
BATCHSIZE = размерУказывает количество строк в группе (пакетном задании). Каждая группа обрабатывается как одна транзакция
CHECK_CONSTRAINTS Указывает на то, что будет выполняться проверка ограничений. По умолчанию ограничения игнорируются.
CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'кодовая_страница' ]Указывает кодовую страницу данных в файле данных. Этот параметр полезно использовать только с типами данных char, varchar и text
ATAFILETYPE [ = 'char' | 'native' | 'widechar' | 'widenative' ]Указывает тип данных в файле данных; по умолчанию это тип char. Другие типы: native (собственные типы данных базы данных), widechar (символы Unicode) и widenative (то же, что и native, но типы char, varchar и text сохраняются как Unicode)
FIELDTERMINATOR [ = ограничитель_полей ] Указывает ограничитель полей, используемый с типами данных char и widechar. По умолчанию это символ табуляции ( \t )
FIRSTROW [ = первая_строка ]Номер первой строки для копирования. По умолчанию 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных.
FORMATFILE [ = форматный_файл ] Указывает путь доступа к форматному файлу
KEEPIDENTITY Указывает, что в импортируемых файлах данных присутствуют значения для колонки со свойством identity
KEEPNULLS Указывает, что в пустых колонках сохраняется значение null
KILOBYTES_PER_BATCH [ = число ] Указывает приблизительное количество килобайт на одну группу (пакетное задание), используемую при массовом копировании
LASTROW [ = последняя_строка ] Указывает последнюю строку для выполнения массового копирования. По умолчанию используется значение 0. Этот параметр полезно использовать, если вы хотите вставить только определенное количество строк
MAXERRORS [ = максимум_ошибок ] Указывает, сколько ошибок должно произойти, чтобы прекратить вставку. Значение по умолчанию равно 10
ORDER ( колонка [ASC | DESC] ) Задает, что данные в указанной колонке должны быть отсортированы в указанном порядке (по возрастанию или убыванию)
ROWS_PER_BATCH [ = строк_на_группу ] Указывает количество строк на одну группу (пакетное задание). Каждая группа копируется в виде одной транзакции. По умолчанию вставка всех строк файла данных выполняется как одна транзакция с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка групп, что позволит выполнять другую обработку
ROWTERMINATOR [ = разделитель_строк ] Указывает разделитель строк для данных типа char и widechar. По умолчанию используется символ новой строки ( \n )
Использование BULK INSERT

Рассмотрим два примера использования оператора BULK INSERT.

В обоих примерах мы будем загружать данные из файла с символьными данными data.file (который использовали в предыдущих примерах) в таблицу Customers базы данных Northwind.

Примечание.Напомним, что оператор BULK INSERT можно использовать только для вставки данных в базу данных; его нельзя использовать для извлечения данных. А поскольку оператор BULK INSERT не дает такого разнообразия режимов, как программа BCP, то мы приводим здесь только два примера.

Для загрузки данных в базу данных используйте следующий оператор T-SQL:

BULK INSERT Northwind..Customers FROM 'C:\data.file'
WITH
    (
    DATAFILETYPE = 'char'
    )
GO

Вы можете добавлять любое количество параметров. В следующем примере используется большее количество необязательных параметров:

BULK INSERT Northwind..Customers FROM 'C:\data.file'
WITH
    (
    BATCHSIZE = 5,
    CHECK_CONSTRAINTS,
    DATAFILETYPE = 'char',
    FIELDTERMINATOR = '\t',
    FIRSTROW = 5,
    LASTROW = 20,
    TABLOCK
    )

Этот оператор будет загружать из файла данных только строки 5-20. Указывается, что разделителем полей будет символ табуляции (несмотря на то, что он используется по умолчанию). В этом примере также указано, что во время процесса массовой вставки будут проверяться ограничения, а также задается блокировка таблицы на период загрузки. Транзакции, выполняющие загрузку, будут выполняться группами по пять строк.

Службы преобразования данных Data Transformation Services (DTS)

Средство DTS является частью SQL Server Enterprise Manager и предназначено для того, чтобы вы могли легко импортировать данные в базу данных и экспортировать данные из базы данных. DTS включает в себя двух мастеров: мастер импорта Import Wizard и мастер экспорта Export Wizard.* В этом разделе мы рассмотрим использование этих мастеров.

Мастер Import Wizard

Вы можете использовать Import Wizard для импорта данных в базу данных из различных источников данных. В отличие от программы BCP и оператора T-SQL BULK INSERT мастер Import Wizard может импортировать данные из источников, отличных от файлов данных. Чтобы использовать Import Wizard, выполните следующие шаги.

  1. В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, на который вы хотите импортировать данные. В меню Tools (Сервис) выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard (Выбор мастера) раскройте папку Data Transformation Services (Службы преобразования данных), щелкните на DTS Import Wizard (Мастер импорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Import Data (Импорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.2).

    Начальное окно мастера Data Transformation Services Import/Export Wizard


    Рис. 24.2.  Начальное окно мастера Data Transformation Services Import/Export Wizard

  2. Щелкните на кнопке Next (Далее), чтобы появилось окно Choose а Data Source (Выберите источник данных) (рис. 24.3).

    Окно Choose а Data Source (Выберите источник данных)


    Рис. 24.3.  Окно Choose а Data Source (Выберите источник данных)

    Здесь вы можете выбрать источник данных из раскрывающегося списка Source (Источник). На рис. 24.3 показан выбранный тип Text File (Текстовый файл). Вы можете выбрать источник данных из следующих вариантов:
    • dBase
    • Microsoft Access
    • Microsoft Data Link
    • Microsoft Excel
    • Microsoft Visual FoxPro
    • Other (ODBC data source) (Другой [источник данных ODBC])
    • Other OLE_DB data source (Другие источники данных OLE_DB)
    • Paradox
    • Data files (Файлы данных)
    Варианты выбора частично зависят от драйверов ODBC, которые вы инсталлировали в вашей системе. Например, если у вас инсталлирован драйвер Oracle ODBC, в списке будет также представлен провайдер OLE DB provider for Oracle. Окно Choose a Data Source изменяется в зависимости от выбранного вами источника данных. Независимо от выбранного вами источника потребуется ввести информацию о файле и (иногда) информацию для входа (имя пользователя и пароль).
  3. Щелкните на кнопке Next, чтобы появилось окно Select file format (Выбор формата файла) (рис. 24.4). (Окно Select file format появляется только в том случае, если выбран тип файла Text File.) В этом окне вы можете выбрать формат файла. Ниже описываются параметры этого окна:
    • Кнопки выбора Delimited (С ограничителями) и Fixed field (Поле фиксированной ширины) позволяют вам выбрать формат входного файла, а также определенный символ-ограничитель или фиксированную ширину полей.
    • В раскрывающемся списке File type (Тип файла) вы можете выбрать тип кодировки для входного файла: ANSI, OEM или Unicode.

       Окно Select file format (Выбор формата файла)


      Рис. 24.4.  Окно Select file format (Выбор формата файла)

    • В раскрывающемся списке Row delimiter (Разделитель строк) вы можете указать символ, который используется как признак конца каждой строки входного файла.
    • В раскрывающемся списке Text qualifier (Описатель текста) вы можете указать ограничитель текста в файле с ограничителями.
    • В прокручиваемом списке Skip rows (Пропустить строки) вы можете указать, сколько строк нужно пропустить в начале входного файла.
    • Флажок First row has column names (Первая строка содержит имена колонок) указывает, что первая строка содержит не данные, а названия, и ее нужно пропустить.
  4. Выберите вариант Delimited для формата файла, символы {CR}{LF} для разделителя строк (Row delimiter) и вариант <none> (нет) в списке Text qualifier. Затем щелкните на кнопке Next, чтобы появилось окно Specify Column Delimiter (Указание ограничителя колонок) (рис. 24.5). (Если щелкнуть на кнопке выбора Fixed Field вместо Delimited, то появится окно Fixed Field Column Positions (Позиции колонок полей фиксированной ширины).) Это окно удобно для указания ограничителя колонок, поскольку вы получаете немедленный результат в зависимости от вашего выбора, который показывает, насколько подходит ваш выбор. Вы можете использовать запятую (кнопка выбора Comma), точку с запятой (Semicolon) или любой другой ограничитель. После выбора ограничителя в окне Preview (Просмотр) появляются строки. Это позволяет вам увидеть, насколько подходит выбранный вами ограничитель для данных входного файла.
  5. После выбора ограничителя щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя данных) (рис. 24.6). Это окно позволяет вам выбрать базу данных, в которую будет выполнен импорт. Вы должны указать в поле Destination (Получатель) SQL Server ODBC (ODBC-алиас для соответствующей базы данных), а также сервер (поле Server) и базу данных (поле Database). В данном примере вы укажем базу данных Northwind. Вы должны также выбрать тип аутентификации: в системе Windows или в SQL Server (кнопка выбора Use Windows Authentication или Use SQL Server Authentication). Выбрав аутентификацию в SQL Server, вы должны ввести имя пользователя и пароль для SQL Server (соответственно поля Username и Password). (О системе безопасности для SQL Server см. главу 34.) Если ввести неверное имя пользователя или пароль, то вы можете повторить попытку, щелкнув на кнопке Refresh (Обновить). Чтобы модифицировать дополнительные свойства, включая параметры безопасности и тайм-аут соединения, щелкните на кнопке Advanced (Дополнительно) и выберите нужные параметры в появившемся окне. Обычно эти свойства не требуется модифицировать.

      Окно Specify Column Delimiter (Указание ограничителя колонок)


    Рис. 24.5.  Окно Specify Column Delimiter (Указание ограничителя колонок)

     Окно Choose a Destination (Выбор получателя данных)


    Рис. 24.6.  Окно Choose a Destination (Выбор получателя данных)

  1. Щелкните на кнопке Next, чтобы появилось окно Select Source Tables and Views (Выбор исходных таблиц и представлений) (рис. 24.7). В этом окне вам нужно выбрать из раскрывающегося списка колонки Destination таблицу, в которую будут загружаться данные. Вы можете предварительно просмотреть эти данные, щелкнув на кнопке Preview. Вы можете также использовать кнопки Select All (Выбрать все) и Deselect All (Отменить весь выбор), чтобы выбрать все таблицы или не выбирать ни одной таблицы.

      Окно Select Source Tables and Views (Выбор исходных таблиц и представлений)


    Рис. 24.7.  Окно Select Source Tables and Views (Выбор исходных таблиц и представлений)

  2. В том же окне вы имеете доступ к службам преобразования. Эти службы позволяют вам преобразовывать данные (изменять колонки и т.д.) при выполнении импорта. Для преобразования данных сначала щелкните на кнопке Transform (Преобразование) (кнопка с тремя точками под словом Transform), чтобы открыть диалоговое окно Column Mappings and Transformations (Отображение и преобразование колонок) (рис. 24.8). Во вкладке Column Mappings (Отображение колонок) вы можете выбрать создание новой таблицы (кнопка выбора Create destination table) либо удаление строк (Delete rows) или добавление строк (Append rows) в существующей таблице. Вариант Append rows to destination table (Добавление строк к таблице-получателю) принят по умолчанию. Если выбрать создание новой таблицы, то с помощью кнопки Edit SQL (Редактировать SQL) вы можете просматривать и модифицировать оператор SQL, который будет использоваться для создания этой таблицы.
  3. Щелкните на вкладке Transformations для просмотра параметров преобразования (рис. 24.9). В окне этой вкладки вы можете выбрать копирование непосредственно в колонки таблицы (Copy the source columns directly ...) или преобразование информации во время ее копирования (Transform information as it is copied). Здесь указаны такие способы преобразования, как преобразование точности (16-битные данные в 32-битные, 32-битные в 16-битные). Можно также задавать преобразование значений null (NOT NULL to NULL, NULL to NOT NULL).
  4. Щелкните на кнопке OK, чтобы закрыть это диалоговое окно, и щелкните на кнопке Next, чтобы появилось окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета) (рис. 24.10). В этом окне вы можете выбрать немедленный запуск процесса импорта или запланировать его на определенное время в будущем. Вы можете также сохранить этот пакет DTS, чтобы можно было снова выполнить этот импорт в будущем. Для этого установите флажок Save DTS Package (Сохранить пакет DTS), который находится в секции Save (Сохранение) внизу данного окна. Тем самым вы сохраните выбранные вами значения параметров служб преобразования.

     Вкладка Column Mappings (Отображение колонок) диалогового окна Column Mappings and Transformations (Отображение и преобразование колонок)


    Рис. 24.8.  Вкладка Column Mappings (Отображение колонок) диалогового окна Column Mappings and Transformations (Отображение и преобразование колонок)

      Вкладка Transformations диалогового окна Column Mappings and Transformations


    Рис. 24.9.  Вкладка Transformations диалогового окна Column Mappings and Transformations

  5. Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS) (рис. 24.11). Щелкните на кнопке Finish (Готово), чтобы выполнить импорт.

    Окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета)


    Рис. 24.10.  Окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета)

     Окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS)


    Рис. 24.11.  Окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS)

  6. После щелчка на кнопке Finish вы увидите окно Executing Package (Идет выполнение пакета) (рис. 24.12). Затем появится окно сообщения, информирующее вас, что копирование данных завершено или возникла ошибка.

Как видно из описания, мастер DTS Import Wizard превращает выполнение импорта данных в простую процедуру. Однако при повторяемом выполнении этой задачи более эффективным будет создание сценария, поскольку он наиболее подходит для быстрого и простого многократного использования. Файл сценария создается путем сохранения оператора BULK INSERT в .sql-файле.

 Окно Choose a Destination (Выбор получателя данных)


Рис. 24.12.  Окно Choose a Destination (Выбор получателя данных)

Мастер Export Wizard

Вы можете использовать мастер Export Wizard для экспорта данных из базы данных во внешние хранилища данных. В отличие от программы BCP, мастер Export Wizard может также экспортировать данные в хранилища, отличные от файлов данных. Для использования Export Wizard выполните следующие шаги.

  1. В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, с которого вы хотите экспортировать данные. В меню Tools выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard раскройте папку Data Transformation Services, щелкните на DTS Export Wizard (Мастер экспорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Export Data (Экспорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.13).

     Начальное окно Data Transformation Services Import/Export Wizard


    Рис. 24.13.  Начальное окно Data Transformation Services Import/Export Wizard

  2. Щелкните на кнопке Next, чтобы появилось окно Choose a Data Source (рис. 24.14). В этом окне вы можете указать источник данных. Вы можете оставить вариант по умолчанию (Microsoft OLE DB Provider for SQL Server) или выбрать вариант Microsoft ODBC Driver for SQL Server. При любом варианте произойдет подсоединение к SQL Server. Для экспорта данных из других систем управления базами данных можно использовать другие варианты. Затем выберите базу данных – в данном случае базу данных Northwind. Вы можете также задать дополнительные параметры, такие как тайм-аут соединения, сетевой адрес, сетевые библиотеки и идентификатор рабочей станции, в окне, которое появится, если щелкнуть на кнопке Advanced. Однако эти параметры обычно не требуется модифицировать.

     Окно Choose a Data Source (Выбор источника данных)


    Рис. 24.14.  Окно Choose a Data Source (Выбор источника данных)

  3. Щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя) (рис. 24.15). Параметры этого окна варьируются в зависимости от типа данных выбранного вами получателя данных; однако в большинстве случаев вам потребуется ввести данные для входа и информацию о файле. В данном случае мы выберем вариант получателя данных Text File (Текстовый файл), который не требует данных для входа, поэтому мы сможем сохранить таблицу базы данных в текстовой форме. Введите имя выходного файла в текстовом поле File name (Имя файла).
  4. Щелкните на кнопке Next, чтобы появилось окно Specify Table Copy or Query (Копия таблицы или запрос) (рис. 24.16). В этом окне вы можете выбрать между экспортом всей таблицы (кнопка выбора Copy table(s)...) или экспортом, осуществляемым через запрос (кнопка выбора Use a query...). Если в качестве получателя данных выбрана другая база данных SQL Server, то станет доступна третья кнопка выбора – Copy objects and data between SQL Server databases (Копировать объекты и данные между базами данных SQL Server).

    Если щелкнуть на кнопке выбора Use a query to specify the data to transfer (Использовать запрос для указания данных, подлежащих копированию) и затем щелкнуть на кнопке Next, то появится окно Type SQL Statement (Введите оператор SQL) (рис. 24.17). Здесь вы можете ввести оператор, который осуществит выбор данных для экспорта. С помощью этого запроса можно выбрать подмножество колонок или строк или выбрать всю таблицу, как это показано в данном примере.

     Окно Choose a Destination (Выбор получателя)


    Рис. 24.15.  Окно Choose a Destination (Выбор получателя)

     Окно Specify Table Copy or Query (Копия таблицы или запрос)


    Рис. 24.16.  Окно Specify Table Copy or Query (Копия таблицы или запрос)

     Окно Type SQL Statement (введите оператор SQL))


    Рис. 24.17.  Окно Type SQL Statement (введите оператор SQL))

  5. Щелкните на кнопке Next, чтобы появилось окно Select destination file format (Выбор формата выходного файла) ((рис. 24.18). (Раскрывающийся список Source не появится в этом окне, если вы вошли в это окно из окна Type SQL Statement.) Здесь вы можете задать несколько параметров форматирования для выходного файла, включая выбор между файлом с ограничителями и файлом с полями фиксированной ширины. По окончании выбора параметров форматирования щелкните на кнопке Next.

    Если щелкнуть на кнопке выбора Copy table(s) and view(s) from the source database (Копировать таблицу(ы) и представление(я) из исходной базы данных) в окне Specify Table Copy Or Query и щелкнуть на кнопке Next, то появится окно Select destination file format (рис. 24.18). (В данном случае в окне появится раскрывающийся список Source.) В этом окне вам нужно выбрать исходную таблицу, а также выбрать параметры форматирования для выходного файла. По окончания щелкните на кнопке Next.

     Окно Select destination file format


    Рис. 24.18.  Окно Select destination file format

  6. После щелчка на кнопке Next в окне Select destination file format появится окно Save, schedule, and replicate package (рис. 24.19). Здесь вы можете выбрать между запуском этого задания и сохранением DTS-пакета для будущего использования. Это окно является аналогом соответствующего окна мастера Import Wizard.
  7. Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Export Wizard (рис. 24.20). Щелкните на кнопке Finish для запуска экспорта.
  8. После щелчка на кнопке Finish в окне мастера Export Wizard начнется выполнение процесса экспорта данных. Как и в случае мастера Import Wizard появится окно Executing Package (рис. 24.21). Затем появится окно сообщения, где говорится об успешном или неуспешном завершении данной работы.

Оба мастера – Import Wizard и Export Wizard – просты для использования и конфигурирования; они позволяют упростить работу, временами сопряженную с трудностями при использовании других средств. Но следует помнить, что если вам требуется повторное выполнение этих операций, то стоит приложить дополнительные усилия для их реализации в виде сценария. Вы можете создать сценарий, в который входит оператор SQL BULK INSERT, для выполнения нужной операции импорта, или использовать оператор SELECT, где выходные результаты перенаправлены в файл данных, для выполнения операции экспорта.

 Окно Save, schedule, and replicate package


Рис. 24.19.  Окно Save, schedule, and replicate package

 Окно Completing the DTS Export Wizard


Рис. 24.20.  Окно Completing the DTS Export Wizard

Примечание. Хотя мы использовали в предыдущих примерах использования мастеров Import Wizard и Export Wizard передачу данных из текстового файла в таблицу базы данных и из таблицы в текстовый файл, эти мастера поддерживают также много других типов передачи данных. Эти мастера особенно полезны для передачи данных между базами данных или другими объектами.

 Окно Executing Package


Рис. 24.21.  Окно Executing Package

Переходные таблицы

Переходные таблицы – это временные таблицы, которые вы создаете для загрузки данных в SQL Server, для обработки и манипулирования этими данными, а также для копирования этих данных в соответствующую таблицу или таблицы в базе данных. В этом разделе вы узнаете, как и когда использовать переходные таблицы.

Основы использования переходных таблиц

Переходная таблица – это временная область хранения базы данных, в которую вы можете копировать данные. Затем вы можете использовать T-SQL для преобразования данных в нужный формат путем выполнения таких операций, как операции объединения, использующие переходную таблицу и существующие таблицы.

Возможность обработки данных во время процесса загрузки в переходные таблицы позволяет вам обходить определенные ограничения методов загрузки данных. Большинство методов загрузки данных позволяют вам только копировать данные в базу данных без какой-либо обработки. Используя DTS, вы можете выполнять некоторые преобразования данных, но не можете вносить изменения, основываясь на данных, содержащихся в базе данных. Главным преимуществом использования переходных таблиц является то, что вы получаете возможность выполнения операций объединения (слияния), используя при этом информацию, содержащуюся в самой переходной таблице или в существующих таблицах.

Использование переходных таблиц

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

Слияние и загрузка таблицы

Рассмотрим таблицу "рынка" данных (data mart), которая является комбинацией двух таблиц из систем оперативной обработки транзакций (OLTP). Эта таблица содержит колонки A, B, C, D и E; колонки A, B и C существуют в одной таблице и колонки C, D и E – в другой таблице. Обе входные таблицы можно сделать переходными, а для загрузки общей таблицы в рынок данных можно использовать операцию слияния (рис. 24.22).

 Использование переходных таблиц для слияния


Рис. 24.22.  Использование переходных таблиц для слияния

Загрузка и разбиение таблицы

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

Использование переходных таблиц для разделения данных


Рис. 24.23.  Использование переходных таблиц для разделения данных

Загрузка уникальных значений в таблицу

Вы можете загружать уникальные значения в таблицу путем массового копирования данных для загрузки в переходную таблицу и последующего использования оператора T-SQL для вставки данных в основную таблицу, только если этих данных еще нет в таблице. Эта возможность полезна в тех случаях, когда вы загружаете данные, которые могут нарушать некоторые деловые правила. Для копирования уникальных значений из переходной таблицы используйте оператор NOT IN, как это показано ниже:

INSERT    INTO table ( columnA, columnB )
SELECT    columnA, columnB
FROM    staging_table
WHERE    columnA NOT IN ( SELECT columnA
                   FROM   table )

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

Оператор SELECT...INTO

Использование оператора SELECT...INTO на самом деле не является методом загрузки базы данных; это способ создания новых таблиц из существующих таблиц или переходных таблиц. Оператор SELECT...INTO нельзя использовать для заполнения существующей таблицы.

Примечание. Чтобы можно было использовать оператор SELECT...INTO, для параметра базы данных select into/bulkcopy должно быть задано значение TRUE. Чтобы задать этот параметр, используйте следующий оператор T-SQL:

exec sp_dboption <имя_базы_данных>, "select into/bulkcopy", TRUE

Ниже приводится синтаксис оператора SELECT...INTO:

SELECT   <список_колонок>
INTO     <имя_новой_таблицы>
<предложение_для_select>

Переменная предложение_для_select указывает операторы, которые обычно уточняют оператор SELECT, такие как FROM и WHERE. Оператор SELECT...INTO легко использовать, как показано в следующем примере:

exec sp_dboption "example", "select into/bulkcopy", TRUE
GO

SELECT   order_id,
           contact_id,
           item_id,
           item_description,
           amount INTO newsales
FROM     stage
GO

exec sp_dboption "example", "select into/bulkcopy", FALSE
GO

В данном случае указана база данных "example" и создаваемая таблица newsales. Данные извлекаются из таблицы stage.

Заключение

В этой главе вы узнали, как загружать базу данных SQL Server с помощью программы BCP, оператора BULK INSERT и средств DTS. Вы также ознакомились с переходными таблицами, которые удобно использовать при определенных условиях. И вы узнали, как использовать оператор SELECT...INTO. Эти средства и методы, несомненно, помогут вам, поскольку загрузка базы данных является одной из основных задач для DBA. В главе 25 вы узнаете о компонентах Distributed Transaction Coordinator и Microsoft Transaction Server.

Лекция 25. Службы компонентов и Microsoft Distributed Transaction Coordinator

В этой лекции будет произведено знакомство с координатором распределенных транзакций. Лекция в большей степени носит теоретический характер, но с некоторым количеством примеров. Рассказывается о свойствах DTC, методах работы с этой технологией и возможностях для реализации поставленных задач.

В этой лекции вы ознакомитесь с продуктом Microsoft Distributed Transaction Coordinator (MS DTC – координатор распределенных транзакций), позволяющим осуществлять доступ к нескольким источникам данных из одной транзакции базы данных, обеспечивая при этом целостность данных. Как вы увидите в этой лекции, MS DTC используется для многих целей, и услуги, которые он обеспечивает, требуются многим типам приложений.

MS DTC является частью служб компонентов (Component Services) – набора продуктов и технологий, включенного в Microsoft Windows 2000, который разработан на основе нескольких служб Microsoft Windows NT. В частности, службы компонентов основываются на технологиях Component Object Model (COM) и Distributed COM (DCOM), Microsoft Transaction Server, Microsoft Internet Information Server и Microsoft Message Queue Server. В службах компонентов Windows 2000 модели COM и DCOM развились до следующего уровня – COM+. Приложения COM+ и другие системные службы образуют Windows 2000 Component Services.

Прежде чем перейти к подробному описанию MS DTC, в этой лекции дается введение в технологии, используемые в Component Services. Этот обзор даст вам достаточный объем информации, чтобы решить, можете ли вы получить преимущества от использования этих технологий в вашей среде.

Обзор Component Services

Component Services состоит из ряда отдельных продуктов и утилит, управление которыми осуществляется из одной консоли управления. Консоль управления Component Services – это оснастка консоли Microsoft Management Console (MMC). В состав Component Services входят следующие утилиты и продукты:

Для запуска управляющей утилиты Component Services щелкните на кнопке Start, укажите пункт Programs (Программы), укажите пункт Administrative Tools (Администрирование) и затем выберите Component Services. Появится консоль администрирования Component Services (рис. 25.1).

. Консоль администрирования Component Services


увеличить изображение

Рис. 25.1.  . Консоль администрирования Component Services

Службы приложений COM+

Приложения COM+ спроектированы и разработаны в соответствии со спецификацией Microsoft COM+. COM+ является расширением модели COM, способствующей созданию и развертыванию распределенных приложений в рамках предприятия. Усовершенствования, внесенные в COM+, упрощают повышение уровня безопасности и включение компонентов управления очередями в ваши приложения.

Вы можете администрировать и конфигурировать компоненты приложений COM+ из консоли администрирования Component Services. Для доступа к вашим приложениям COM+ раскройте папки Component Services, Computers (Компьютеры), My Computer (Мой компьютер) и затем COM+ Applications (Приложения COM+) (рис. 25.2).

 Просмотр приложений COM+ в консоли администрирования Component Services


Рис. 25.2.  Просмотр приложений COM+ в консоли администрирования Component Services

Как видно из рисунка, здесь показаны приложения COM+, которые были зарегистрированы. Раскрывая эти приложения COM+, вы получаете доступ к компонентам приложения.

MS DTC

Как видно из предыдущего рисунка, под папкой COM+ Applications консоли администрирования Component Services находится папка для DTC (Distributed Transaction Coordinator). MS DTC подробно описывается ниже в этой лекции, поэтому он здесь не рассматривается.

Службы просмотра событий Event Viewer

Службы Event Viewer являются развитием утилиты Event Viewer, входящей в состав Windows NT. Как и утилита Event Viewer для Windows NT, службы Event Viewer в Windows 2000 Component Services позволяют вам осуществлять доступ к журналам событий. Все сообщения об ошибках и информационные сообщения приложений, системы безопасности и операционной системы протоколируются в этих журналах событий. Время от времени вам следует проверять эти журналы. Для просмотра событий раскройте папку Event Viewer (рис. 25.3) и щелкните на имени журнала событий, который вам нужно просмотреть.

Раскрытие папки Event Viewer для просмотра событий приложений, системы безопасности и операционной системы


увеличить изображение

Рис. 25.3.  Раскрытие папки Event Viewer для просмотра событий приложений, системы безопасности и операционной системы

Системные службы

Компонент системных служб в Component Services – это развитие утилиты Services, используемой в составе Windows NT. Этот компонент, как и утилита Services в Windows NT, позволяет вам просматривать и администрировать все службы, сконфигурированные в вашей системе. Для просмотра системных служб раскройте папку Services (рис. 25.4).

Раскрытие папки Services для просмотра системных служб


увеличить изображение

Рис. 25.4.  Раскрытие папки Services для просмотра системных служб

Для запуска или отключения какой-либо службы щелкните правой кнопкой мыши на имени этой службы и выберите нужный пункт из появившегося контекстного меню (рис. 25.5).

Щелкните правой кнопкой мыши на соответствующей службе, чтобы появилось контекстное меню


Рис. 25.5.  Щелкните правой кнопкой мыши на соответствующей службе, чтобы появилось контекстное меню

Для просмотра и изменения свойств какой-либо службы нужно выбрать пункт Properties (Свойства) из меню, показанного в предыдущем примере, или дважды щелкнуть на имени этой службы. В обоих случаях появится окно Properties этой службы (рис. 25.6).

 Вкладка General (Общие) окна Properties выбранной службы


Рис. 25.6.  Вкладка General (Общие) окна Properties выбранной службы

Из вкладки General этого окна вы можете изменять тип запуска данной службы (поле Startup type), а также прекращать или приостанавливать (кнопка Stop или Pause) работу службы в зависимости от контекста выполнения. В окнах других вкладок вы можете изменять параметры входа данной службы в Windows 2000 (вкладка Log on). Этот параметр может оказаться очень важным для таких служб, как MS DTC и SQL Server Agent. Вы можете указывать, будут ли они запускаться автоматически, когда происходит запуск системы; вы можете также изменять учетную запись, которую используют SQL Server и MS DTC. Кроме того, вы можете задавать, какие действия будут предприняты в случае отказа соответствующей службы, и можете также просматривать, от каких служб зависит данная служба и какие службы зависят от нее.

Microsoft Message Queuing

Хотя Microsoft Message Queuing (MSMQ) не представлена в консоли управления Component Services, ее можно рассматривать как часть Component Services, поскольку Microsoft Message Queuing использует MS DTC для внешних транзакций. Microsoft Message Queuing позволяет передавать сообщения между различными приложениями и/или различными системами. Message Queuing может передавать транзакционные и нетранзакционные сообщения. Приложения используют Message Queuing для передачи устойчивых сообщений между серверами. Устойчивое сообщение – это сообщение, которое не будет потеряно в случае аварии системы, такой как отказ источника питания. В случае временного отказа питания системы MSMQ восстановит очередь сообщений после возобновления подачи питания. Microsoft Message Queuing использует метод передачи сообщений с промежуточным хранением, при котором сообщения сохраняются в очереди даже при обрыве связи в сети. Кроме того, Message Queuing обладает следующими возможностями:

Как видите, система Microsoft Message Queuing обладает многими возможностями. Но эта лекция посвящена описанию MS DTC – компоненту транзакционных сообщений системы Microsoft Message Queuing.

Microsoft Distributed Transaction Coordinator (MS DTC)

Как уже говорилось, MS DTC – это составная часть служб компонентов Windows 2000 Component Services. (Последняя версия MS DTC вошла в состав SQL Server 7.) В Component Services также включена технология COM+. COM+ используется при необходимости нетранзакционной передачи сообщений, а MS DTC – при необходимости транзакционной передачи.

MS DTC в основном используется для управления распределенными транзакциями. Распределенной называется транзакция, в которой используются данные из двух или более баз данных. Эти базы данных могут находиться в отдельных компьютерных системах или в одной системе. Транзакции между таблицами одной базы данных не считаются распределенными транзакциями. Транзакции между базами данных одной системы можно инициировать как стандартные (нераспределенные) транзакции; однако SQL Server выполняет их как распределенные транзакции.

Обзор MS DTC

Многим приложениям требуется координация транзакций, использующих несколько источников данных. Координация необходима, когда несколько источников данных включаются в одну транзакцию, поскольку это гарантирует выполнение данной транзакции с поддержкой свойства атомарности. Иными словами, координация обеспечивает успешное завершение всех отдельных транзакций (использующих свои источники данных), которые входят в одну большую транзакцию, либо невыполнение всех этих транзакций. Если одна часть транзакции успешно завершена, а другая не выполнена, это может привести к проблемам несогласованности и потерям данных. Служба MS DTC обеспечивает для вас эту координацию. (Без этой службы разработчикам пришлось бы заботиться об определенных схемах согласования распределенных транзакций в своих приложениях.) MS DTC делает это, выполняя двухфазное фиксирование транзакций.

Двухфазное фиксирование транзакций не является какой-то новой технологией и применяется не только для SQL Server. Технология двухфазного фиксирования транзакций известна уже много лет, но ее надежность и производительность были улучшены. Кроме того, повышена гибкость двухфазного фиксирования транзакций. Например, распределенную транзакцию, использующую двухфазное фиксирование, можно выполнять между базой данных SQL Server и базой данных Oracle. Возможность выполнения такой транзакции определяется тем, что в обеих базах данных поддерживается двухфазное фиксирование транзакций и такие протоколы доступа, как ODBC.

Двухфазное фиксирование – это операция фиксирования, разбитая на две части: первая часть – это фаза подготовки, после которой следует фаза фиксирования. Эти фазы инициируются из приложения командой COMMIT, которая указывает службе MS DTC, что нужно выполнить двухфазное фиксирование транзакций. MS DTC координирует эту операцию с системами, участвующими в этой распределенной транзакции, осуществляя взаимодействие с SQL Server в своей системе и с MS DTC в других системах. Компоненты MS DTC, управляющие двухфазным фиксированием, называются диспетчерами ресурсов (resource managers).

Передавая команду COMMIT, MS DTC указывает диспетчерам ресурсов, что нужно выполнить фазу подготовки операции двухфазного фиксирования. На фазе подготовки выполняются все функции, необходимые для того, чтобы произошло фиксирование, включая очистку буферов и внесение записей в журнал транзакций. Операции, выполняемые на этом этапе, аналогичны операциям, входящим в стандартную операцию фиксирования. Единственным отличием является то, что на фазе подготовки SQL Server не помечает транзакцию как фиксированную и не освобождает ресурсы и блокировки, используемые данной транзакцией. После завершения всех действий, необходимых для подготовки транзакции к фиксированию в источнике данных, диспетчер ресурсов для этого источника данных возвращает сигнал успешного завершения диспетчеру транзакций. После получения сигналов успешного завершения ото всех источников данных можно инициировать фазу фиксирования.

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

Примеры использования MS DTC

В этом разделе мы рассмотрим два примера, которые показывают, насколько важны службы координации MS DTC при использовании распределенных транзакций. Эти примеры показывают, что происходит, когда некоторые транзакции в распределенной транзакции завершаются успешно, а некоторые – неуспешно.

Банковские транзакции

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



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



Эти две транзакции выполняются банковским терминалом, инициирующим программу, которая запускает последовательность SQL-операторов в третьей (клиентской) компьютерной системе. Эти SQL-операторы выполняют следующие операции:

  1. Обновляют счет 1 в системе A, снимая с него n долларов.
  2. Фиксируют транзакцию.
  3. Обновляют счет 2 в системе B, добавляя к нему n долларов.
  4. Фиксируют транзакцию.

Этот метод действует, пока в любой из систем нет никаких проблем, но это отнюдь не самый надежный способ перевода денег. Что произойдет при сбое в одной из систем во время этих операций? Возможны следующие результаты:

Второй результат явно неприемлем. Вот более подходящий способ выполнения этой транзакции:

  1. Обновление счета 1 в системе A; с него снимается n долларов.
  2. Обновление счета 2 в системе B; к нему добавляется n долларов.
  3. Фиксирование обеих транзакций в одном наборе. Фиксируются либо обе транзакции, либо ни одна из них.

MS DTC позволяет вам выполнять эти операции. Используя службу MS DTC, вы можете указывать, какие распределенные транзакции фиксируются как один набор. Либо фиксируются все эти транзакции, либо для всех них выполняется откат.

Приложение электронной коммерции

Многие приложения электронной коммерции предназначены для управления тысячами онлайновых пользователей и множеством параллельных транзакций. Компании, использующие такие приложения, часто выполняют их в нескольких системах. Одна компьютерная система может не подходить по многим причинам, включая следующие:

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

Рассмотрим транзакцию в системе электронной коммерции с использованием распределенных транзакций. В этом примере покупатель хочет использовать свою кредитную карточку для приобретения определенного товара – новой миски для собаки – у воображаемой компании под названием Piercetronics. Разобьем эту транзакцию на ее основные компоненты.

Примечание. Существует много способов выполнения транзакций электронной коммерции. Метод, описанный в следующем списке, не обязательно является самым лучшим способом выполнения транзакций электронной коммерции; это относительно простой метод, выбранный для того, чтобы облегчить понимание данного примера.
  1. Покупатель устанавливает соединение с Web-сервером компании Piercetronic. На данный момент он, скорее всего, просматривает статические Web-страницы и фактически не подсоединяется к базе данных.
  2. Просматривая товары, он, в конце концов, находит миску, которую хочет приобрести. Затем он выбирает этот товар, чтобы поместить его в свою покупательскую корзину.
  3. Чтобы поместить товар в покупательскую корзину, требуется выполнить две операции с базой данных:
    • Должен быть выполнен поиск, чтобы определить, какой это покупатель: уже выполнявший покупки (зарегистрированный) или новый покупатель. Если это зарегистрированный покупатель, то считывается идентификатор его счета. (Некоторые приложения делают это в момент покупки.)
    • Выбранный товар помещается в таблицу покупательской корзины.
  4. Когда покупатель указывает, что он готов оплатить покупку, начинается выполнение транзакции или набора транзакций с базой данных для осуществления следующих операций:
    • Выполняется чтение таблицы покупательской корзины, чтобы найти товар, который приобретает покупатель.
    • В таблицу заказов помещается новая строка, содержащая данный заказ.
    • Осуществляется доступ в базу данных покупателей для обновления счета данного покупателя, чтобы выписать счет-фактуру на данный заказ. Поскольку в данном примере информация счетов покупателей хранится в базе данных, отличной от базы данных, содержащей таблицу заказов, то данная транзакция становится распределенной транзакцией.
    • Теперь удаляется запись в таблице покупательской корзины. (Однако в некоторых приложениях таблица покупательской корзины очищается позже в составе пакетной операции.)
    • После обновления таблицы счетов и таблицы заказов можно фиксировать данную транзакцию. На этом выполнение распределенной транзакции заканчивается.
  5. В дальнейшем сотрудники склада компании Piercetronic выполнят доступ в базу данных и составят заказ на доставку. В частности, будут выполнены следующие транзакции:
    • Выполняется запрос к таблице заказов и считывается данный заказ.
    • Соответствующий товар снимается с полки и помещается в коробку для доставки.
    • Система компании Piercetronic подсоединяется к процессору кредитных карточек для снятия денег со счета покупателя. Эта транзакция является распределенной транзакцией, поскольку снимаемая сумма записывается также локально. (Некоторые приложения выписывают счет на карточку покупателя, когда он оплачивает сумму, но это не является типичной процедурой, поскольку получение подтверждения по кредитной карточке обычно занимает больше времени, чем можно держать открытой данную транзакцию.)
    • В составе распределенной транзакции происходит обновление таблицы заказов, а также обновление базы данных, содержащей информацию счетов, чтобы отразить факт доставки.
  6. Происходит доставка пакета с покупкой, и собака покупателя получает новую миску.

При отказе любого из этих компонентов во время распределенных транзакций и при отсутствии службы MS DTC в системе компании Piercetronics, с помощью которой выполняется двухфазное фиксирование, возможно возникновение нескольких проблем, включая следующие:

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

Свойства MS DTC

Как уже говорилось, служба MS DTC используется в SQL Server для координирования транзакций. Она осуществляет сложные процедуры взаимодействия и проверки ошибок, чтобы обеспечивать нужную последовательность событий. Отсутствие службы MS DTC может осложнить координацию обновлений в системах серверов и обеспечение согласованности баз данных.

Вы можете вызывать MS DTC с помощью одного из следующих методов:

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

 Взаимодействие с MS DTC в распределенной транзакции, инициированной из SQL Server


Рис. 25.7.  Взаимодействие с MS DTC в распределенной транзакции, инициированной из SQL Server

При использовании третьего метода (встраивание команд MS DTC в ваше приложение) клиентское приложение и сетевой интерфейс SQL Server будут взаимодействовать с MS DTC, а также с SQL Server. Клиент SQL Server будет помогать в координировании распределенной транзакции. Архитектура этой распределенной транзакции показана на рис. 25.8.

Взаимодействие с MS DTC в распределенной транзакции, инициированной встроенными вызовами MS DTC из приложения


Рис. 25.8.  Взаимодействие с MS DTC в распределенной транзакции, инициированной встроенными вызовами MS DTC из приложения

Программирование MS DTC

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

Вы можете инициировать распределенную транзакцию, выполнив одно из следующих действий:

Вы можете проверять работу MS DTC, инициируя распределенную транзакцию с помощью T-SQL. Распределенная транзакция инициируется с помощью команды T-SQL BEGIN DISTRIBUTED TRANSACTION, и вы фиксируете ее с помощью команды COMMIT, как это показано в следующем примере.

BEGIN DISTRIBUTED TRANSACTION
SELECT 	EmployeeID FROM Northwind.dbo.Employees
SELECT 	emp_id FROM pubs.dbo.employee
GO
COMMIT
GO

Введите только первые четыре строки этой последовательности. Задерживая команду COMMIT и команду завершения GO, вы сможете просмотреть транзакцию в папке Transaction List (Список транзакций) папки Distributed Transaction Coordinator консоли администрирования MMC Component Services. Для просмотра этой папки раскройте папку Component Services, раскройте папку Computers, затем – My Computer и, наконец, раскройте Distributed Transactions Coordinator в консоли администрирования MMC Component Services. После просмотра данной транзакции введите последние две строки этой последовательности команд T-SQL. Отметим, что данная транзакция, теперь уже фиксированная, больше не появится в окне Transaction List. Конечно, большинство распределенных транзакций сложнее данной транзакции и включает обновления и вставки, но этот пример легко выполнить и он не изменяет никаких таблиц базы данных.

Вызов распределенных транзакций обычно происходит из программы с помощью API-вызовов ODBC или DB-LIB, используемых для запуска и завершения каждой транзакции. Распределенные транзакции программируются почти так же, как и другие транзакции, за исключением того, что соединения должны открываться с отключенным параметром автофиксации (Autocommit), чтобы каждый оператор SQL Server не фиксировался автоматически. Служба MS DTC будет управлять двухфазным фиксированием каждый раз, когда соответствующее приложение заканчивает транзакцию с помощью команды COMMIT или ROLLBACK.

Дополнительная информация.. Более подробную информацию по разработке приложений SQL Server см. в книге Inside Microsoft SQL Server 7.0 (Redmond: Microsoft Press, 1999), by Ron Soukup and Kalen Delaney. Если вы используете Microsoft Visual Basic, см. книгу Hitchhiker’s Guide to Visual Basic and SQL Server (Redmond: Microsoft Press, 1998), by William Vaughn.
Администрирование MS DTC

По умолчанию MS DTC инсталлируется вместе с Windows 2000. Все, что вам нужно сделать, – это активизировать эту технологию. Вы можете запустить MS DTC двумя способами: с помощью диспетчера служб SQL Server Service Manager и с помощью компонента системных служб в Component Services, который был описан выше в этой лекции. Чтобы вызвать утилиту SQL Server Service Manager, щелкните на кнопке Start, укажите Programs, Microsoft SQL Server и затем выберите Service Manager (рис. 25.9).

Использование SQL Server Service Manager для запуска MS DTC


Рис. 25.9.  Использование SQL Server Service Manager для запуска MS DTC

Если Distributed Transaction Coordinator не представлен в поле Services (Службы), выберите его из раскрывающегося списка. Для запуска этой службы щелкните на кнопке Start/Continue (Запуск/Продолжить) и для прекращения работы службы щелкните на кнопке Stop. Вам следует также установить флажок, который указывает запуск MS DTC при запуске операционной системы.

Мониторинг MS DTC

Чтобы следить за работой MS DTC, вы должны использовать консоль администрирования Component Services. Запустите эту консоль (как это описано выше в данной лекции) и раскройте Component Services, Computers, My Computer и Distributed Transaction Coordinator (рис. 25.10).

Папка Distributed Transaction Coordinator в консоли администрирования Component Services


увеличить изображение

Рис. 25.10.  Папка Distributed Transaction Coordinator в консоли администрирования Component Services

Вы увидите две опции в этой папке: Transaction List (Список транзакций) и Transaction Statistics (Статистика транзакций).

Transaction List

В представлении Transaction List (рис. 25.11), можно увидеть список распределенных транзакций, которые выполняются в данный момент в вашей системе. Вы можете просматривать свойства транзакции и можете реально воздействовать на транзакцию, вызывая ее фиксирование или прекращение. Для этого нужно щелкнуть правой кнопкой мыши на соответствующей транзакции и выбрать нужный пункт из появившегося контекстного меню.

 Представление Transaction List со списком транзакций MS DTC


увеличить изображение

Рис. 25.11.  Представление Transaction List со списком транзакций MS DTC

Transaction Statistics

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

 Представление Transaction Statistics, где показаны транзакции MS DTC


Рис. 25.12.  Представление Transaction Statistics, где показаны транзакции MS DTC

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

Заключение

В этой лекции вы ознакомились с работой службы MS DTC и созданием распределенных транзакций. Представлен также обзор продуктов и технологий Component Services, поставляемых вместе с Windows 2000. Кроме того, вы узнали, как администрировать компоненты Component Services. В следующих нескольких лекциях вы узнаете о репликации в SQL Server.

Лекция 26. Репликация в Microsoft SQL Server: обзор типов репликации и репликация моментальных снимков

Технология репликации баз данных SQL Server предназначена для того, чтобы помочь вам в распространении данных и хранимых процедур по различным серверам. Проводится рассказ о репликации базы данных, сущность компонентов репликации: издателя, дистрибьютора и подписчика. Большое внимание уделено конфигурированию репликаций. Рассматриваются четыре мастера для работы с репликациями: Create Publication Wizard, Create PullSubscription Wizard, Create Push Subscription Wizard и Disable Publishing And Distribution Wizard. Большое количество примеров, практических заданий и описаний дает хорошие первоначальные знания о репликациях. Более подробно репликации рассматриваются в следующих лекциях.

Технология репликации баз данных Microsoft SQL Server предназначена для того, чтобы помочь вам в распространении данных и хранимых процедур по серверам вашей компании. Репликация позволяет вам конфигурировать системы для автоматического копирования данных в другие системы. Используя репликацию баз данных, вы можете копировать столько данных, сколько вам нужно и можете размещать данные в любом количестве систем. Поскольку процесс репликации выполняется автоматически и поскольку во время репликации в базе данных сохраняется информация о состоянии репликации и реплицированных данных, то не существует никакой опасности потери данных. Если процедура репликации прервана (например, из-за отказа источника питания), то она возобновится с точки отказа, как только системы снова будут работать в обычном режиме.

Репликация – это сложный процесс, поэтому в данной книге для описания репликации выделены три лекции. В этой лекции вы ознакомитесь с основами репликации, а также узнаете о репликации моментальных снимков. В лекции 27 вы узнаете о репликации транзакций и в лекции 28 – о репликации слиянием. В этих трех лекциях содержится информация, необходимая для глубокого понимания репликации SQL Server, включая сведения о конфигурировании, администрировании и использовании технологии репликации.

Что такое репликация базы данных?

Репликация базы данных – это процесс копирования (реплицирования) данных из одной таблицы или базы данных в другую таблицу или базу данных. Используя эту технологию, вы можете распространять копии всей базы данных в несколько систем вашей компании или распространять выбранные части базы данных. При использовании технологии репликации SQL Server происходит автоматизация задачи копирования и распространения данных. После задания параметров и конфигурирования репликации никакого вмешательства пользователя уже не требуется. Поскольку репликация и обработка данных выполняется из базы данных SQL Server, это обеспечивает более высокий уровень стабильности и восстанавливаемости. Если во время репликации происходит сбой (или выполняется другая транзакция SQL Server), то после устранения соответствующей проблемы операции возобновляются с точки, где произошел сбой. В связи с этим многие люди предпочитают репликацию другим методам перемещения данных между системами.

Имеется много возможностей для конфигурирования репликации в вашей сети. Например, вы можете указывать, сколько данных будет реплицироваться. Вы можете задавать допустимый тип доступа к реплицированным копиям – только по чтению или с разрешением модифицирования. И вы можете задавать, насколько часто должны реплицироваться данные. Мы рассмотрим эти и другие парамерБ¤ZQVрБ¤ZQVАИџZQV0:ўZQVXВ¤ZQVВ¤ZQV@В¤ZQVх двух лекций.

Понятия репликации

В этом разделе вы узнаете о базовых понятиях репликации баз данных. Мы рассмотрим такие понятия, как метафора "опубликовать-и-подписаться" (publish-and-subscribe), три типа репликации, данные репликации, распространение данных и агенты репликации.

Компоненты репликации

Репликация в Microsoft SQL Server 2000 основывается на метафоре "опубликовать-и-подписаться", впервые использованной для репликации в SQL Server 6. Эта метафора базируется на трех основных понятиях: издатели, дистрибьюторы и подписчики. Издатель – это система базы данных, которая предоставляет данные для репликации. Дистрибьютор (распространитель) – это система базы данных, которая содержит дистрибутивную базу данных (или псевдоданные), используемую для поддержки и управления репликацией. Подписчик – это система базы данных, которая получает реплицированные данные и сохраняет их в реплицированной базе данных.

Издатели

Издатель – система Microsoft Windows 2000, содержащая базу данных SQL Server. Эта база данных содержит данные, которые должны реплицироваться в другие системы. Кроме того, база данных SQL Server следит за тем, какие данные изменились, чтобы их можно было эффективно реплицировать. Издатель также поддерживает информацию о том, какие данные сконфигурированы для репликации. В зависимости от выбранного типа репликации издатель выполняет больший или меньший объем работы во время процесса репликации. Это описывается более подробно далее.

Среда репликации может содержать несколько подписчиков, но любой заданный набор данных, сконфигурированных для репликации (этот набор называется статьей), может иметь только одного издателя. (Статьи описываются более подробно в разделе "Данные репликации" ниже в этой лекции.) То, что для определенного набора данных имеется только один издатель, не означает, что этот издатель является единственным компонентом, который может модифицировать данные: подписчик тоже может модифицировать и даже повторно публиковать данные. Однако это может потребовать некоторых усилий, как вы увидите из этой лекции и следующих двух лекций.

Дистрибьюторы

Серверы, действующие как дистрибьюторы, кроме дистрибутивной базы данных хранят также метаданные, данные журнала (истории) репликации и другую информацию. Во многих случаях дистрибьютор также управляет распространением данных репликации подписчикам. Издатель и дистрибьютор не обязательно должны быть на одном сервере. На самом деле вы, скорее всего, будете использовать для дистрибьютора выделенный сервер. Для каждого издателя при его создании должен быть задан дистрибьютор, и каждый издатель может иметь только одного дистрибьютора. (Более подробно см. в разделе "Конфигурирование публикования и распространения" далее.)

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

Как уже говорилось, подписчики – это серверы баз данных, которые хранят реплицированные данные и получают информацию об изменениях. Подписчики также могут вносить изменения и являться издателями для других систем. Чтобы подписчик получал реплицированные данные, он должен подписаться на эти данные. Подписка на репликацию подразумевает конфигурирование подписчика для получения этих данных. Подписка – это информация базы данных, на которую вы подписываетесь. (Более подробно о связях между этими компонентами см. в разделе "Конфигурирование репликации моментальных снимков" далее.)

Типы репликации

В SQL Server используется три типа репликации: репликация моментальных снимков, репликация транзакций и репликация слиянием. Эти типы репликации поддерживают различные уровни согласованности данных в реплицированной базе данных, и они налагают различные уровни нагрузки на серверы.

Репликация моментальных снимков

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

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

Репликация транзакций

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

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

Репликация слиянием

Репликация слиянием выполняется аналогично репликации транзакций в том смысле, что она следит за всеми изменениями, которые вносятся в статьи. Но вместо отдельного распространения транзакций, которые вносят изменения, репликация слиянием периодически передает пакет изменений. И поскольку при репликации слиянием данные передаются пакетами, она похожа на репликацию снимков. (Хотя в случае репликации снимков распространяются все данные, сконфигурированные для репликации, а не только изменения.) (О репликация слиянием см. лекцию 28.)

Данные репликации

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

Статьи

Как уже говорилось, статья – это отдельный набор данных, который подлежит репликации. Статья может быть целой таблицей, подмножеством таблицы, состоящим из определенных колонок или строк, или хранимой процедурой. Вы создаете эти подмножества с помощью фильтров. Фильтр, используемый для создания подмножества, состоящего из строк, называется горизонтальным фильтром. Фильтр, используемый для создания подмножества, состоящего из колонок, называется вертикальным фильтром. Более подробное описание горизонтальных и вертикальных фильтров приводится ниже в этой лекции.

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

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

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

Push-подписка и pull-подписка

Реплицируемые данные можно распространять целым рядом способов. Все методы распространения базируются либо на push-подписке (принудительная подписка), либо на pull-подписке (подписка по запросу). Подписчик может одновременно использовать сочетание push- и pull-подписок.

Push-подписка (принудительная)

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

Использование push-подписки дает вам высокий уровень гибкости в планировании графика репликаций. Push-подписки можно конфигурировать таким образом, чтобы распространять изменения сразу после их реализации или выполнять модификации на основе какого-либо регулярного расписания. Более подробная информация по этим возможностям приводится в разделе "Конфигурирование репликации моментальных снимков" ниже в этой лекции.

Pull-подписка (по запросу)

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

Агенты репликации

Для выполнения операций, необходимых для перемещения реплицируемых данных от издателя к дистрибьютору и затем подписчику, используются несколько агентов: Snapshot Agent, Log Reader Agent, Distribution Agent и Merge Agent. В этом разделе вы узнаете, что делают эти агенты и как управлять ими.

Snapshot Agent (Агент создания снимков состояния)

Агент Snapshot Agent используется для создания и распространения снимков мгновенного состояния от издателя дистрибьютору (или в местоположение снимка). Snapshot Agent создает данные репликации (снимок), а также создает информацию (метаданные), которая используется агентом Distribution Agent для распространения этих данных. Snapshot Agent сохраняет снимок на дистрибьюторе (или в указанном вами месте). Snapshot Agent также обеспечивает поддержку информации о состоянии синхронизации объектов репликации; эта информация хранится в дистрибутивной базе данных.

Snapshot Agent большую часть времени находится в неактивном состоянии и может периодически активизироваться в соответствии с заданным вами расписанием для выполнения своих задач. При каждом запуске Snapshot Agent выполняет следующие задачи.

  1. Snapshot Agent устанавливает соединение от дистрибьютора к издателю. Если соединение недоступно, то Snapshot Agent не продолжает создание снимка. После установления соединения Snapshot Agent блокирует все статьи, участвующие в репликации, чтобы обеспечить согласованность данных в снимке. (По этой причине не стоит планировать репликацию снимков на периоды пиковой нагрузки.)
  2. Snapshot Agent устанавливает соединение от издателя к дистрибьютору. После установления этого соединения Snapshot Agent формирует копию схемы для каждой статьи и сохраняет эту информацию в дистрибутивной базе данных. Эти данные трактуются как метаданные.
  3. Snapshot Agent получает снимок реальных данных издателя и записывает их в файл в местоположении для снимка. Местоположением снимка не обязательно является дистрибьютор. Если в репликации участвуют только системы, относящиеся к SQL Server, то файл сохраняется как собственная программа массового копирования. (Массовое копирование описывается в лекции 24.) Если в репликации участвуют системы различных типов, то данные сохраняются в текстовых файлах. На данном этапе информация для синхронизации указывается агентом Snapshot Agent.
  4. После копирования данных Snapshot Agent обновляет информацию в дистрибутивной базе данных.
  5. Snapshot Agent освобождает блокировки, которые он захватывал по статьям и протоколирует снимок в файле журнала (истории).

Как видите, Snapshot Agent обеспечивает только создание снимка; он не распространяет его подписчикам. Эту задачу выполняют другие агенты.

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

Примечание. В случае использования репликации транзакций или репликации слиянием обновление снимка не требуется (если не добавляются новые подписки).
Log Reader Agent (Агент чтения журнала)

Агент Log Reader Agent используется в репликации транзакций для извлечения информации об изменениях из журнала транзакций на издателе для репликации этих команд в дистрибутивную базу данных. Каждая база данных, использующая репликацию транзакций, имеет собственного агента Log Reader Agent на издателе. (О Log Reader Agent см. лекцию 27.)

Distribution Agent (Агент распространения)

Агент Distribution Agent распространяет снимки и транзакции из дистрибутивной базы данных подписчикам. Каждая публикация имеет собственного агента Distribution Agent. Если вы используете push-подписку, то Distribution Agent выполняется на дистрибьюторе. Если вы используете pull-подписку, то Distribution Agent выполняется на подписчике.

Merge Agent (Агент слияния)

Агент Merge Agent используется в репликации слиянием для согласования (слияния) накопившихся изменений, выполненных с момента последнего согласования. Если вы используете репликацию слиянием, то агенты Distribution Agent и Snapshot Agent не используются: взаимодействие с издателем и дистрибьютором осуществляет Merge Agent. (О Merge Agent см. лекцию 28.)

Queue Reader Agent (Агент очередей)

Агент Queue Reader Agent используется для распространения выполненных изменений подписчикам репликации снимков или репликации транзакций, которые были сконфигурированы с опцией отложенных обновлений (Queued updating). Эта опция позволяет вносить изменения на подписчике без необходимости использования какой-либо распределенной транзакции.

Мониторинг работы агентов

Вы можете следить за любым из агентов с помощью Enterprise Manager. Для этого выполните следующие шаги.

  1. В окне Enterprise Manager раскройте группу серверов и затем раскройте папку для сервера, используемого как дистрибьютор.
  2. Раскройте папку Replication Monitor и затем раскройте папку Agents (Агенты).
  3. Раскройте тип агента, за работой которого вы хотите следить.
  4. В правой панели щелкните правой кнопкой мыши на агенте, за которым вы хотите следить, и выберите из появившегося контекстного меню пункт Agent History (Журнал работы агента) для просмотра журнала операций данного агента.

Конфигурирование публикования и распространения

Теперь, когда вы ознакомились с базовыми понятиями репликации, мы рассмотрим, как выполняется первый шаг конфигурирования репликации в SQL Server: задание параметров публикования и распространения. Для выполнения этой задачи используется мастер конфигурирования публикования и распространения Configure Publishing And Distribution Wizard. (Хотя репликацию SQL Server можно полностью сконфигурировать с помощью хранимых процедур, предпочтительным методом является использование мастеров конфигурирования репликации.) Ниже приводится список других мастеров, используемых в процессе конфигурирования репликации (доступ ко всем этим мастерам осуществляется через Enterprise Manager).

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

  1. В окне Enterprise Manager щелкните на сервере, который хотите конфигурировать как дистрибьютор. Выберите из меню Tools пункт Wizards (Мастера). В появившемся диалоговом окне Select Wizard (Выбор мастера) раскройте папку Replication (Репликация) и затем выберите мастер Configure Publishing and Distribution Wizard (рис. 26.1). Щелкните на кнопке OK.

     Диалоговое окно Select Wizard (Выбор мастера)


    Рис. 26.1.  Диалоговое окно Select Wizard (Выбор мастера)

  2. Появится начальное окно мастера Configure Publishing and Distribution Wizard (рис. 26.2).

     Начальное окно мастера Configure Publishing and Distribution Wizard


    Рис. 26.2.  Начальное окно мастера Configure Publishing and Distribution Wizard

  3. Щелкните на кнопке Next, чтобы появилось окно Select Distributor (Выбор дистрибьютора) (рис. 26.3).
  4. В этом окне вы можете сделать сервер, выбранный на шаге 1, как дистрибьютором, так и издателем, или сконфигурировать только публикование и использовать уже сконфигурированный дистрибьютор. Если вы хотите использовать в качестве дистрибьютора последнюю выбранную систему, щелкните на первой кнопке выбора. После этого мастер создаст для вас дистрибутивную базу данных и журнал. Если вы хотите использовать для дистрибьютора другую систему SQL Server, щелкните на второй кнопке выбора. Если нет никаких других систем, сконфигурированных как дистрибьюторы, то будет доступна только первая кнопка выбора. Скорее всего, вы захотите выделить для дистрибьютора отдельную систему.

     Окно Select Distributor (Выбор дистрибьютoра)


    Рис. 26.3.  Окно Select Distributor (Выбор дистрибьютoра)

    Примечание. Для одного издателя можно определить только одного дистрибьютора. Для всех публикаций должен использоваться один и тот же дистрибьютор.
  5. Если вы решили использовать в качестве дистрибьютора другую систему, то вы должны зарегистрировать эту систему SQL Server и она уже должна быть сконфигурирована как дистрибьютор. Щелкните на кнопке Add Server (Добавить сервер) в окне Registered SQL Server Properties (Свойства зарегистрированного SQL Server), выберите метод аутентификации для установления соединения с системой SQL Server на данном дистрибьюторе.
  6. В целях нашего примера сделайте дистрибьютором систему, которую вы конфигурируете. В конце концов, в этом разделе описывается, как конфигурировать дистрибьютор.
  7. На этом шаге мастер проверяет, что издатель имеет доступ к дистрибьютору. Если учетная запись, которую использует SQL Server, не дает доступа, то будет вызвано окно SQL Server Agent Properties (Свойства агента SQL Server), чтобы вы могли модифицировать учетную запись подключения (login-запись) этого агента (рис. 26.4).
    Примечание. Если в процессе инсталляции вы сконфигурировали для SQL Server использование учетной записи LocalSystem, то появится предупреждение, что учетная запись LocalSystem имеет полномочия доступа только в локальной системе. Если в процессе инсталляции вы сконфигурировали SQL Server для использования учетной записи на уровне домена, то вы не получите этого предупреждения и вам не нужен будет доступ к окну SQL Server Agent Properties.

     Окно SQL Server Agent Properties (Свойства агента SQL Server)


    Рис. 26.4.  Окно SQL Server Agent Properties (Свойства агента SQL Server)

  8. В этом окне вы можете модифицировать и другие свойства агента SQL Server Agent. (Более подробную информацию см. в лекции 31.) По окончании модифицирования SQL Server Agent щелкните на кнопке OK.
  9. Появится окно Configure SQL Server Agent (Конфигурирование SQL Server Agent) (рис. 26.5). В этом окне запрашивается, чтобы вы сконфигурировали SQL Server Agent для автоматического запуска. Репликация выполняется под управлением SQL Server Agent, и если этот агент не работает, то ничего не будет реплицироваться. Щелкните на первой кнопке выбора для автоматического запуска SQL Server Agent (рекомендуемый вариант) или на второй кнопке выбора для запуска вручную. Для продолжения щелкните на кнопке Next.

      Окно Configure SQL Server Agent (Конфигурирование SQL Server Agent)


    Рис. 26.5.  Окно Configure SQL Server Agent (Конфигурирование SQL Server Agent)

  10. Появится окно Specify Snaphot Folder (Задание папки для снимка) (рис. 26.6). В этом окне вы можете задать местоположение для снимка. Это директория, где находятся снимки. Выберите новое местоположение или оставьте местоположение по умолчанию. Для продолжения щелкните на кнопке Next.

    Окно Specify Snaphot Folder (Задание папки для снимка)


    Рис. 26.6.  Окно Specify Snaphot Folder (Задание папки для снимка)

  11. Появится окно Customize the Configuration (Настройка конфигурации) (рис. 26.7).

    Окно Customize the Configuration (Настройка конфигурации)


    Рис. 26.7.  Окно Customize the Configuration (Настройка конфигурации)

  12. В этом окне вы можете оставить без изменения принятые по умолчанию параметры для дистрибутивной базы данных (вторая кнопка выбора) или выбрать настройку дистрибутивной базы данных (первая кнопка выбора). Если вас устраивают параметры по умолчанию, то процесс завершен и вы переходите к последнему окну. Для данного примера щелкните на первой кнопке выбора.
    Примечание. Принятое по умолчанию местоположение файлов данных SQL Server может находиться на диске с недостаточной производительностью и емкостью. На следующем шаге вы увидите, как переместить дистрибутивную базу данных на диск с достаточной мощностью и производительностью ввода-вывода.
  13. Щелкните на кнопке Next, чтобы появилось окно Provide Distribution Database Information (Задание информации о дистрибутивной базе данных) (рис. 26.8). Здесь вы можете указать имя этой базы данных и местоположения для файлов дистрибутивной базы данных и журналов. Вы должны сделать это, если размер дистрибутивной базы данных превысит пространство, доступное в местоположении по умолчанию.

     Окно Provide Distribution Database Information (Задание информации о дистрибутивной базе данных)


    Рис. 26.8.  Окно Provide Distribution Database Information (Задание информации о дистрибутивной базе данных)

  14. Щелкните на кнопке Next, чтобы появилось окно Enable Publishers (Активизация издателей) (рис. 26.9). В этом окне вы можете выбрать использование издателя, отличного от сервера, выбранного на шаге 1, или добавить издателей. (Чтобы установить соединение с SQL Server на другом издателе, щелкните на кнопке New.)
  15. Щелкните на кнопке Next, чтобы появилось окно Enable Publication Databases (Активизация баз данных для публикации) (рис. 26.10). Здесь вы можете активизировать репликацию транзакций или репликацию слиянием для определенных баз данных. По умолчанию на издателе не активизируется ни одной базы данных. Если пропустить этот шаг, то вы создадите издателя и дистрибьютора, но не определите никаких публикаций. Вы можете определить публикации позже с помощью мастера Create Publication Wizard, что является предпочтительным методом.
  16. Щелкните на кнопке Next, чтобы появилось окно Enable Subscribers (Активизация подписчиков) (рис. 26.11). В этом окне вы можете выбрать подписчика для выбранного вами издателя. Однако предпочтительнее сделать это отдельно с помощью мастера Configure Publishing and Distribution Wizard.

    Окно Enable Publishers (Активизация издателей)


    Рис. 26.9.  Окно Enable Publishers (Активизация издателей)

     Окно Enable Publication Databases (Активизация баз данных для публикации)


    Рис. 26.10.  Окно Enable Publication Databases (Активизация баз данных для публикации)

     Окно Enable Subscribers (Активизация подписчиков)


    Рис. 26.11.  Окно Enable Subscribers (Активизация подписчиков)

  17. Щелкните на кнопке Next, чтобы появилось окно мастера Completing the Configure Publishing and Distribution Wizard (Завершение конфигурирования публикования и распространения) (рис. 26.12). В этом окне показана сводка ваших параметров. Щелкните на кнопке Finish (готово), чтобы применить созданную вами конфигурацию. Это может занять несколько минут. По завершении этого процесса вы увидите несколько информационных окон, где будет описано выполнение процесса, а также указано, нужно ли вам сконфигурировать SQL Server Agent для автоматического запуска. Для выполнения агентов репликации должен быть запущен агент SQL Server Agent. Отметим, что по окончании работы этого мастера в окне Enterprise Manager появится папка Replication Monitor.

    Окно Completing the Configure Publishing and Distribution Wizard (Завершение конфигурирования публикования и распространения)


    Рис. 26.12.  Окно Completing the Configure Publishing and Distribution Wizard (Завершение конфигурирования публикования и распространения)

    Примечание. Если вы хотите изменить конфигурацию реплицируемой базы данных, щелкните на имени этой базы данных в окне Enterprise Manager и укажите в меню Tools пункт Replication, чтобы появилось подменю, содержащее пункты для управления вашей конфигурацией.

Репликация моментальных снимков

В этом разделе приводится подробная информация о репликации снимков. Сначала вы узнаете, когда следует использовать репликацию снимков. Затем вы узнаете, как конфигурировать этот тип репликации.

Применение репликации снимков

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

К типам приложений, которым может помочь применение репликации снимков, можно отнести:

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

Конфигурирование репликации моментальных снимков

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

Конфигурирование публикаций

Конфигурирование публикации позволяет вам указывать, какие данные будут реплицироваться, как они будут реплицироваться и когда будет происходить репликация. Для конфигурирования публикации выполните следующие шаги.

  1. В окне Enterprise Manager откройте меню Tools. Далее укажите пункт Replication (Репликация) и затем выберите команду Create and Manage Publications (Создание и управление публикациями) или выберите пункт Wizards, раскройте в появившемся диалоговом окне Select Wizard папку Replication и выберите Create Publication Wizard. В обоих случаях появится диалоговое окно Create and Manage Publications (рис. 26.13). В этом диалоговом окне вы можете выбрать базу данных или таблицу, содержащую данные, которые вы хотите публиковать.

     Диалоговое окно Create and Manage Publications (Создание и управление публикациями)


    Рис. 26.13.  Диалоговое окно Create and Manage Publications (Создание и управление публикациями)

    Если публикации уже существуют, то в дополнение к кнопке Create Publication (Создать публикацию) будут доступны следующие кнопки:
    • Push New Subscription (Новая push-подписка).Позволяет вам создать новую push-подписку для уже существующей публикации. Этот процесс описан в разделе "Конфигурирование подписок" ниже в этой лекции.
    • Properties and Subscriptions (Свойства и подписки). Позволяет вам модифицировать свойства как публикаций, так и подписок.
    • Script Publication (Сценарий создания публикации).Позволяет вам создать сценарий, который можно использовать для создания других публикаций.
    • Delete Publication (Удалить публикацию).Позволяет вам удалить уже сконфигурированную публикацию.
  2. Выберите базу данных, которую хотите использовать для данной публикации (на рис. 26.13 выбрана база данных Northwind), и затем щелкните на кнопке Create Publication для вызова мастера создания публикаций Create Publication Wizard. Появится начальное окно мастера Create Publication Wizard (рис. 26.14).

    Начальное окно мастера Create Publication Wizard (Создание публикаций)


    Рис. 26.14.  Начальное окно мастера Create Publication Wizard (Создание публикаций)

  3. Обратите внимание на флажок Show advanced options in this wizard (Показать дополнительные параметры в этом мастере) внизу этого окна. В данном примере мы не будем устанавливать этот флажок. Если установить этот флажок, то мастер предложит вам варианты создания подписок с немедленными обновлениями (immediate updating) и отложенными обновлениями (queued updating). Этот дополнительный выбор позволяет подписчикам обновлять данную публикацию так же, как и издателю. Кроме того, мастер предложит вам возможность преобразования данных в подписках.

    Щелкните на кнопке Next, чтобы появилось окно Choose Publication Database (Выбор базы данных для публикации) (рис. 26.15). В этом окне вы можете (снова) выбрать базу данных, содержащую данные, которые хотите публиковать. Будет выделена база данных, выбранная вами на шаге 2.

  4. Щелкните на кнопке Next, чтобы появилось окно Select Publication Type (Выбор типа публикации) (рис. 26.16).

     Окно Choose Publication Database (Выбор базы данных для публикаций)


    Рис. 26.15.  Окно Choose Publication Database (Выбор базы данных для публикаций)

    Окно Select Publication Type (Выбор типа публикаций)


    Рис. 26.16.  Окно Select Publication Type (Выбор типа публикаций)

    В этом окне вы можете выбрать один из трех типов репликации. Будут представлены следующие варианты выбора:
    • Snapshot publication (Публикация для репликации снимков). Создает публикацию для репликации снимка соответствующей статьи, который периодически копируется на подписчик. Такую публикацию можно создавать из любой таблицы.
    • Transactional publication (Публикация для репликации транзакций). Создает публикацию для репликации транзакций, в соответствии с которыми происходит обновление подписки изменениями, выполненными на издателе. Статьи могут создаваться только из таблиц с первичным ключом.
    • Merge publication (Публикация для репликации слиянием). Создает публикацию для репликации слиянием, которая позволяет выполнять двустороннюю репликацию между издателем и подписчиком. Статьи могут создаваться из любых таблиц.
  5. Щелкните на кнопке выбора Snapshot Publication и щелкните на кнопке Next, чтобы появилось окно Specify Subscriber Types (Указание типов подписчиков) (рис. 26.17). В этом окне вы можете указывать, будут ли все подписчики использовать SQL Server. На рис. 26.17 показана установка по умолчанию, которая указывает, что все подписчики будут работать с SQL Server 2000 (Servers running SQL Server 2000). Если вас устраивает этот выбор, то вы конфигурируете репликацию для использования собственных типов данных SQL Server 2000. Если в вашей конфигурации имеются системы с SQL Server 7, установите второй флажок. Если в вашей конфигурации имеются системы, не использующие SQL Server, вам следует установить третий флажок, который указывает, что данные репликации будут преобразовываться с символьный формат. Это преобразование сложных собственных типов данных приводит к дополнительной нагрузке на серверы.

    Окно Specify Subscriber Types (Указание типов подписчиков)


    Рис. 26.17.  Окно Specify Subscriber Types (Указание типов подписчиков)

  1. Щелкните на кнопке Next, чтобы появилось окно Specify Articles (Указание статей) (рис. 26.18). В этом окне вы можете указывать таблицы и другие объекты, которые будут реплицироваться как статьи. Эти статьи образуют публикацию, которую вы создаете. В левом списке этого окна вы можете установить один или несколько флажков колонки Show (Показать), чтобы вывести в правом списке список объектов, который может включать таблицы, хранимые процедуры и представления. Затем, устанавливая флажки в правом списке, вы можете по отдельности задать любое количество таблиц, хранимых процедур и представлений для публикации. Или вы можете просто установить один или несколько флажков в колонке Publish All (Публиковать все) левого списка для выбора всех элементов объектов соответствующего типа в текущей базе данных для публикации. Напомним, что каждая таблица, хранимая процедура или представление рассматриваются как статья, а публикация – это набор логически сгруппированных статей.

    Кроме того, обратите внимание на кнопку Article Defaults (Установки по умолчанию для статей) этого окна. Эта кнопка позволяет вам задавать параметры по умолчанию для различных статей вашей системы. При щелчке на этой кнопке у вас будет запрошен выбор типа статьи. Щелкните на Table Articles (Статья-таблица) и щелкните на кнопке OK. Появится окно Default Table Article Properties (Свойства по умолчанию статьи-таблицы) (рис. 26.19). Во вкладке General (Общие) вы можете задавать такие параметры, как:

    • имя статьи (поле Name);
    • описание статьи (Description);
    • имя таблицы-получателя данной статьи (Destination table name);
    • владельца таблицы-получателя данной статьи (Destination table owner).

       Окно Specify Articles (Указание статей)


      Рис. 26.18.  Окно Specify Articles (Указание статей)

       Вкладка General окна Default Table Article Properties (Свойства по умолчанию статьи-таблицы)


      Рис. 26.19.  Вкладка General окна Default Table Article Properties (Свойства по умолчанию статьи-таблицы)

      Во вкладке Snapshot (Снимок) (рис. 26.20), вы можете задавать следующее:

       Вкладка Snapshot (Снимок) окна Default Table Article Properties


      Рис. 26.20.  Вкладка Snapshot (Снимок) окна Default Table Article Properties

    • отсекать любые существующие данные и задавать, как обрабатываются индексы;
    • задавать, копируются ли кластеризованные и некластеризованные индексы;
    • задавать, преобразуются ли определяемые пользователем типы данных в базовые типы данных;
    • задавать, реплицируются ли ограничения.
    Задайте нужные вам установки и щелкните на кнопке OK.
  2. Когда вы будете готовы выйти из окна Specify Articles, щелкните на кнопке Next. Будет выполнен анализ публикации. Если вы публикуете базу данных Northwind, как в данном примере, то появится окно сообщения (рис. 26.21). Оно информирует вас, что вы пытаетесь реплицировать колонку типа IDENTITY и что свойство IDENTITY публикуемой колонки не будет передаваться в соответствующую колонку таблицы подписчика.

     Окно сообщения, которое появляется, если вы пытаетесь реплицировать колонку типа IDENTITY


    Рис. 26.21.  Окно сообщения, которое появляется, если вы пытаетесь реплицировать колонку типа IDENTITY

  3. После завершения анализа данной публикации (и после щелчка на кнопке OK для возврата в окно мастера, если появилось окно информационного сообщения) появится окно Select Publication Name and Description (Выбор имени и описания публикации) (рис. 26.22). В этом окне вы просто указываете имя и описание публикации. Вы можете также установить флажок List this publication in Active Directory (Включить эту публикацию в список Active Directory).

     Окно Select Publication Name and Description (Выбор имени и описания публикации)


    Рис. 26.22.  Окно Select Publication Name and Description (Выбор имени и описания публикации)

  4. Щелкните на кнопке Next, чтобы появилось окно Customize the Properties of the Publication (Настройка свойств данной публикации) (рис. 26.23). В этом окне вы указываете, будете ли определять фильтры данных (щелчком на кнопке выбора Yes) или будете использовать принятые по умолчанию параметры конфигурации (щелчком на кнопке выбора No). Щелкнув на кнопке выбора No и щелкнув затем на кнопке Next, вы переходите в окно Completing the Create Publication Wizard (Завершение работы мастера создания публикации) (рис. 26.31). В данном примере мы щелкнем на кнопке выбора Yes, чтобы увидеть оставшиеся окна и задать дополнительные параметры.
  5. Щелкните на кнопке Next, чтобы появилось окно Filter Data (Фильтрация данных) (рис. 26.24). В этом окне вы указываете, хотите ли вы фильтровать данные по вертикали (фильтрация колонок) или по горизонтали (фильтрация строк). В данном примере мы выберем и вертикальную, и горизонтальную фильтрацию.
    Примечание.Фильтрация используется для одних и тех целей в случае репликации снимков или репликации транзакций. Однако способ выполнения фильтрации зависит от типа используемой репликации. В следующей лекции приводится дополнительная информация о влиянии фильтрации на репликацию транзакций. В случае репликации снимков фильтрацию выполняет предложение WHERE, используемое для создания снимка. (На шаге 13 данного раздела описано, как задавать предложение WHERE.)

    Окно Customize the Properties of the Publication (Настройка свойств в данной публикации)


    Рис. 26.23.  Окно Customize the Properties of the Publication (Настройка свойств в данной публикации)

    Окно Filter Data (Фильтрация данных)


    Рис. 26.24.  Окно Filter Data (Фильтрация данных)

  1. Щелкните на кнопке Next, чтобы появилось окно Filter Table Columns (Фильтрация колонок таблицы) (рис. 26.25). В этом окне вы можете исключать колонки из данной репликации. Сначала выберите таблицу из списка Tables in publication (Таблицы в публикации) и затем в списке Columns in selected table (Колонки в выбранной таблице) сбросьте флажки рядом с колонками, которые не хотите реплицировать. Это позволяет осуществлять вертикальную фильтрацию статьи, при которой будет создаваться реплицированная таблица с меньшим количеством колонок, чем в таблице издателя.
    Примечание. Колонки с первичным ключом нельзя включать в фильтрацию. Причину вы узнаете в следующей лекции.

    Окно Filter Table Columns (Фильтрация колонок таблицы)


    Рис. 26.25.  Окно Filter Table Columns (Фильтрация колонок таблицы)

  2. Щелкните на кнопке Next, чтобы появилось окно Filter Table Rows (Фильтрация строк таблицы) (рис. 26.26). В этом окне вы можете выбирать таблицы, в которых хотите фильтровать данные по строкам. Выберите таблицу и щелкните на кнопке Build [...] (Создать [...]), чтобы создать фильтр.

    Окно Filter Table Rows (Фильтрация строк таблицы)


    Рис. 26.26.  Окно Filter Table Rows (Фильтрация строк таблицы)

  3. Появится диалоговое окно Specify Filter (Задать фильтр) (рис. 26.27). В этом диалоговом окне вы можете добавлять к SQL-оператору предложение WHERE, которое будет использоваться для фильтрации строк данных. По окончании выбора строк, которые будут реплицироваться, щелкните на кнопке OK, чтобы вернуться в окно мастера.
  4. Щелкните на кнопке Next, чтобы появилось окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам) (рис. 26.28). В этом окне вы можете указывать, могут ли получать доступ к данным репликации анонимные подписчики (первая кнопка выбора), или это могут делать только известные подписчики (вторая кнопка выбора). Ваш выбор должен основываться на требованиях вашей конфигурации.

     Диалоговое окно Specify Filter (Задать фильтр)


    Рис. 26.27.  Диалоговое окно Specify Filter (Задать фильтр)

     Окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам)


    Рис. 26.28.  Окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам)

  5. Щелкните на кнопке Next, чтобы появилось окно Set Snapshot Agent Schedule (Задать расписание для Snapshot Agent) (рис. 26.29). В этом окне вы можете согласиться с принятым по умолчанию расписанием запусков агента Snapshot Agent или вызвать диалоговое окно, в котором можете задать новое расписание.

    Окно Set Snapshot Agent Schedule (Задать расписание для Agent Schedule)


    Рис. 26.29.  Окно Set Snapshot Agent Schedule (Задать расписание для Agent Schedule)

  6. Щелкните на кнопке Change (Изменить), чтобы появилось диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) (рис. 26.30). В этом диалоговом окне вы можете задавать, когда будет выполняться репликация снимков. Выберите расписание, которое наиболее отвечает вашим потребностям. Расписание, показанное на рис. 26.30, заканчивает свое действие в тот же день, когда оно начинает действовать. Если вы конфигурируете репликацию снимков (как в данном примере), то вы должны задать выполнение этого задания в виде повторяющегося расписания, если хотите, чтобы происходило периодическое обновление снимка. При конфигурировании репликации транзакций вы должны запускать получение снимка после того, как создали новую подписку, если только эта подписка не является анонимной. Репликация слиянием всегда применяет к подписчику последний полученный снимок. По окончании установки расписания щелкните на кнопке OK.

    Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий)


    Рис. 26.30.  Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий)

  7. Щелкните на кнопке Next, чтобы появилось окно мастера Completing the Create Publication Wizard (рис. 26.31). В нем представлена сводка заданной вами информации о данной публикации.

    Окно Completing the Create Publication Wizard


    Рис. 26.31.  Окно Completing the Create Publication Wizard

  8. Просмотрев сводку, щелкните на кнопке Finish. Вы увидите ход выполнения работы этого мастера по мере создания публикации. Затем появится диалоговое окно (рис. 26.32) с сообщением, что создание публикации завершено.

     Диалоговое окно, информирующее о завершении задачи


    Рис. 26.32.  Диалоговое окно, информирующее о завершении задачи

Вы создали публикацию, которую можно распространять подписчикам. Вы можете активизировать подписчиков или модифицировать свойства этой публикации в диалоговом окне Create and Manage Publications (описано выше в этом разделе).

Модифицирование расписания репликации снимков

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

Чтобы сконфигурировать расписание репликации снимков, выполните следующие шаги.

  1. В окне Enterprise Manager раскройте сервер, который хотите модифицировать, раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Snapshot Agents.
  2. В правой панели щелкните правой кнопкой мыши на данной публикации и выберите из появившегося контекстного меню пункт Agent Properties (Свойства агентов) (рис. 26.33).

    Публикация, представленная в окне Enterprise Manager


    увеличить изображение

    Рис. 26.33.  Публикация, представленная в окне Enterprise Manager

  3. Появится окно Properties (Свойства) (рис. 26.34). В этом окне представлены свойства для выбранного вами агента публикации.
  4. Щелкните на вкладке Schedules (Расписания) (рис. 26.35). В этой вкладке показано текущее расписание для данной публикации. С помощью кнопки New Schedule (Создать расписание) вы можете добавить новое расписание. С помощью кнопки New Alert (Создать оповещение) вы можете создать новое оповещение. Кнопка Edit (Редактирование) используется для модифицирования какого-либо существующего расписания. Кнопка Delete (Удаление) используется для удаления какого-либо существующего расписания.

    Вкладка General окна свойств агента


    Рис. 26.34.  Вкладка General окна свойств агента

    Вкладка Schedules окна свойств агента


    Рис. 26.35.  Вкладка Schedules окна свойств агента

  5. Щелкните на кнопке Edit, чтобы появилось диалоговое окно Edit Job Schedule (Редактирование расписания заданий) (рис. 26.36). В этом диалоговом окне вы можете конфигурировать агент Snapshot Agent для его запуска по расписанию, которое отвечает вашим требованиям. Чтобы изменить повторяющееся расписание, нужно сначала щелкнуть на кнопке Change, с помощью которой вызывается диалоговое окно Edit Recurring Job Schedule. В диалоговом окне Edit Job Schedule вы можете конфигурировать данный агент таким образом, чтобы он запускался, когда простаивает центральный процессор (ЦП) (вторая кнопка выбора), что является новой возможностью SQL Server. Этот тип расписания может оказаться полезным в некоторых случаях, но, выбрав его, вы не будете точно знать, когда будет запускаться агент. Введите нужное вам расписание и щелкните на кнопке OK.

    Диалоговое окно Edit Job Schedule (Редактировать расписание задач)


    Рис. 26.36.  Диалоговое окно Edit Job Schedule (Редактировать расписание задач)

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

Активизация подписчиков

Прежде чем конфигурировать подписчиков, вы должны активизировать их в дистрибутивной базе данных. Активизация подписчика позволяет системе SQL Server взаимодействовать с дистрибутивной базой данных. Установив соединение между дистрибутивной базой данных и подписчиком, вы можете конфигурировать подписки (см. раздел "Конфигурирование подписок".) Чтобы активизировать подписчика, выполните следующие шаги.

  1. В меню Tools окна Enterprise Manager укажите пункт Replication и затем выберите пункт Configure Publishing, Subscribers, and Distribution (Конфигурировать публикование, подписчиков и распространение); или выберите в меню Tools пункт Wizards, в появившемся диалоговом окне Select Wizard раскройте папку Replication и затем выберите Configure Publishing and Distribution Wizard. При обоих методах появится окно Publisher and Distributor Properties (Свойства издателя и дистрибьютора) (рис. 26.37).
  2. В окне Publisher and Distributor Properties щелкните на вкладке Subscribers (рис. 26.38). Здесь вы увидите текущий список подписчиков, определенных в вашей сети. Чтобы подписка отправлялась подписчику, вы должны определить здесь этого подписчика.

    В этой вкладке вы можете выбрать подписчиков, которые имеют полномочия подписки на издателя, указанного в этой вкладке. Открыв в первый раз окно Publisher and Distributor Properties, вы увидите в списке только систему издателя, так как еще не добавили ни одного подписчика.

  3. Чтобы добавить подписчика, сначала щелкните на кнопке New, чтобы появилось диалоговое окно Enable New Subscriber (Активизировать нового подписчика) (рис. 26.39). В этом диалоговом окне нужно выбрать вид подписчика, которого вы хотите активизировать (SQL Server, Microsoft Access, OLE DB, ODBC и т.д.). Тем самым определяется тип публикаций, на которые может подписываться новый подписчик. Выберите SQL Server Database (База данных SQL Server) и щелкните на кнопке OK.

    Окно Publisher and Distributor Properties (Свойства издателя и дистрибьютoра)


    Рис. 26.37.  Окно Publisher and Distributor Properties (Свойства издателя и дистрибьютoра)

    Вкладка Subscribers (Подписчики) окна Publisher аnd Distributor Properties (Свойства издателя и дистрибьютoра)


    Рис. 26.38.  Вкладка Subscribers (Подписчики) окна Publisher аnd Distributor Properties (Свойства издателя и дистрибьютoра)

     Диалоговое окно Enable New Subscriber (Активизировать нового подписчика)


    Рис. 26.39.  Диалоговое окно Enable New Subscriber (Активизировать нового подписчика)

  4. Появится окно Registered SQL Server Properties (рис. 26.40). Поскольку мы выбрали на предыдущем шаге вариант SQL Server database, то здесь представлены характерные для SQL Server параметры соединения. Если бы мы выбрали другой вариант в диалоговом окне Enable New Subscriber, то здесь было бы представлено другое окно. Задайте имя системы и метод аутентификации для системы, которую вы активизируете как подписчика.

    Окно Registered SQL Server Properties (Зарегистрированные свойства SQL сервера)


    Рис. 26.40.  Окно Registered SQL Server Properties (Зарегистрированные свойства SQL сервера)

    Если вы хотите увидеть список доступных систем SQL Server, из которых можно сделать выбор, щелкните на кнопке [...] рядом с полем Server. Появится диалоговое окно Select Server (Выбор сервера) (рис. 26.41). Здесь вы можете выбрать сервер, чтобы активизировать его как подписчика.

    Диалоговое окно Select Server (Выбор сервера)


    Рис. 26.41.  Диалоговое окно Select Server (Выбор сервера)

  5. После завершения задач шага 4 и щелчка на кнопке OK в диалоговом окне Select Server и в окне Registered SQL Server Properties снова появится окно Publisher and Distributor Properties с новым подписчиком в списке Subscribers (рис. 26.42). Добавленную систему можно теперь использовать как подписчика на указанного издателя.

    Окно Publisher аnd Distributor Properties, где показан новый подписчик


    Рис. 26.42.  Окно Publisher аnd Distributor Properties, где показан новый подписчик

Конфигурирование подписок

Теперь, когда вы сконфигурировали издателя, дистрибьютора и публикации и активизировали подписчиков, можно конфигурировать подписки. Вы можете конфигурировать подписки либо из подписчика, либо из издателя. Из подписчика вы можете конфигурировать pull-подписку (подписку по запросу); из издателя вы можете конфигурировать push-подписку (принудительную подписку).

Конфигурирование pull-подписок. Управление и конфигурирование pull-подписок осуществляет подписчик. Тем самым вы должны выбрать подписчика в Enterprise Manager, прежде чем вызывать мастера pull-подписки Pull Subscription Wizard. Обычно pull-подписку используют подписчики, которые не подсоединены постоянно к сети. Например, pull-подписка подходит для используемых мобильным торговым персоналом переносных компьютеров, которые нерегулярно подсоединяются к сети и обновляют подписку. Чтобы сконфигурировать pull-подписку, выполните следующие шаги.

  1. В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication, выберите Pull Subscription to (Pull-подписка) и затем выберите Pull New Subscription (Новая pull-подписка) в появившемся диалоговом окне Pull Subscription; или выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizard и затем выберите Pull Subscription Wizard. При обоих методах появится начальное окно мастера Pull Subscription Wizard (рис. 26.43). (На рисунках этого раздела для подписчика выбран сервер с именем PTC5 и для издателя выбран сервер с именем PTC4.)
  2. Щелкните на кнопке Next, чтобы появилось окно Look for Publications (Поиск публикаций) (рис. 26.44). В этом окне вы можете выбрать метод поиска издателя, который можно осуществлять на зарегистрированных серверах (по умолчанию) или в Active Directory. Тем самым определяется, как происходит поиск издателей, что будет влиять на результаты, показанные в следующем окне.

     Начальное окно Pull Subscription Wizard


    Рис. 26.43.  Начальное окно Pull Subscription Wizard



    Рис. 26.44. 

  3. Щелкните на кнопке Next, чтобы появилось окно Choose Publication (Выбор публикации) (рис. 26.45). Это окно используется, чтобы идентифицировать публикацию, которая будет использоваться в данной репликации. Здесь представлены серверы, зарегистрированные с вашей системой SQL Server. Раскройте нужную систему-издателя и выберите публикацию, которую хотите использовать (рис. 26.45).

    Если вам нужно зарегистрировать сервер, щелкните на кнопке Register Server (Зарегистрировать сервер). Появится окно Registered SQL Server Properties. Мы использовали это окно в предыдущем разделе, когда активизировали подписчика.

  4. Выбрав публикацию, щелкните на кнопке Next, чтобы появилось окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации) (рис. 26.46). В этом окне вы можете задать, с какой login-записью подписчик подсоединяется к дистрибьютору. Принятый по умолчанию вариант Impersonate The SQL Server Agent Account (Использовать учетную запись агента SQL Server Agent) является наиболее подходящим выбором. Если в системе, которую вы конфигурируете, используется SQL Server Agent, сконфигурированный для использования специальной учетной записи, то здесь следует задать компоненты этой учетной записи.

    Окно Choose Publication (Выбор публикаций)


    Рис. 26.45.  Окно Choose Publication (Выбор публикаций)

     Окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации)


    Рис. 26.46.  Окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации)

  5. Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (Выбор целевой базы данных) (рис. 26.47). В этом окне вы указываете, в какую базу данных следует помещать реплицируемые статьи. На рис. 26.47 показана выбранная для подписки база данных с именем Sub. Если вы хотите создать новую базу данных, щелкните на кнопке New, чтобы открыть окно Database Properties (Свойства базы данных).

    Окно Choose Destination Database (Выбор целевой базы данных)


    Рис. 26.47.  Окно Choose Destination Database (Выбор целевой базы данных)

  6. Если вы открыли окно Database Properties для создания новой базы данных, щелкните на кнопке OK, чтобы вернуться по окончании в окно Choose Destination Database. Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки) (рис. 26.48). Щелкните на кнопке выбора Yes, чтобы инициализировать схему базы данных и данные у подписчика.

    Окно Initialize Subscription (Инициализация подписки)


    Рис. 26.48.  Окно Initialize Subscription (Инициализация подписки)

  7. Щелкните на кнопке Next, чтобы появилось окно Snapshot Delivery (Доставка снимка) (рис. 26.49). В этом окне вы можете выбрать, откуда будет доставляться снимок. Обычно достаточно принять установку по умолчанию, которая указывает, что снимок выбран из принятого по умолчанию местоположения.
  8. Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (Задать расписание для агента распространения) (рис. 26.50). В этом окне вы можете выбрать непрерывные обновления, обновления по расписанию или обновления по запросу.

    Окно Snapshot Delivery (Доставка снимка)


    Рис. 26.49.  Окно Snapshot Delivery (Доставка снимка)

     Окно Set Distribution Agent Schedule (Задать расписание для агента распространения)


    Рис. 26.50.  Окно Set Distribution Agent Schedule (Задать расписание для агента распространения)

    Напомним, что мы задали в данном примере репликацию снимков, поэтому все содержимое статей будет копироваться на подписчик каждый раз, как будет происходить обновление. В зависимости от частоты изменения данных и важности поддержки данных в синхронизированном состоянии вы можете выбрать любой из этих вариантов. Щелкните на кнопке Change, чтобы вызвать диалоговое окно Edit Recurring Job Schedule, описанное выше в этой лекции. В этом диалоговом окне вы можете задать ваше собственное повторяющееся расписание.
  9. Щелкните на кнопке Next, чтобы появилось окно Start Required Services (Запуск требуемых служб) (рис. 26.51). Вы можете запустить из этого окна SQL Server Agent, если он еще не запущен. В этом окне показано, запущен ли SQL Server Agent на данном подписчике. Если SQL Server Agent не запущен, вы получите запрос на его запуск. Если вы хотите запустить SQL Server Agent вручную, раскройте папку Management (Управление) в окне Enterprise Manager, щелкните правой кнопкой мыши на SQL Server Agent и используйте пункты появившегося контекстного меню для запуска или остановки SQL Server Agent.

    Окно Start Required Services (Запуск требуемых служб)


    Рис. 26.51.  Окно Start Required Services (Запуск требуемых служб)

  10. Если SQL Server Agent еще не сконфигурирован для автоматического запуска, то вы увидите окно Configure SQL Server Agent. Сконфигурируйте этот агент и щелкните на кнопке OK. Если SQL Server Agent уже сконфигурирован для автоматического запуска, это окно не появится.
  11. Щелкните на кнопке Next, чтобы появилось окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки) (рис. 26.52). Щелкните на кнопке Finish, чтобы завершить задание параметров подписки.

     Окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки)


    Рис. 26.52.  Окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки)

Теперь статьи будут реплицироваться на подписчик и будут регулярно обновляться в соответствии с заданным вами расписанием. Возможно, что прежде чем можно будет начать репликацию, вам потребуется проверить расписание, по которому будут запускаться агенты публикации. Агент Snapshot Agent запускается по своему собственному расписанию, и если вы не сконфигурировали его для немедленного распространения снимка на дистрибьютор, то для поступления данных на дистрибьютор может потребоваться некоторое время. Несмотря на то, что репликация действует, реальные данные не поступят подписчику, пока не выполнит свою работу Snapshot Agent.

Конфигурирование push-подписок. Push-подписка (принудительная подписка) инициируется на издателе. Push-подписка конфигурируется с помощью мастера Push Subscription Wizard. При использовании push-подписки расписание репликаций определяется на дистрибьюторе. Push-подписка – это типичный метод подписки для стационарных подписчиков. Причиной использования таких подписок является удобство управления всеми подписками с дистрибьютора вместо необходимости отдельного управления каждой подпиской с подписчика. Для запуска мастера Push Subscription Wizard выполните следующие шаги.

  1. Вызовите Push Subscription Wizard, используя один из двух методов. Для использования первого метода укажите пункт Replication в меню Tools окна Enterprise Manager и затем выберите пункт Push Subscription to Others (Push-подписка для других). Появится диалоговое окно Create and Manage Publications (Создание и управление публикациями) (рис. 26.53). Выделите публикацию в списке Databases and Publications (Базы данных и публикации) и затем щелкните на кнопке Push New Subscription (Создать push-подписку).

    Публикация, выбранная в диалоговом окне Create and Manage Publications (Создание и управление публикациями)


    Рис. 26.53.  Публикация, выбранная в диалоговом окне Create and Manage Publications (Создание и управление публикациями)

    Чтобы использовать второй метод, выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizards, выберите Push Subscription Wizard, выделите публикацию в появившемся диалоговом окне Create and Manage Publications и затем щелкните на кнопке Push New Subscription. В обоих случаях появится начальное окно мастера Push Subscription Wizard (рис. 26.54).
  2. Щелкните на кнопке Next, чтобы появилось окно Choose Subscribers (Выбор подписчиков) (рис. 26.55). Это окно используется для указания подписчиков, которые будут принудительно получать эту публикацию. В данном случае выбрана система PTC4. Эти подписчики должны быть активизированы в соответствии с разделом "Активизация подписчиков" выше в этой лекции.

     Начальное окно мастера Push Subscription Wizard


    Рис. 26.54.  Начальное окно мастера Push Subscription Wizard

    Окно Choose Subscribers (Выбор подписчиков)


    Рис. 26.55.  Окно Choose Subscribers (Выбор подписчиков)

  3. Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (рис. 26.56). В этом окне вы указываете базу данных, в которой будет размещаться данная публикация на подписчике. Вы можете выбрать базу данных, которая уже существует, или создать новую базу данных – в зависимости от конфигурации вашей системы и ваших требований. Чтобы использовать существующую базу данных, введите имя этой базы данных или щелкните на кнопке Browse (Обзор) и выберите базу данных из появившегося списка существующих баз данных. Для создания новой базы данных щелкните на кнопке Browse or Create (Обзор или создание) и затем щелкните на кнопке Create New в появившемся диалоговом окне Browse Databases (Обзор баз данных). Появится окно Database Properties (Свойства базы данных), которое используется в Enterprise Manager для создания новой базы данных. После создания новой базы данных вы возвратитесь в окно Choose Destination Database.

    Окно Choose Destination Database


    Рис. 26.56.  Окно Choose Destination Database

  4. Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (рис. 26.57). Здесь вы можете выбрать между непрерывным обновлением подписки или ее обновлением в соответствии с указанным вами расписанием. При использовании репликации снимков вариант непрерывного обновления подписки не имеет смысла. Если вы хотите изменить расписание, щелкните на кнопке Change, чтобы появилось диалоговое окно Edit Recurring Job Schedule, которое было описано выше. Здесь вы можете сконфигурировать повторяющееся расписание.

     Окно Set Distribution Agent Schedule


    Рис. 26.57.  Окно Set Distribution Agent Schedule

    Примечание.Расписание, которое вы задаете с помощью этого мастера, используется для обновления клиента данными из снимка. Это расписание должно быть скоординировано с расписанием обновления снимка. Если снимок не был обновлен, то подписка будет обновлена старыми данными из снимка.
  5. Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (рис. 26.58). В этом окне вы указываете, нужно ли инициализировать данную подписку. По умолчанию выбран вариант инициализации схемы и набора данных на подписчике. Если схема уже существует, то будет доступен вариант отказа от инициализации схемы. В этом окне вы можете также запустить Snapshot Agent, если он еще не запущен. Имеет смысл запускать Snapshot Agent, когда происходит инициализация снимка; в противном случае вам придется запускать этот агент вручную. Кроме того, важно задать расписание для агента Snapshot Agent таким образом, чтобы оно соответствовало расписаниям pull- и push-подписок. (См. раздел "Модифицирование расписания репликации снимков" выше в этой лекции.)

    Окно Initialize Subscription


    Рис. 26.58.  Окно Initialize Subscription

  6. Щелкните на кнопке Next, чтобы появилось окно Start Required Services (рис. 26.51), где вы можете запустить агент SQL Server Agent, если он еще не запущен.
  7. Щелкните на кнопке Next, чтобы появилось окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки) (рис. 26.59). Просмотрите сводку ваших установок и затем щелкните на кнопке Finish, чтобы начать процесс копирования снимка подписчику. Вы увидите диалоговое окно, описывающее продвижение работы мастера, после чего появится окно сообщения, где указывается, что эта операция успешно завершена. После завершения работы этого мастера создается push-подписка, которая будет обновляться на регулярной основе.

    Окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки)


    Рис. 26.59.  Окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки)

Управление репликацией

Теперь вы знаете, как создавать и конфигурировать реплицируемую базу данных в среде SQL Server 2000. Чтобы управлять этой реплицируемой средой или устранять проблемы, если репликация не запускается, вы будете использовать возможности мониторинга и параметры конфигурирования в Enterprise Manager.

Мониторинг и управление агентами репликации

Агенты репликации можно найти в папке Replication Monitor окна Enterprise Manager. Для доступа к агентам выполните следующие шаги.

  1. Раскройте группу серверов, раскройте сервер и затем раскройте папку Replication Monitor.
  2. Если сервер, который вы раскрыли, является издателем, то под папкой Replication Monitor появятся папки Publishers (Издатели) и Agents (Агенты). В папке Publishers находятся издатели, которые принадлежат данному серверу. В папке Agents находятся папки для агентов Snapshot Agents, Log Reader Agents, Distribution Agents, Merge Agents и различных агентов (папка Miscellaneous Agents), которые используются для очистки и протоколирования в журнале выполняемых операций.
  3. Хотя обычно не требуется запускать или прекращать работу агентов, вы можете использовать для этого Replication Monitor. Если создается впечатление, что ваша реплицируемая система не работает после того, как вы сконфигурировали ее, то вполне вероятно, что еще не запущен агент Snapshot Agent, возможно, из-за того, что для этого агента используется принятое по умолчанию расписание. (Именно поэтому в процессе конфигурирования вы имеете возможность сразу инициализировать создание снимка.) Проверяйте состояние агентов, щелкая на папке соответствующих агентов в Enterprise Manager и просматривая информацию об этих агентах в правой панели (рис. 26.60). Здесь вы можете определить, был ли запущен данный агент, и можете запустить его при необходимости. После запуска агента он действует, пока не закончит свою работу, после чего он становится неактивным. После этого SQL Server Agent будет запускать этот агент репликации, исходя из его регулярного расписания.

     Агент Snapshot Agent, представленный в окне Enterprise Manager


    увеличить изображение

    Рис. 26.60.  Агент Snapshot Agent, представленный в окне Enterprise Manager

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

    Опции агента репликации


    Рис. 26.61.  Опции агента репликации

Эти опции описаны ниже.

Примечание. Мониторинг агентов распространения (Distribution Agents) рассматривается более подробно в следующих двух лекциях.
Отключение репликации

Вы можете легко отключить все операции или часть операций репликации в вашей системе с помощью мастеров Enterprise Manager, чтобы удалить определенные компоненты репликации. В этом разделе вы узнаете, как выполнять эту простую задачу.

Удаление push-подписок

Чтобы удалить push-подписку, используйте Enterprise Manager в системе дистрибьютора для вызова мастера Push Subscription Wizard. После вызова мастера Push Subscription Wizard появится диалоговое окно Create and Manage Publications. В поле списка Databases and Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication (Удалить публикацию). Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку. Щелкните на кнопке Yes, чтобы удалить подписку.

Удаление pull-подписок

Чтобы удалить pull-подписку, используйте Enterprise Manager в системе подписчика для вызова мастера Pull Subscription Wizard. После вызова мастера Pull Subscription Wizard появится диалоговое окно Create and Manage Publications. В поле списка Databases and Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication. Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку.

Удаление распространения и публикаций

Чтобы удалить распространение и публикации, вы должны вызвать мастер Disable Publishing and Distribution Wizard (Отключение публикования и распространения). В первом окне этого мастера вы указываете, что вам нужно: отключить все распространение и все публикации или удалить только публикации. Если выбрать первый вариант, то будет удалено все – публикование, распространение и публикации. Если выбрать второй вариант (принятый по умолчанию), то будут удалены только публикации. Затем вы должны выбрать публикации, которые хотите удалить. После вашего выбора появится окно подтверждения, где вам дается последняя возможность отменить свое решение. Чтобы удалить выбранные вами компоненты репликации, щелкните на кнопке Yes.

Настройка репликации снимков

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

Атрибуты репликации снимков

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

Конфигурирование репликации моментальных снимков

В этом разделе даются некоторые рекомендации по конфигурированию репликации снимков. Поскольку в репликации снимков используется дистрибутивная база данных, в которой хранится только информация о состоянии процесса репликации, а не сами реплицируемые данные (для чего используется отдельный файл), то обычно нет необходимости выполнять настройку SQL Server на дистрибьюторе. Следующие рекомендации помогут вам в настройке системы репликации снимков, работающей оптимальным образом.

Рассмотрим каждую из этих рекомендаций более подробно.

Конфигурирование достаточной мощности подсистем ввода-вывода

Как уже говорилось в предыдущем разделе, при репликации снимков за один раз копируется большой объем данных, поэтому недостаточно быстрая дисковая подсистема может замедлять весь процесс. Увеличивая производительность определенных подсистем ввода-вывода, вы повышаете производительность всего процесса репликации. В системе, участвующей в репликации, такой как любая система SQL Server, журнал транзакций следует помещать на его собственном томе RAID 1, чтобы обеспечить защиту данных. Файлы данных следует размещать на одном или нескольких томах RAID 10 или RAID 5. Используемый вами уровень тома RAID зависит от компонента репликации, который вы конфигурируете, – издатель, дистрибьютор или подписчик.

Конфигурирование подсистемы ввода-вывода на издателе. Выбор тома, который вы используете для файла данных на издателе, – RAID 5 или RAID 10 – зависит от соотношения операций чтения/записи при доступе к данному тому. Как уже говорилось в лекции 5, для любого дискового тома, на котором выполняется более 10 процентов операций записи, не подходит RAID 5, и для него следует использовать RAID 10. Причиной является излишняя дополнительная нагрузка, связанная с операциями записи на RAID 5. Поэтому, выясняя, можете ли вы использовать RAID 5, выполняйте мониторинг системы и следите за количеством операций записи по сравнению с операциями чтения. Независимо от выбранного вами уровня RAID вам следует должным образом планировать подсистему ввода-вывода, как это рекомендовано в лекциях 5 и 6.

Конфигурирование подсистемы ввода-вывода на дистрибьюторе. Поскольку при репликации снимков файл сохраняется на дистрибьюторе, а база данных SQL Server для этого не используется, то вы должны убедиться, что местоположение снимка имеет достаточную мощность подсистемы ввода-вывода, чтобы справляться с большим числом операций записи. Таким образом, для размещения снимка больше подходит RAID 10, чем RAID 5. Как вы увидите далее в этом разделе, в некоторых случаях более эффективным является размещение снимка на издателе.

Конфигурирование подсистемы ввода-вывода на подписчике. Вы можете увеличить производительность репликации снимков за счет использования тома RAID 10 вместо тома RAID 5 для файлов данных на подписчике. Причиной является большое количество операций записи на подписчике во время репликации снимков.

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

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

  1. На дистрибьюторе вызовите мастер Configure Publishing аnd Distribution Wizard. Когда появится окно Publisher аnd Distributor Properties, щелкните на вкладке Publishers (рис. 26.62).

     Вкладка Publishers окна Publisher аnd Distributor Properties


    Рис. 26.62.  Вкладка Publishers окна Publisher аnd Distributor Properties

  2. Щелкните на кнопке [...]. Появится окно Publisher Properties (рис. 26.63).
  3. В этом окне вы можете сконфигурировать местоположение снимка в системе, где формируется этот снимок. Делая это, вы должны убедиться, что это местоположение имеет достаточную мощность подсистемы ввода-вывода, чтобы справляться с дополнительной нагрузкой, связанной с записью этого снимка.
    Примечание. При конфигурировании местоположения снимка на дистрибьюторе вы конфигурируете местоположение для всех публикаций. Если вы обслуживаете более чем одну систему-издатель с этим дистрибьютором, то вам не следует делать это.

     Окно Publisher Properties


    Рис. 26.63.  Окно Publisher Properties

Конфигурирование дистрибьютора и издателя в одной системе

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

Увеличение количества BCP-потоков

Вы можете также повысить производительность репликации за счет увеличения количества BCP-потоков, используемых для процесса репликации. Для этого выполните следующие шаги:

  1. В окне Enterprise Manager раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Snapshot Agents. В правой панели щелкните правой кнопкой мыши на нужной публикации и выберите из появившегося контекстного меню пункт Agent Profiles. Появится диалоговое окно Snapshot Agent Profiles (рис. 26.64).
  2. Щелкните на кнопке New Profile (Создать профиль). В результате будет создан новый профиль по умолчанию этого агента и появится диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации), в котором вы можете модифицировать профиль (рис. 26.65). Здесь вы можете изменить параметр MaxBcpThreads.
  3. После внесения изменений задайте имя этого профиля и щелкните на кнопке OK. Будет выполнено сохранение этого профиля. Затем выберите этот профиль в диалоговом окне Snapshot Agent Profiles.

    Диалоговое окно Snapshot Agent Profiles


    Рис. 26.64.  Диалоговое окно Snapshot Agent Profiles

    Диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)


    Рис. 26.65.  Диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)

Мониторинг системы репликации снимков

Мониторинг системы репликации снимков осуществляется с помощью монитора производительности Microsoft Windows 2000 Performance Monitor. В этом мониторе имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Кроме того, для мониторинга репликации снимков полезен ряд стандартных объектов Performance Monitor.

Эти счетчики дают вам достаточно хорошее представление о том, насколько "гладко" выполняется процесс репликации. Но репликация снимков может происходить очень быстро, поэтому будьте внимательны. Если ваша система хорошо сконфигурирована и хорошо настроена, то процесс репликации снимков выполняется достаточно быстро. Чтобы обеспечить оптимальную производительность репликации, следите за возникновением следующих потенциальных проблем:

Настройка системы репликации снимков

Настройка системы репликации снимков обычно означает просто ее надлежащее конфигурирование. Наиболее существенными проблемами, которые влияют на производительность репликации, являются проблемы ввода-вывода и производительности сети. Вы должны оценить производительность вашей сети и затем определить, достаточно ли этого для потребностей вашей репликации. Рассмотрим один пример.

Предположим, у вас имеется база данных объемом 5 Гб. Если у вас используется сеть 10BaseT, то она дает максимальную пропускную способность 10 Мбит/с, что приблизительно составляет 1 мегабайт в секунду (Мб/с). Таким образом, для репликации в этой сети базы данных объемом в 5 Гб потребуется 5120 секунд, или 1,4 часа. Вот соответствующий расчет: (5 Гб * 1024 (Мб/Гб)) / 1 (Мб/с) = 5120 с, или 1,4 часа. Но в сети 100BaseT та же репликация может быть выполнена за 8,3 минут. А в сети Gigabit Ethernet та же задача может быть выполнена за 51 с. Сравнение по сетям перечислены в табл. 26.1.

Таблица 26.1. Сравнение различных сетей
Скорость сетиВремя выполнения репликации снимков для базы данных 5 Гб
10BaseT5120 секунд, или 85,3 минуты, или 1,4 часа
100BaseT516 секунд, или 8,3 минуты
Gigabit Ethernet51 секунда

Как видите, тип сети играет существенную роль. Выполняя подобные расчеты, вы получите хорошее представление о том, насколько быстро будет выполняться репликация. Если репликация занимает слишком много времени, то, возможно, на это влияет узкое место где-либо еще, – в подсистеме ввода-ввода, в памяти, на диске и т.д.

Заключение

В этой лекции вы узнали о трех типах репликации SQL Server: репликация снимков, репликация транзакций и репликация слиянием. Вы также узнали, что означает для репликации в SQL Server метафора "опубликовать-и-подписаться", которая впервые появилась в SQL Server 6. И вы узнали, как конфигурировать репликацию снимков. Осваивая репликацию на практике, вы начнете понимать, насколько гибкой является репликация в SQL Server. В лекциях 27 и 28 вы будете узнавать о все более сложных формах репликации: репликации транзакций и репликации слиянием.

Лекция 27. Репликация транзакций

Репликация транзакций используется для репликации того, что происходит в транзакциях. Применяется репликация транзакций в ряде случаев: при передаче сообщений, при поддержки текущего состояние информационной базы, при распределении нагрузки. Примеры конфигурирования pull/push-подписок. Использование системной хранимой процедуры sp_adddistributor. Обзор реализаций репликаций транзакций.

В лекции 26 был дан обзор репликации в Microsoft SQL Server 2000, включая краткое описание репликации транзакций. В данной лекции приводится уже подробное описание этой темы. Здесь описывается, как действует этот метод репликации, когда его следует использовать, а также как его конфигурировать, как выполнять его мониторинг и как настраивать системы, участвующие в репликации транзакций.

Репликация транзакций, видимо, является наиболее распространенным методом репликации. Она позволяет достаточно быстро передавать подписчикам изменения после того, как они применены к издателям, и это происходит без особого увеличения нагрузки на издателей.

Введение в репликацию транзакций

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

Транзакции считываются из журнала транзакций агентом чтения журнала Log Reader Agent, который запускается на дистрибьюторе и подсоединяется к издателю. Эти транзакции обрабатываются и помещаются в дистрибутивную базу данных на дистрибьюторе. Позже агенты распространения (Distribution Agents) считывают эту информацию из дистрибутивной базы данных и применяют транзакции к базе данных подписчика.

Каждая база данных, которая использует репликацию транзакций, имеет собственного агента Log Reader Agent, который запускается на дистрибьюторе и следит за журналом транзакций этой базы данных на издателе. На каждую базу данных используется только один агент Log Reader Agent – независимо от количества публикаций, определенных по соответствующей базе данных.

Log Reader Agent запускается на дистрибьюторе в соответствии с расписанием, которое определяется при создании публикации. В зависимости от вашего выбора Log Reader Agent работает в соответствии с регулярным расписанием или непрерывно. При работе Log Reader Agent происходит следующая последовательность событий.

  1. Log Reader Agent читает журнал транзакций системы с данной публикацией и создает список операторов INSERT, UPDATE, DELETE и других модификаций данных, которые были выбраны для репликации, включая удаления таблиц, изменения в определениях колонок и т.д.
  2. Log Reader Agent обрабатывает данные из журнала транзакций и выполняет фильтрации, определенные по статьям. Сюда относятся все горизонтальные и вертикальные фильтрации.
  3. Эти модификации объединяются в пакет и отправляются в дистрибутивную базу данных на дистрибьюторе. Внутри дистрибутивной базы данных имеется несколько таблиц, в которых отслеживаются изменения репликации и задачи. Выполняемые на издателе модификации, которые должны распространяться подписчикам, сохраняются в таблице с именем MSRepl_commands. Эта таблица содержит реальные команды репликации в сжатом формате. Таблица MSRepl_commands содержит по одной строке для каждой операции INSERT, UPDATE и DELETE по каждой определенной ранее статье. Если модификация, которая вносится в таблицу базы данных издателя, относится к нескольким статьям, то это изменение будет дублировано в дистрибутивной базе данных. Например, если таблица A содержится в трех статьях, то изменение в таблице A приведет к появлению трех строк в дистрибутивной базе данных.
  4. После успешной передачи каждого пакета в дистрибутивную базу данных происходит фиксирование транзакций этого пакета. При отказе фиксирования в журнал ошибок агента записывается сообщение об ошибке.
  5. После успешного фиксирования этих изменений в дистрибутивной базе данных Log Reader Agent помечает последнее изменение, включенное в последнюю операцию репликации, чтобы не было повторения этих изменений.
  6. После того как транзакция прочитана из журнала транзакций и фиксирована в дистрибутивной базе данных, Log Reader Agent помечает те строки журнала транзакций, которые подходят для усечения (eligible to be truncated).

Для каждой модификации базы данных публикации создается хотя бы одна запись в дистрибутивной базе данных. В некоторых случаях модификация в базе данных публикации приводит к созданию нескольких записей в дистрибутивной базе данных. Вот эти случаи.

Применение репликации транзакций

Репликация транзакций может применяться, когда подписчикам требуется поддерживать информацию на уровне текущего состояния данных издателя. Репликацию транзакций можно сконфигурировать таким образом, чтобы обновление подписчика происходило вскоре после обновления издателя. Даже в непрерывном режиме работы агент Log Reader Agent вместо непрерывного чтения обращается к журналу транзакций через определенное количество секунд, чтобы снизить нагрузку на журнал транзакций издателя.

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

Существует много применений для репликации транзакций. В зависимости от конфигурации вашей системы и ваших приложений репликация транзакций может оказаться для вас очень полезным средством.

Конфигурирование системы репликации транзакций

Конфигурирование репликации транзакций выполняется аналогично конфигурированию репликации моментального снимка. Сначала вы должны сконфигурировать публикацию и затем задать, чтобы она принудительно передавалась подписчику (push-подписка) или запрашивалась подписчиком (pull-подписка).

Примечание. Прежде чем конфигурировать любой тип репликации SQL Server, вы должны сначала сконфигурировать публикование и распространение. Инструкции см. в лекции 26.
Конфигурирование публикаций

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

  1. В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication (Репликация) и выберите команду Create аnd Manage Publications (Создание и управление публикациями); или выберите пункт Wizards (Мастера), раскройте папку Replication в появившемся в диалоговом окне Select Wizard (Выбор мастера) и выберите Create Publication Wizard (Мастер создания публикации). При любом способе появится диалоговое окно Create and Manage Publications (рис. 27.1). В этом диалоговом окне вы можете выбрать базу данных или таблицу, содержащую данные, которые вы хотите публиковать.

    Если публикации уже существуют, то в дополнение к кнопке Create Publication (Создать публикацию) будут доступны следующие кнопки:

    • Push New Subscription (Новая push-подписка). Позволяет вам создать новую push-подписку для уже существующей публикации. (См. раздел "Конфигурирование подписок" далее.)

      Диалоговое окно Create and Manage Publications


      Рис. 27.1.  Диалоговое окно Create and Manage Publications

    • Properties and Subscriptions (Свойства и подписки). Позволяет вам модифицировать свойства как публикаций, так и подписок.
    • Script Publication (Сценарий создания публикации). Позволяет вам создать сценарий, который можно использовать для создания других публикаций.
    • Delete Publication (Удалить публикацию). Позволяет вам удалить уже сконфигурированную публикацию.
  2. Выберите базу данных, которую хотите использовать для данной публикации (на рис. 27.1 выбрана база данных Northwind), и затем щелкните на кнопке Create Publication для вызова мастера Create Publication Wizard. Появится начальное окно мастера (рис. 27.2). Установите флажок Show advanced options in this wizard (Показать дополнительные параметры в этом мастере).

    Начальное окно мастера Create Publication Wizard


    Рис. 27.2.  Начальное окно мастера Create Publication Wizard

  3. Щелкните на кнопке Next, чтобы появилось окно Choose Publication Database (Выбор базы данных для публикации) (рис. 27.3). В этом окне вы можете (снова) выбрать базу данных, содержащую данные, которые хотите публиковать. По умолчанию будет выделена база данных, выбранная вами на шаге 2.

     Окно Choose Publication Database (Выбор баз данных для публикаций)


    Рис. 27.3.  Окно Choose Publication Database (Выбор баз данных для публикаций)

    Примечание. Если для системы, выбранной вами на шаге 1, еще не определен дистрибьютор, то вы получите запрос выбора дистрибьютора в окне Select Distributor (Выбор дистрибьютора). Напомним, что издатель может иметь только одного дистрибьютора – независимо от количества публикаций. Если у вас уже определен дистрибьютор, то появится окно Choose Publication Database, как это описано выше.
  4. Щелкните на кнопке Next, чтобы появилось окно Select Publication Type (Выбор типа публикации) (рис. 27.4).

    Окно Select Publication Type (Выбор типа публикации)


    Рис. 27.4.  Окно Select Publication Type (Выбор типа публикации)

    В этом окне вы можете выбрать один из трех типов репликации. Будут представлены следующие варианты выбора:
    • Snapshot publication (Публикация для репликации снимков). Создает публикацию для репликации снимка соответствующей статьи, который периодически копируется на подписчик. Такую публикацию можно создавать из любой таблицы.
    • Transactional publication (Публикация для репликации транзакций). Создает публикацию для репликации транзакций, в соответствии с которыми происходит обновление подписки изменениями, выполненными на издателе. Статьи могут создаваться только из таблиц с первичным ключом.
    • Merge publication (Публикация для репликации слиянием).Создает публикацию для репликации слиянием, которая позволяет выполнять двустороннюю репликацию между издателем и подписчиком. Статьи могут создаваться из любых таблиц.
  5. Щелкните на кнопке выбора Transactional Publication и щелкните на кнопке Next, чтобы появилось окно Updatable Subscriptions (Модифицируемые подписки) (рис. 27.5). Это окно появится, так как мы установили флажок Show Advanced Options in this Wizard. (Если бы вы не установили этот флажок, то появилось бы окно Specify Subscriber Types (Указание типов подписчиков).)

    Окно Updatable Subscriptions (Модифицируемые подписки)


    Рис. 27.5.  Окно Updatable Subscriptions (Модифицируемые подписки)

    В этом окне вы можете указывать, какие изменения, внесенные на подписчиках, реплицируются издателям. Ниже описаны флажки этого окна.
    • Immediate updating (Немедленное обновление).Активизируются подписки с немедленным обновлением. Это означает, что агенты репликации будут использовать Microsoft Distributed Transaction Coordinator (MS DTC – координатор распределенных транзакций) для выполнения двухфазного фиксирования по транзакциям, которые модифицируют данные подписчиков, чтобы можно было вносить изменения на подписчике и немедленно реплицировать их на издателе. (О MS DTC и двухфазном фиксировании см. лекцию 25.) По умолчанию флажок подписок с немедленным обновлением не установлен.
    • Queued updating (Отложенное обновление). Активизирует подписки с отложенным обновлением. Это означает, что модификации, которые выполняются на подписчике, будут помещаться в очередь до того момента, когда их можно будет применить на издателе. Это позволяет подписчику модифицировать базу данных, но не требует двухфазного фиксирования с издателем.
    Примечание. Репликация с немедленным обновлением полезна в тех случаях, когда идентичность систем является требованием, но учтите, что при двухфазном фиксировании возникает большая дополнительная нагрузка. Если у вас нет немедленного доступа к обеим системам, то соответствующая транзакция не может быть фиксирована. Репликацию с немедленным обновлением следует использовать только при абсолютной необходимости.
  6. Щелкните на кнопке Next, чтобы появилось окно Transform Published Data (Преобразование опубликованных данных) (рис. 27.6). Преобразование данных является новой возможностью SQL Server. Для преобразования реплицированных данных используется набор Microsoft Data Transformation Services (DTS – службы преобразования данных). DTS позволяет выполнять следующие преобразования данных:
    • преобразование значений или типов данных;
    • изменение регистра букв;
    • слияние данных;
    • разделение данных.

    Окно Transform Published Data (Преобразование опубликованных данных)


    Рис. 27.6.  Окно Transform Published Data (Преобразование опубликованных данных)

  1. Щелкните на кнопке Next, чтобы появилось окно Specify Subscriber Types (Указание типов подписчиков) (рис. 27.7). В этом окне вы можете указывать, будут ли все подписчики использовать SQL Server. Если возможно, используйте установку по умолчанию, которая указывает, что все серверы-подписчики будут работать с SQL Server 2000 (Servers running SQL Server 2000). Если вас устраивает этот выбор, то вы конфигурируете репликацию для использования собственных типов данных SQL Server 2000. Если в вашей конфигурации имеются системы с SQL Server 7, установите второй флажок. Если в вашей конфигурации имеются системы, не использующие SQL Server, вам следует установить третий флажок, который указывает, что данные репликации будут преобразовываться с символьный формат. Это преобразование сложных собственных типов данных приводит к дополнительной нагрузке на серверы.

    Окно Specify Subscriber Types (Указание типов подписчиков)


    Рис. 27.7.  Окно Specify Subscriber Types (Указание типов подписчиков)

  2. Щелкните на кнопке Next, чтобы появилось окно Specify Articles (Указание статей) (рис. 27.8). В этом окне вы можете указывать таблицы, хранимые процедуры и представления, которые будут реплицироваться как статьи. Эти статьи образуют публикацию, которую вы создаете. Выберите все нужные вам таблицы, хранимые процедуры и представления в правой части окна или установите один или несколько флажков в колонке Publish All (Публиковать все) для выбора всех элементов объектов соответствующего типа в базе данных. Напомним, что каждый объект рассматривается как статья, а публикация – это набор логически сгруппированных статей.

     Окно Specify Articles (Указание статей)


    Рис. 27.8.  Окно Specify Articles (Указание статей)

    Примечание.Если на подписчике имеются хранимые процедуры, то репликацию можно сконфигурировать таким образом, чтобы реплицировать вызовы этих хранимых процедур, а не результаты вызовов хранимых процедур.
  3. Щелкните на кнопке Next. На этом этапе SQL Server проверяет данную публикацию, и если он найдет ошибки, то вы увидите окно (рис. 27.9).

     Окно Article Issues (Вопросы по статьям)


    Рис. 27.9.  Окно Article Issues (Вопросы по статьям)

  4. После завершения анализа данной публикации (и после щелчка на кнопке OK для возврата в окно мастера, если появилось информационное диалоговое окно) щелкните на кнопке Next, чтобы появилось окно Select Publication Name and Description (Выбор имени и описания публикации) (рис. 27.10). В этом окне вы указываете имя и описание публикации.

     Окно Select Publication Name аnd Description (Выбор имени и описания публикации)


    Рис. 27.10.  Окно Select Publication Name аnd Description (Выбор имени и описания публикации)

  5. Щелкните на кнопке Next, чтобы появилось окно Customize the Properties of the Publication (Настройка свойств данной публикации) (рис. 27.11). В этом окне вы указываете, хотите ли определять фильтры данных и настраивать другие свойства. Щелкните на кнопке Yes (Да).

    Окно Customize the Properties of the Publication (Настройка свойств данной публикации)


    Рис. 27.11.  Окно Customize the Properties of the Publication (Настройка свойств данной публикации)

  1. Щелкните на кнопке Next, чтобы появилось окно Filter Data (Фильтрация данных) (рис. 27.12). В этом окне вы указываете, хотите ли вы фильтровать данные по вертикали (фильтрация колонок) или по горизонтали (фильтрация строк). Установите оба флажка и щелкните на кнопке Next.

     Окно Filter Data (Фильтрация данных)


    Рис. 27.12.  Окно Filter Data (Фильтрация данных)

  2. Появится окно Filter Table Columns (Фильтрация колонок таблицы) (рис. 27.13). В этом окне вы можете исключать колонки из данной репликации. Сначала выберите таблицу из списка Tables in Publication (Таблицы в публикации) и затем в списке Columns in Selected Table (Колонки в выбранной таблице) сбросьте флажки рядом с колонками, которые не хотите реплицировать. Это позволяет осуществлять вертикальную фильтрацию статьи, при которой будет создаваться реплицированная таблица с меньшим количеством колонок, чем в таблице издателя.

     Окно Filter Table Columns (Фильтрация колонок таблицы)


    Рис. 27.13.  Окно Filter Table Columns (Фильтрация колонок таблицы)

    Примечание.Колонки с первичными ключами нельзя включить в фильтрацию, поскольку колонки с первичными ключами используются в репликации транзакций, как это описано выше в этой лекции.
  3. Щелкните на кнопке Next, чтобы появилось окно Filter Table Rows (Фильтрация строк таблицы) (рис. 27.14). В этом окне вы можете выбирать таблицы, в которых хотите фильтровать данные по строкам. Выберите таблицу и щелкните на кнопке Build [...] (Создать [...]), чтобы создать фильтр.

     Окно Filter Table Rows (Фильтрация строк таблицы)


    Рис. 27.14.  Окно Filter Table Rows (Фильтрация строк таблицы)

  4. Появится диалоговое окно Specify Filter (Задать фильтр) (рис. 27.15). В этом диалоговом окне вы можете добавлять к SQL-оператору предложение WHERE, которое будет использоваться для фильтрации строк данных. По окончании указания строк, которые будут реплицироваться, щелкните на кнопке OK, чтобы вернуться в окно мастера.

    Диалоговое окно Specify Filter (Задать фильтр)


    Рис. 27.15.  Диалоговое окно Specify Filter (Задать фильтр)

  5. Щелкните на кнопке Next, чтобы появилось окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам) (рис. 27.16). В этом окне вы можете указывать, могут ли получать доступ к данным репликации анонимные подписчики (первая кнопка выбора), или это могут делать только известные подписчики (вторая кнопка выбора). Ваш выбор должен основываться на вашей конфигурации и требованиях безопасности.

    Окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам)


    Рис. 27.16.  Окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам)

  6. Щелкните на кнопке Next, чтобы появилось окно Set Snapshot Agent Schedule (Задать расписание для агента снимков Snapshot Agent). (Об использовании этого окна см. шаги 15 и 16 подраздела "Конфигурирование репликации моментальных снимков" лекции 26.) Поскольку в репликации транзакций снимок используется только для первоначального создания базы данных подписчика, то вам, видимо, не нужно задавать регулярное расписание для создания снимка; вместо этого вы можете создать снимок вручную.
  7. После того, как вы зададите расписание, щелкните на кнопке Next, чтобы появилось окно мастера Completing the Create Publication Wizard (Завершение работы мастера создания публикации), просмотрите сводку по данной публикации и щелкните на кнопке Finish (Готово). Когда создание вашей публикации будет завершено, появится соответствующее информационное диалоговое окно.
Конфигурирование Log Reader Agent

После создания публикации вам, возможно, потребуется модифицировать поведение агента чтения журнала Log Reader Agent. Например, вы можете задать, как происходит вызов Log Reader Agent, выбрав режим, в котором он будет работать. В непрерывном режиме (это режим по умолчанию) запуск Log Reader Agent происходит при запуске SQL Server Agent. Затем он подсоединяется к журналу транзакций на издателе и выполняет непрерывное чтение этого журнала. В режиме расписания Log Reader Agent запускается в соответствии с заданным вами расписанием и переходит в неактивное состояние после того, как прочитает все реплицируемые транзакции из журнала транзакций. Изменяя режим и другие свойства, вы можете повышать производительность и снижать объем нагрузки на издатель. Чтобы сконфигурировать Log Reader Agent, выполните следующие шаги.

  1. В окне Enterprise Manager раскройте сервер, раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Log Reader Agents.
  2. В правой панели Enterprise Manager щелкните правой кнопкой мыши на публикации. Появится контекстное меню (рис. 27.17).

    Контекстное меню для публикации


    Рис. 27.17.  Контекстное меню для публикации

  3. Выберите пункт Agent Properties (Свойства агента). Появится окно свойств данного агента Log Reader Agent (рис. 27.18).
  4. Щелкните на вкладке Steps (Шаги) (рис. 27.19). В этой вкладке вы увидите шаги, которые выполняет данный Log Reader Agent, когда происходит его вызов. Здесь выводятся и описываются три следующих шага.
    • Log Agent startup message (Сообщение о запуске агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение (таблица MSLogreader_history в дистрибутивной базе данных).

      Окно свойств Log Reader Agent


      Рис. 27.18.  Окно свойств Log Reader Agent

      Вкладка Steps (Шаги) окна свойств Log Reader Agent


      Рис. 27.19.  Вкладка Steps (Шаги) окна свойств Log Reader Agent

    • Run agent (Запуск агента).Запуск данного агента в соответствии с заданным расписанием. При работе в непрерывном режиме этот агент работает, пока не будет отключена система.
    • Detect nonlogged agent shutdown (Обнаружено незарегистрированное отключение агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение в случае отключения агента.
  5. Выделите шаг Run agent и щелкните на кнопке Edit (Редактировать), чтобы появилось диалоговое окно Edit Job Step (Редактирование шага) (рис. 27.20). В этом диалоговом окне вы можете конфигурировать способ вызова Log Reader Agent.

    Для агента Log Reader Agent можно сконфигурировать много параметров. Параметры по умолчанию этого агента можно модифицировать в окне Command (Команда) диалогового окна Edit Job Step и в диалоговом окне Replication Agent Profile Details (Детали профиля агента репликации) (рис. 27.22). Здесь описаны два параметра, которые вы можете модифицировать в диалоговом окне Edit Job Step.

    • Continuous (Непрерывный). Указывает, работает ли Log Reader Agent в непрерывном режиме. Чтобы задать режим расписания, удалите этот параметр.

      Вкладка General диалогового окна Edit Job Step (Редактирование шага)


      Рис. 27.20.  Вкладка General диалогового окна Edit Job Step (Редактирование шага)

    • DistributorSecurityMode (Режим безопасности дистрибьютора).Указывает, какой режим аутентификации использует Log Reader Agent: SQL Server или Microsoft Windows 2000.
    Кроме того, вы можете задать в диалоговом окне Edit Job Step другие параметры, такие как AsynchLogging, Buffers, DefinitionFile, информацию о дистрибьюторе и подписчиках и MessageInterval.
  6. Закончив модифицирование свойств Log Reader Agent, щелкните на кнопке OK, чтобы сохранить ваши изменения.

Вы можете модифицировать другие параметры в профиле Log Reader Agent. Чтобы модифицировать профиль, выполните следующие шаги.

  1. В правой панели Enterprise Manager щелкните правой кнопкой мыши на Log Reader Agent и выберите из появившегося контекстного меню пункт Agent Profiles (Профили агента). Появится диалоговое окно Log Reader Agent Profiles(рис. 27.21).
  2. Щелкните на кнопке New Profile (Создать профиль), чтобы создать новый профиль. Текущий профиль нельзя модифицировать. В результате появится диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации) (рис. 27.22).
  3. В этом диалоговом окне вы можете модифицировать следующие параметры:
    • HistoryVerboseLevel. Указывает, сколько информации будет протоколироваться в журнале. Обычно хватает принятого по умолчанию уровня, если только у вас не возникают проблемы.
    • LoginTimeout. Указывает допустимое время ожидания в секундах для Log Reader Agent.
    • PollingInterval. Указывает, насколько часто опрашивается журнал транзакций на издателе (для получения новых транзакций).
    • QueryTimeout.Указывает допустимое время ожидания в секундах для запроса.
    • ReadBatchSize.Указывает количество транзакций, которое считывается из журнала транзакций в одном пакете.

Диалоговое окно Log Reader Agent Profiles


Рис. 27.21.  Диалоговое окно Log Reader Agent Profiles

Диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)


Рис. 27.22.  Диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)

Примечание. Как уже говорилось, если Log Reader Agent используется в режиме расписания, а не в непрерывном режиме, то он вызывается агентом SQL Server Agent и выполняет чтение из журнала транзакций всех транзакций, которые были помечены для репликации. Log Reader Agent считывает из журнала транзакций определенное количество транзакций или команд, указанное параметром ReadBatchSize, и выполняет их вставку в дистрибутивную базу данных. После считывания всех транзакций, помеченных для репликации, Log Reader Agent переходит в неактивное состояние, пока не наступит момент следующего запуска в соответствии с расписанием.
Конфигурирование pull-подписок

Управление и конфигурирование pull-подписок осуществляется со стороны подписчика. Тем самым вы должны конфигурировать pull-подписку с помощью Enterprise Manager в системе подписчика. Чтобы сконфигурировать pull-подписку, выполните следующие шаги.

  1. В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication, выберите пункт Pull Subscription To (Pull-подписка) и затем щелкните на Pull New Subscription (Новая pull-подписка) в появившемся диалоговом окне Pull Subscription To; или выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizard, затем выберите Create Pull Subscription Wizard (Мастер создания pull-подписки) и щелкните на кнопке OK. При обоих методах появится начальное окно мастера Pull Subscription Wizard (рис. 27.23). Отметим, что в этом окне имеется флажок, с помощью которого в этом мастере можно показывать дополнительные параметры. В данном примере мы установим этот флажок. Это позволит активизировать преобразование данных.

    Начальное окно Pull Subscription Wizard


    Рис. 27.23.  Начальное окно Pull Subscription Wizard

  2. Щелкните на кнопке Next, чтобы появилось окно Look for Publications (Поиск публикаций) (рис. 27.24). В этом окне вы можете определить, где выполняется поиск публикации. Можно выбрать поиск в стандартных точках сети Windows 2000 или в службе Active Directory. Выберите первый вариант, принятый по умолчанию, который указывает что вы будете искать публикации на зарегистрированных серверах.

     Окно Look for Publications (Поиск публикаций)


    Рис. 27.24.  Окно Look for Publications (Поиск публикаций)

  3. Щелкните на кнопке Next, чтобы появилось окно Choose Publication (Выбор публикации) (рис. 27.25). Это окно используется, чтобы идентифицировать публикацию, которая будет использоваться в данной репликации. Здесь представлены серверы, зарегистрированные с вашей системой SQL Server. Выберите публикацию, которую хотите реплицировать.

    Окно Choose Publication (Выбор публикации)


    Рис. 27.25.  Окно Choose Publication (Выбор публикации)

  4. Щелкните на кнопке Next, чтобы появилось окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации) (рис. 27.26). В этом окне вы можете задать login-запись и пароль для дистрибьютора.
  5. Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (Выбор целевой базы данных) (рис. 27.27). В этом окне вы указываете, в какую базу данных следует помещать реплицируемые статьи. Если вы хотите создать новую базу данных, щелкните на кнопке New, чтобы открыть окно Database Properties (Свойства базы данных).

    Окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации)


    Рис. 27.26.  Окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации)

    Окно Choose Destination Database (Выбор целевой базы данных)


    Рис. 27.27.  Окно Choose Destination Database (Выбор целевой базы данных)

  6. Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки) (рис. 27.28). Щелкните на кнопке выбора Yes, чтобы инициализировать схему базы данных и данные у подписчика. Если у вас уже есть ранее созданная схема, щелкните на кнопке выбора No.
  7. Щелкните на кнопке Next, чтобы появилось окно Snapshot Delivery (Доставка снимка) (рис. 27.29). В этом окне вы можете указать папку для снимка, отличную от принятой по умолчанию папки. Если вы не хотите изменять папку для снимка, используйте вариант по умолчанию (первая кнопка выбора).
  8. Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (Задать расписание для агента распространения) (рис. 27.30). В этом окне вы можете выбрать непрерывные обновления, обновления по расписанию или обновления по запросу. В большинстве случаев предпочтительным вариантом являются обновления по расписанию (вторая кнопка выбора).

     Окно Initialize Subscription (Инициализация подписки)


    Рис. 27.28.  Окно Initialize Subscription (Инициализация подписки)

    Окно Snapshot Delivery (Доставка снимка)


    Рис. 27.29.  Окно Snapshot Delivery (Доставка снимка)

     Окно Set Distribution Agent Schedule (Задать расписание для агента распространения)


    Рис. 27.30.  Окно Set Distribution Agent Schedule (Задать расписание для агента распространения)

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

    Чтобы изменить расписание для агента Distribution Agent, щелкните на кнопке Change и модифицируйте расписание в появившемся диалоговом окне Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий).

    Примечание.Если у вас выбрано преобразование данных публикации, то появится окно Specify DTS Package (Задать пакет DTS). Для продолжения работы у вас уже должен быть создан пакет DTS. Если у вас еще нет такого пакета, создайте его и затем снова запустите мастер. В данном примере мы не задаем преобразование данных.
  9. Щелкните на кнопке Next, чтобы появилось окно Start Required Services (Запуск требуемых служб) (рис. 27.31). Вы можете запустить из этого окна SQL Server Agent, если он еще не запущен. В этом окне показано, запущен ли SQL Server Agent на данном подписчике. Если SQL Server Agent не запущен, вы получите запрос на его запуск. Если вы хотите запустить SQL Server Agent вручную, раскройте папку Management (Управление) в окне Enterprise Manager, щелкните правой кнопкой мыши на SQL Server Agent и используйте пункты появившегося контекстного меню для запуска или остановки SQL Server Agent.

    Окно Start Required Services (Запуск требуемых служб)


    Рис. 27.31.  Окно Start Required Services (Запуск требуемых служб)

  10. Щелкните на кнопке Next, чтобы появилось окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки) (рис. 27.32). Щелкните на кнопке Finish, чтобы завершить задание параметров подписчика.

Теперь статьи будут реплицироваться на подписчик и будут регулярно обновляться в соответствии с заданным вами расписанием. Возможно, что прежде чем можно будет начать репликацию, вам потребуется проверить расписание, в соответствии с которым будут запускаться агенты публикации. Агент Snapshot Agent запускается по своему собственному расписанию, и если вы не сконфигурировали его для немедленного распространения снимка на дистрибьютор, то для поступления данных на дистрибьютор может потребоваться некоторое время. Несмотря на то, что репликация действует, реальные данные не поступят подписчику, пока не выполнит свою работу Snapshot Agent.

Окно Completing the Pull Subscription Wizard


Рис. 27.32.  Окно Completing the Pull Subscription Wizard

Конфигурирование push-подписок

Push-подписка (принудительная подписка) инициируется на издателе. Push-подписка конфигурируется с помощью мастера Push Subscription Wizard. При использовании push-подписки расписание репликаций определяется на дистрибьюторе. Для запуска мастера Push Subscription Wizard выполните следующие шаги:

  1. Вызовите Push Subscription Wizard, используя один из двух методов. Для использования первого метода укажите пункт Replication в меню Tools окна Enterprise Manager и затем выберите пункт Push Subscription to Others (Push-подписка для других). Появится диалоговое окно Create and Manage Publications (Создание и управление публикациями) (рис. 27.33).

    Публикация, выбранная в диалоговом окне Create and Manage Publications


    Рис. 27.33.  Публикация, выбранная в диалоговом окне Create and Manage Publications

    Выделите публикацию в списке Databases and Publications (Базы данных и публикации) и затем щелкните на кнопке Push New Subscription (Создать push-подписку). Чтобы использовать второй метод, выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizards, выберите Create Push Subscription Wizard и щелкните на кнопке ОК. Выделите публикацию в появившемся диалоговом окне Create and Manage Publications и затем щелкните на кнопке Push New Subscription. Появится начальное окно мастера Push Subscription Wizard (рис. 27.34).

    Начальное окно мастера Push Subscription Wizard


    Рис. 27.34.  Начальное окно мастера Push Subscription Wizard

  2. Щелкните на кнопке Next, чтобы появилось окно Choose Subscribers (Выбор подписчиков) (рис. 27.35). В этом окне выбирается система, которая будет получателем выбранной вами публикации.

    Окно Choose Subscribers (Выбор подписчиков)


    Рис. 27.35.  Окно Choose Subscribers (Выбор подписчиков)

  3. Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (рис. 27.36). В этом окне вы указываете базу данных, в которой будет размещаться данная публикация на подписчике. Вы можете выбрать базу данных, которая уже существует, или создать новую базу данных – в зависимости от конфигурации вашей системы и ваших требований.

      Окно Choose Destination Database


    Рис. 27.36.  Окно Choose Destination Database

  4. Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Location (Задать местоположение для агента распространения) (рис. 27.37). Здесь вы можете выбрать между выполнением этого агента распространения на дистрибьюторе (принятый по умолчанию и рекомендуемый вариант) и его выполнением на подписчике. Для тех, кто знаком с репликацией транзакций в SQL Server 7, это новая возможность.

    Окно Set Distribution Agent Location (Задать местоположение для агента распространения)


    Рис. 27.37.  Окно Set Distribution Agent Location (Задать местоположение для агента распространения)

  5. Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (рис. 27.38). Здесь вы можете выбрать между непрерывным обновлением подписки или ее обновлением в соответствии с указанным вами расписанием. Щелкните на кнопке выбора Using the Following Schedule (Использовать следующее расписание) и щелкните на кнопке Change, чтобы появилось диалоговое окно Edit Recurring Job Schedule. Здесь вы можете легко сконфигурировать повторяющееся расписание. Принимая решение о том, насколько часто должна обновляться подписка, следует помнить, что при непрерывном обновлении возникает большая дополнительная нагрузка. Отметим, что репликация по запросу недоступна для push-подписки.

     Окно Set Distribution Agent Schedule


    Рис. 27.38.  Окно Set Distribution Agent Schedule

  6. Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (рис. 27.39).

      Окно Initialize Subscription


    Рис. 27.39.  Окно Initialize Subscription

    В этом окне вы указываете, нужно ли инициализировать данную подписку. По умолчанию выбран вариант инициализации схемы и набора данных на подписчике. В этом окне вы можете также запустить Snapshot Agent, если он еще не запущен. Имеет смысл запускать Snapshot Agent, когда вы инициализируете снимок; в противном случае вам придется запускать этот агент вручную. После того как снимок инициализирован и начинается репликация, вам не нужно использовать снимок, пока не потребуется создать новую подписку. Каждый раз, как вы создаете подписку, создавайте новый снимок, и вам больше не нужно создавать снимки в соответствии с каким-либо расписанием, если только вам не потребуется ресинхронизация базы данных подписчика с использованием снимков.
  7. Щелкните на кнопке Next, чтобы появилось окно Start Required Services (рис. 27.40). Вы можете задать, чтобы агент SQL Server Agent был запущен автоматически, если он еще не запущен.

    Окно Start Required Services


    Рис. 27.40.  Окно Start Required Services

  8. Щелкните на кнопке Next, чтобы появилось окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки) (рис. 27.41). Просмотрите сводку ваших установок и затем щелкните на кнопке Finish, чтобы начать процесс копирования снимка подписчику. После завершения работы этого мастера создается push-подписка, которая будет обновляться на регулярной основе.

    Окно Comple-ting the Push Subscription Wizard (Завершение работы мастера push-подписки)


    Рис. 27.41.  Окно Comple-ting the Push Subscription Wizard (Завершение работы мастера push-подписки)

Дополнительная информация.Обратитесь к разделу "Управление репликацией" лекции 26 для получения информации по управлению и устранению проблем репликации, мониторингу и управлению агентами репликации, отключению репликации, а также удалению подписок, распространения и публикования.

Конфигурирование, мониторинг и настройка дистрибьютора для репликации транзакций

В этом разделе вы узнаете, как осуществлять конфигурирование, мониторинг и настройку дистрибьютора для репликации транзакций Как уже говорилось в предыдущей лекции, дистрибьютор – это сервер, содержащий базу данных SQL Server, которая называется дистрибутивной базой данных и используется как хранилище данных репликации. Эти данные хранятся в базе данных SQL Server, обеспечивая ряд преимуществ, включая следующие:

Конфигурирование дистрибьютора

В зависимости от того, как часто вносятся модификации в вашу базу данных, интенсивность операций на дистрибьюторе может оказаться довольно высокой. Поскольку дистрибьютор использует базу данных SQL Server, все модификации, выполняемые на дистрибьюторе, должны протоколироваться в журнале транзакций. Вам следует конфигурировать дистрибутивную базу данных и этот журнал достаточно большими, чтобы можно было выполнять необходимую работу, и достаточно быстрыми, чтобы выполнять эту работу эффективно. Хотя принятая по умолчанию конфигурация распространения подходит для небольших систем репликации, она не соответствует многим системам, поскольку мастера репликации SQL Server не размещают журнал транзакций и файлы данных SQL Server оптимальным образом. Они обычно размещаются на принятом по умолчанию томе SQL Server, причем журнал транзакций и файлы базы данных оказываются на одном томе.

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

Конфигурирование дистрибьютора с помощью Enterprise Manager

Для конфигурирования дистрибутивной базы данных, как это показано в предыдущем списке, вам нужно задать, где находится эта база данных. Чтобы сделать это с помощью Enterprise Manager, сначала вызовите мастер Configure Publishing and Distribution Wizard. Используйте этот мастер, чтобы задать публикование и распространение, указывая в окне Customize the Configuration (Настройка конфигурации), что вы хотите настроить параметры распространения (щелкнув на кнопке Yes). Это позволяет вам задать местоположение дистрибутивной базы данных вручную. (Это также позволяет вам выбирать имя для базы данных, активизировать публикование и создавать как публикации, так и подписчиков.)

К сожалению, используя этот мастер, вы не можете задавать размер дистрибутивной базы данных. Вы можете увеличить размер дистрибутивной базы данных, вызвав окно свойств этой базы данных в Enterprise Manager и изменив размер базы данных или файлов журнала транзакций. Если вы хотите одновременно задать местоположение базы данных и ее размер, то вы можете использовать хранимую процедуру sp_adddistributiondb.

Конфигурирование дистрибьютора с помощью sp_adddistributiondb

С помощью системной хранимой процедуры sp_adddistributiondb вы можете использовать сценарий создания дистрибутивной базы данных. Это полезно, когда вы хотите задать размер и местоположение этой базы данных и ее журнала транзакций. И написав сценарий, с помощью которого создается дистрибутивная база данных, вы можете использовать его для различных систем или для повторного создания дистрибутивной базы данных в случае реконфигурирования системы.

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

Синтаксис хранимой процедуры sp_adddistributiondb приводится в SQL Server Books Online. Ниже показан пример использования этой хранимой процедуры:

sp_adddistributor Dash

Следующий оператор SQL инициализирует систему с именем Dash как дистрибьютора.

sp_adddistributiondb @database=dist,
@data_folder=’C:\mssql2000\data’,
@data_file=’dist.mdf’,
@data_file_size=10,
@log_folder=’C:\mssql2000\data’,
@log_file=’dist.ldf’,
@log_file_size=2,
@min_distretention=0,
@max_distretention=72,
@history_retention=96,
@security_mode=0,
@login=’sa’,
@password=’’,
@createmode=0
Мониторинг дистрибьютора

Мониторинг дистрибьютора осуществляется с помощью монитора производительности Microsoft Windows 2000 Performance Monitor (perfmon). В этом мониторе имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Это следующие объекты:

Используя Performance Monitor для мониторинга этих значений, вы можете иногда определять наличие проблем производительности на дистрибьюторе. Данные perfmon дают массу полезной информации, но она не всегда идентифицирует проблемы. В случае мониторинга дистрибьютора нас больше всего интересует объект SQLServer:Replication Dist. Этот объект предоставляет следующие счетчики:

Хотя эти счетчики являются в некотором смысле индикаторами того, как работает процесс распространения в целом, они недостаточно полезны, когда вы определяете, нужна ли вам настройка дистрибьютора, поскольку наиболее важным аспектом настройки дистрибьютора является настройка базы данных SQL Server. Вам следует на самом деле следить в основном за следующими проблемами:

Настройка дистрибьютора

Как уже говорилось выше, дистрибьютор – это сервер, содержащий дистрибутивную базу данных, и эта база данных должна быть настроена таким же образом, как и любая другая база данных SQL Server. Вы можете повысить производительность дистрибьютора путем выбора состава системы, хотя, как вы знаете из лекции 6, в некоторых случаях это сложная задача. Дистрибьютор должен обладать достаточной мощностью, чтобы выполнять дополнительную работу. Дистрибьютор является "посредником" между издателями и подписчиками, и его следует сконфигурировать так, чтобы он не был узким местом. Ниже приводятся некоторые советы по конфигурированию и настройке дистрибьютора:

Настройка репликации транзакций

В этом разделе вы узнаете, как конфигурировать и настраивать систему репликации транзакций для получения высокой производительности. Раздел начинается с обзора атрибутов репликации транзакций, после чего даются рекомендации по конфигурированию, мониторингу и настройке.

Атрибуты репликации транзакций

Репликация транзакций начинается с копирования снимка на дистрибьютор и затем на подписчик. После копирования снимка на дистрибьюторе начинает работать агент Log Reader Agent, который выполняет чтение журнала транзакций издателя в непрерывном режиме или в соответствии с регулярным расписанием. Периодичность чтения журнала транзакций определяется тем, как вы сконфигурировали Log Reader Agent. (Нагрузка, налагаемая на издатель при чтении журнала транзакций, – это единственная нагрузка на издатель, относящаяся к репликации.)

Транзакции, которые считываются агентом Log Reader Agent из журнала транзакций на издателе, помещаются в дистрибутивную базу данных. Затем эти транзакции передаются подписчикам. Имеются следующие факторы, которые могут ограничить производительность репликации транзакций.

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

Конфигурирование репликации транзакций

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

Конфигурирование достаточной мощности ввода-вывода

Конфигурируя достаточную мощность подсистем ввода-вывода, вы можете повысить производительность всего процесса репликации. Как и в любой системе SQL Server, журнал транзакций системы, участвующей в репликации, должен находиться для защиты данных на своем томе RAID 1. Файлы данных должны находиться на одном или нескольких томах RAID 10 или RAID 5. В отличие от репликации снимков для репликации транзакций требуются лишь небольшие изменения в стандартных конфигурациях ввода-вывода. Эти требования описаны в данном разделе.

Конфигурирование подсистемы ввода-вывода на издателе. В общем случае при конфигурировании подсистемы ввода-вывода издателя вы должны следовать стандартным рекомендациям по конфигурированию SQL Server, описанным на протяжении этой книги. Однако для журнала транзакций издателя может потребоваться более высокая мощность ввода-вывода, чем это обычно требуется. Обычно журнал транзакций следует конфигурировать на томе RAID 1. При необходимости (это зависит от степени занятости вашей системы) вам следует сконфигурировать его на томе RAID 10, используя большее количество дисков. RAID 5 не подходит для журнала транзакций.

Конфигурирование подсистемы ввода-вывода на дистрибьюторе. Дистрибьютор следует конфигурировать таким образом, чтобы дистрибутивная база данных имела собственный журнал транзакций на выделенном томе RAID 1. Это позволит получить максимальную производительность для журнала дистрибутивной базы данных, что повысит производительность самого дистрибьютора.

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

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

При большом количестве операций, применяемых к дистрибутивной базе данных другими источниками (то есть издателем и несколькими подписчиками) попытайтесь снизить размер пакета. Если Log Reader Agent запускается в соответствии с периодическим расписанием и получает много транзакций для единовременной вставки в дистрибутивную базу данных, то вам, видимо, поможет увеличение размера пакета. Может быть, вам не потребуется изменять размер пакета; но если вы будете делать это, сравните отличия в производительности при увеличении и уменьшении этого размера, чтобы определить, какой вариант лучше.

Вы можете конфигурировать размер пакета фиксирования в Enterprise Manager, вызвав окно свойств агента распространения Distribution Agent. (См. раздел "Мониторинг и управление агентами репликации" в лекции 26.)

Настройка Log Reader Agent

Как уже говорилось, операции чтения журнала транзакций издателя, выполняемые агентом Log Reader Agent, могут приводить к прерыванию операций ввода-вывода, которые обычно выполняются последовательным образом. Конфигурируя Log Reader Agent, вы можете снизить его влияние на этот журнал. Существует несколько способов сделать операции Log Reader Agent более эффективными. Один из способов – это использование дискового контроллера с кэшем для дискового тома с этим журналом. Поскольку Log Reader Agent выполняет чтение с диска журнала, то кэш на контроллере позволит осуществлять чтение из этого кэша вместо применения операций ввода-вывода с произвольным доступом.

Еще один способ настройки Log Reader Agent – это его конфигурирование для менее частого запуска. Log Reader Agent может работать в непрерывном режиме или периодически. Если в вашей системе не происходит большого количества модификаций, то, возможно, Log Reader Agent может работать непрерывно без нарушения доступа к журналу транзакций. Но при высоком уровне занятости журнала транзакций вашей системы вы можете увеличить производительность издателя, задав менее частые запуски Log Reader Agent. Тогда Log Reader Agent будет выполнять чтение из журнала транзакций реже, что позволит сохранить последовательный доступ для операций ввода-вывода этого журнала.

И еще одним способом повышения эффективности Log Reader Agent в системах с высокой нагрузкой является увеличение размера пакета чтения. Этот размер определяет, сколько транзакций считывается из журнала транзакций и копируется на дистрибьютор за один раз. Использование этого параметра в системах с высокой нагрузкой может повысить производительность. Кроме того, увеличение размера пакета чтения может оказаться полезным при увеличении интервала опроса. Увеличивая размер пакета чтения для Log Reader Agent, вам следует также увеличить размер пакета фиксирования транзакций на дистрибьюторе, чтобы привести его в соответствие с новым размером пакета чтения.

Вы можете конфигурировать агент Log Reader Agent путем вызова окна его свойств в Enterprise Manager. (См. раздел "Мониторинг и управление агентами репликации" в лекции 26.)

Мониторинг системы репликации транзакций

Мониторинг операций репликации транзакций выполняется так же, как и мониторинг других типов репликации, т.е. через Performance Monitor (perfmon). В perfmon имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Это следующие объекты:

Используя Performance Monitor для мониторинга этих значений, вы можете определить наличие проблем производительности Log Reader Agent или дистрибьютора. Данные perfmon дают массу полезной информации, но она не всегда идентифицирует проблемы.

Настройка системы репликации транзакций

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

Кроме того, если в вашей системе происходят частые обновления, вам может потребоваться увеличение размера пакета чтения. Как уже говорилось, это позволит агенту Log Reader Agent считывать за один раз больше транзакций. Если увеличить это значение и оставить интервал опроса в 10 секунд, то будет реплицироваться больше транзакций и станет меньше дополнительная нагрузка.

Вам может также потребоваться мониторинг производительности сети и (при необходимости) ее увеличение, как и в случае репликации снимков. Если ваша система работает неадекватным образом, например, если центральные процессоры и подсистемы ввода-вывода достигли предела своих возможностей, а процесс репликации занимает слишком много времени, то у вас, возможно, имеются сетевые проблемы. К сожалению, сетевые проблемы нельзя диагностировать с помощью perfmon. Следует использовать продукт для мониторинга сети, такой как Microsoft Systems Management Server (SMS). Выполните мониторинг сетевой платы, чтобы определить, не достигла ли она предела своих возможностей.

И, наконец, помните, что издатель, дистрибьютор и подписчики – это системы SQL Server. Поэтому вам следует настраивать эти системы точно так же, как и любую другую систему SQL Server. Рекомендации по настройке систем SQL Server приводятся на протяжении всей этой книги.

Реализация репликации транзакций

В этом разделе вы узнаете о методах реализации репликации транзакций. Она может быть реализована по схеме "один-к-многим" или "многие-к-одному". Репликация транзакций часто реализуется через глобальную сеть (WAN).

Репликация типа "один-к-многим"

В большинстве реализаций репликации транзакций используется схема "один-к-многим". При этом типе реализации одна таблица публикуется для одного или нескольких подписчиков.

Репликация типа "многие-к-одному"

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

Репликация через глобальную сеть (WAN)

Репликация через глобальную сеть не только возможна, но и довольно широко распространена. Если вы реплицируете данные через глобальную сеть, то вам следует непрерывно следить за операциями распространения и выявлять случаи слишком длительной репликации, связанные с ограничениями пропускной способности сети. Кроме того, если возможно, конфигурируйте репликацию таким образом, чтобы взаимодействие через глобальную сеть выполнялось только агентом Distribution Agent. Это означает конфигурирование системы таким образом, чтобы дистрибьютор и издатель находились по одну сторону глобальной сети.

Заключение

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

Лекция 28. Репликация слиянием

Завершающая лекция, рассказывающая о репликациях. Репликация слиянием осуществляется путем инсталляции триггеров на издателе и на подписчиках. Виды использования, конфигурирование и обработка возникающих проблем – вот что необходимо знать в повседневной работе системного администратора и на что делается акцент при рассмотрении репликаций в данной и двух предыдущих лекциях.

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

Введение в репликацию слиянием

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

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

Как вы узнаете из этой лекции, ключевыми компонентами системы репликации слиянием являются агент слияния Merge Agent и дистрибутивная база данных. Merge Agent согласует (выполняет слияние) накапливающиеся изменения, которые были внесены после предыдущего согласования. В случае репликации слиянием агент распространения (Distribution Agent) не используется – Merge Agent взаимодействует как с и издателем, так и с дистрибьютором. Агент создания снимка (Snapshot Agent) используется только для создания начальной базы данных. Merge Agent выполняет следующие задачи:

  1. Merge Agent загружает все изменения с подписчика.
  2. Все строки без конфликта (строки, которые не были одновременно модифицированы и на издателе, и на подписчике), загружаются сразу; конфликтующие строки (строки, модифицированные на обеих системах) отправляются арбитру. Арбитр – это модуль, который используется для разрешения конфликтов в репликации слиянием. Вы можете конфигурировать этот модуль для разрешения конфликтов в соответствии с вашими требованиями.
  3. Все изменения применяются к издателю.
  4. Merge Agent загружает все изменения с издателя.
  5. Все строки без конфликта загружаются сразу; конфликтующие строки отправляются арбитру.
  6. Все изменения применяются к подписчику.

Этот процесс повторяется в соответствии с тем, как он запланирован. В случае push-подписок (принудительных подписок) агент Merge Agent запускается на издателе. В случае pull-подписок (подписок по запросу) Merge Agent запускается на подписчике. Каждая публикация в репликации слиянием имеет своего собственного агента Merge Agent.

Виды использования репликации слиянием

Репликация слиянием используется при необходимости многонаправленной репликации. Репликация слиянием находит разнообразное применение. То, что подписчики могут модифицировать данные, повышает уровень ее гибкости и применимости. В частности, репликация слиянием может находить следующее применение:

Конфигурирование системы репликации слиянием

Конфигурирование репликации слиянием происходит аналогично конфигурированию репликации моментальных снимков и репликации транзакций. Сначала вы должны сконфигурировать публикацию и затем задать, чтобы она принудительно передавалась подписчику (push-подписка) или запрашивалась подписчиком (pull-подписка).

Примечание.Прежде чем конфигурировать любой тип репликации SQL Server, вы должны сначала сконфигурировать публикование и распространение. (См. разделе "Конфигурирование публикования и распространения" в лекции 26.)
Конфигурирование публикаций

Несмотря на то, что процесс конфигурирования публикаций был описан в лекциях 26 и 27, здесь приводятся процедуры, используемые с целью создания публикаций для репликации слиянием, поскольку они несколько отличаются от процедур, используемых для создания публикаций других типов. Чтобы сконфигурировать публикацию для репликации слиянием, выполните следующие шаги.

  1. В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication (Репликация) и выберите команду Create аnd Manage Publications (Создание и управление публикациями); или выберите пункт Wizards (Мастера), раскройте папку Replication в появившемся в диалоговом окне и выберите Create Publication Wizard (Мастер создания публикации). При любом способе появится диалоговое окно Create аnd Manage Publications (рис. 28.1). В этом диалоговом окне вы можете выбрать базу данных или таблицу, содержащую данные, которые вы хотите публиковать.

     Диалоговое окно Create аnd Manage Publications (Создание и управление публикациями)


    Рис. 28.1.  Диалоговое окно Create аnd Manage Publications (Создание и управление публикациями)

    Если публикации уже существуют, то в дополнение к кнопке Create Publication (Создать публикацию) будут доступны следующие кнопки:
    • Push New Subscription (Новая push-подписка). Позволяет вам создать новую push-подписку для уже существующей публикации. (Cм. раздел "Конфигурирование подписок" далее.)
    • Properties and Subscriptions (Свойства и подписки).Позволяет вам модифицировать свойства как публикаций, так и подписок.
    • Script Publication (Сценарий создания публикации).Позволяет вам создать сценарий, который можно использовать для создания других публикаций.
    • Delete Publication (Удалить публикацию).Позволяет вам удалить уже сконфигурированную публикацию.
  2. Выберите базу данных, которую хотите использовать для данной публикации (на рис. 28.1 выбрана база данных Northwind), и затем щелкните на кнопке Create Publication для вызова мастера Create Publication Wizard. Появится начальное окно мастера (рис. 28.2). Установите флажок Show advanced options in this wizard (Показать дополнительные параметры в этом мастере).

    Начальное окно мастера Create Publication Wizard


    Рис. 28.2.  Начальное окно мастера Create Publication Wizard

  3. Щелкните на кнопке Next, чтобы появилось окно Choose Publication Database (Выбор базы данных для публикации) (рис. 28.3). В этом окне вы можете (снова) выбрать базу данных, содержащую данные, которые хотите публиковать. По умолчанию будет выделена база данных, выбранная вами на шаге 2.

    Окно Choose Publication Database (Выбор базы данных для публикации)


    Рис. 28.3.  Окно Choose Publication Database (Выбор базы данных для публикации)

  4. Щелкните на кнопке Next, чтобы появилось окно Select Publication Type (Выбор типа публикации) (рис. 28.4).

    Окно Select Publication Type (Выбор типа публикации)


    Рис. 28.4.  Окно Select Publication Type (Выбор типа публикации)

    В этом окне вы можете выбрать один из трех типов репликации. Будут представлены следующие варианты выбора:
    • Snapshot publication (Публикация для репликации снимков).Создает публикацию для репликации снимка соответствующей статьи, который периодически копируется на подписчик. Такую публикацию можно создавать из любой таблицы.
    • Transactional publication (Публикация для репликации транзакций). Создает публикацию для репликации транзакций, в соответствии с которыми происходит обновление подписки изменениями, выполненными на издателе. Статьи могут создаваться только из таблиц с первичным ключом.
    • Merge publication (Публикация для репликации слиянием).Создает публикацию для репликации слиянием, которая позволяет выполнять двустороннюю репликацию между издателем и подписчиком. Статьи могут создаваться из любых таблиц.
  1. Щелкните на кнопке выбора Merge publication и щелкните на кнопке Next, чтобы появилось окно Specify Subscriber Types (Указание типов подписчиков) (рис. 28.5). В этом окне вы можете указывать, будут ли все подписчики использовать SQL Server. Если возможно, используйте установку по умолчанию, которая указывает, что все серверы-подписчики будут работать с SQL Server 2000 (Servers running SQL Server 2000). Если вас устраивает этот выбор, то вы конфигурируете репликацию для использования собственных типов данных SQL Server 2000. Если в вашей конфигурации имеются системы с SQL Server 7, установите второй флажок. Если используются устройства SQL Server CE, установите третий флажок. Если в вашей конфигурации имеются системы, не использующие SQL Server, вам следует установить четвертый флажок, который указывает, что данные репликации будут преобразовываться в символьный формат. Это преобразование сложных собственных типов данных приводит к дополнительной нагрузке на серверы.

    Окно Specify Subscriber Types (Указание типов подписчиков)


    Рис. 28.5.  Окно Specify Subscriber Types (Указание типов подписчиков)

  2. Щелкните на кнопке Next, чтобы появилось окно Specify Articles (Указание статей) (рис. 28.6). В этом окне вы можете указывать таблицы, хранимые процедуры и представления, которые будут реплицироваться как статьи. Эти статьи образуют публикацию, которую вы создаете. Выберите все нужные вам таблицы, хранимые процедуры и представления в правой части окна или установите один или несколько флажков в колонке Publish All (Публиковать все) для выбора всех элементов объектов соответствующего типа в базе данных. Напомним, что каждый объект рассматривается как статья, а публикация – это набор логически сгруппированных статей.

     Окно Specify Articles (Указание статей)


    Рис. 28.6.  Окно Specify Articles (Указание статей)

    Примечание.Если на подписчике имеются хранимые процедуры, то репликацию можно сконфигурировать таким образом, чтобы реплицировать вызовы этих хранимых процедур, а не результаты вызовов хранимых процедур.
  3. Поскольку мы указываем репликацию слиянием, то можно определить дополнительные атрибуты по статьям. Чтобы сконфигурировать эти атрибуты, сначала щелкните на кнопке [...] справа от определения соответствующей статьи. Появится окно Article Properties (Свойства статьи) (рис. 28.7).

    Вкладка General окна Table Article Properties (Свойства статьи)


    Рис. 28.7.  Вкладка General окна Table Article Properties (Свойства статьи)

    Во вкладках этого окна вы можете конфигурировать различные свойства статьи. На рис. 28.7 показана вкладка General (Общие). Здесь вы можете задавать имя статьи и владельца целевой базы данных, а также определять, что считается конфликтом. Принятый по умолчанию вариант (вторая кнопка выбора) указывает, что модификации, которые вносятся в одну колонку двумя источниками, будут рассматриваться как конфликт. Вы можете расширить это определение (первая кнопка выбора), указав, что изменения, которые вносятся в одну строку двумя источниками, будут рассматриваться как конфликт.
  4. Щелкните на вкладке Resolver (Арбитр) (рис. 28.8), чтобы выбрать арбитра. При использовании арбитра по умолчанию (первая кнопка выбора) издатель всегда "выигрывает" конфликт у подписчика. Кроме того, для синхронизации первый подписчик всегда "выигрывает" конфликт среди подписчиков. Обычно это желательный способ разрешения конфликтов. Вы можете вместо этого выбрать один из ряда других арбитров, включая настраиваемые арбитры, которые вы можете определять самостоятельно.

    Вкладка Resolver (Арбитр) окна Table Article Properties


    Рис. 28.8.  Вкладка Resolver (Арбитр) окна Table Article Properties

  5. Во вкладке Merging Changes (Изменения при слиянии) (рис. 28.9), вы можете задавать дополнительную проверку безопасности для определенных операций. Установив один или несколько флажков в секции Check Permissions (Проверка полномочий) вы указываете, что перед выполнением определенной операции или операций будут проверяться полномочия агента Merge Agent на выполнение этой операции или операций. Кроме того, эта вкладка содержит флажок, который установлен по умолчанию. Этот флажок указывает, что изменения нескольких колонок в одной строке будут выполняться в виде одной операции с оператором UPDATE. Вам следует согласиться с этой установкой по умолчанию. Когда будете готовы продолжить работу, щелкните на кнопке OK.
  6. Щелкните на кнопке Next. На данном этапе происходит проверка публикации, и, скорее всего, вы увидите окно (рис. 28.10). Для репликации слиянием требуется колонка с уникальным идентификатором. Эта колонка автоматически добавляется в таблицу. Кроме того, колонки типа identity будут создаваться с параметром NOT FOR REPLICATION (Не для репликации).

    Вкладка Merging Changes (Изменения при слиянии) окна Table Article Properties


    Рис. 28.9.  Вкладка Merging Changes (Изменения при слиянии) окна Table Article Properties

     Окно Article Issues (Вопросы по статьям)


    Рис. 28.10.  Окно Article Issues (Вопросы по статьям)

  1. Щелкните на кнопке Next. Появится окно Select Publication Name and Description (Выбор имени и описания публикации) (рис. 28.11). В этом окне вы указываете имя и описание публикации.
  2. Щелкните на кнопке Next, чтобы появилось окно Customize the Properties of the Publication (Настройка свойств данной публикации) (рис. 28.12). В этом окне вы указываете, хотите ли определять фильтры данных и настраивать другие свойства публикации. Щелкните на кнопке No (Нет). (О возможностях, которые появляются при щелчке на кнопке Yes см. лекцию 27.)

    Окно Select Publication Name and Description (Выбор имени и описания публикации)


    Рис. 28.11.  Окно Select Publication Name and Description (Выбор имени и описания публикации)

    Окно Customize the Properties of the Publication (Настройка свойств данной публикации)


    Рис. 28.12.  Окно Customize the Properties of the Publication (Настройка свойств данной публикации)

  3. Щелкните на кнопке Next. Появится окно мастера Completing the Create Publication Wizard (Завершение работы мастера создания публикации). Щелкните на кнопке Finish (Готово), и для вас будет создана публикация. Вы увидите ход выполнения по мере завершения различных шагов. И, наконец, вы увидите окно, в котором показаны выполненные шаги и сводка результатов.

Если вы посмотрите теперь содержимое папки Replication Monitor для агентов слияния Merge Agent, то обнаружите, что там ничего нет. Поскольку агенты Merge Agent используются для двусторонней репликации, то прежде чем начать репликацию, вам необходимо сконфигурировать подписчиков. После того как вы сконфигурируете подписчиков, Merge Agents появятся в папке Replication Monitor.

Конфигурирование подписок

Аналогично репликации моментальных снимков и репликации транзакций последним шагом в конфигурировании репликации слиянием является конфигурирование подписчиков. Сначала вы должны активизировать подписчиков в дистрибутивной базе данных; этот процесс был описан в разделе "Активизация подписчиков" лекции 26. Затем вы конфигурируете подписки со стороны подписчика или издателя. Со стороны подписчика вы можете конфигурировать pull-подписку; со стороны издателя вы можете конфигурировать push-подписку.

Конфигурирование pull-подписок

Управление и конфигурирование pull-подписок осуществляется со стороны подписчика. Тем самым вы должны конфигурировать pull-подписку с помощью Enterprise Manager в системе подписчика. Мы уже видели в разделе "Конфигурирование pull-подписок" лекции 27, как конфигурировать pull-подписку. Поскольку в данном случае используются почти те же шаги, мы приведем краткое описание и выделим отличия.

  1. Вызовите окно мастера Pull Subscription Wizard (Мастер pull-подписки).
  2. Появится начальное окно Pull Subscription Wizard.
  3. Щелкните на кнопке Next, чтобы появилось окно Look for Publications (Поиск публикаций) Выберите для данного примера зарегистрированные серверы.
  4. Щелкните на кнопке Next, чтобы появилось окно Choose Publications (Выбор публикаций), и выберите публикацию, которую хотите реплицировать.
  5. Щелкните на кнопке Next, чтобы появилось окно Specify Synchronization Agent Login (Задать учетную запись подключения [login-запись] для агента синхронизации), и укажите, какую учетную запись будет использовать агент слияния для взаимодействия с издателем и дистрибьютором.
  6. Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (Выбор целевой базы данных), и выберите базу данных.
  7. Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки), и щелкните на нужной кнопке выбора.
  8. Щелкните на кнопке Next, чтобы появилось окно Snapshot Delivery (Доставка снимка), и укажите местоположение для снимка.
  9. Щелкните на кнопке Next, чтобы появилось окно Set Merge Agent Schedule (Задать расписание для агента слияния). Это окно аналогично окну Set Distribution Agent Schedule, которое вы видели в предыдущей лекции. Сделайте свой выбор в этом окне.
  10. Щелкните на кнопке Next, чтобы появилось окно Set Subscription Priority (Задать приоритет подписки) (рис. 28.13). Здесь вы можете задать значение приоритета подписки, которое будет использовано для определения "победителя" конфликта. Вариант по умолчанию (рекомендованный) указывает, что для разрешения конфликта будет использоваться значение приоритета по издателю.
  11. Щелкните на кнопке Next, чтобы появилось окно Start Required Services (Запуск требуемых служб), и запустите SQL Server Agent, если он еще не запущен.
  12. Щелкните на кнопке Next, чтобы появилось окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки). Просмотрите ваши установки и затем щелкните на кнопке Finish. По окончании вашей работы с этим мастером будет создана pull-подписка, которая будет обновляться в соответствии с регулярным расписанием.

 Окно Set Subscription Priority (Задать приоритет подписки)


Рис. 28.13.  Окно Set Subscription Priority (Задать приоритет подписки)

Конфигурирование push-подписок

Push-подписка (принудительная подписка) инициируется на издателе. Push-подписка конфигурируется с помощью мастера Push Subscription Wizard (Мастер push-подписки). Для запуска этого мастера выполните следующие шаги:

  1. Вызовите Push Subscription Wizard, используя один из двух методов. Для использования первого метода укажите пункт Replication в меню Tools окна Enterprise Manager и затем выберите пункт Push Subscription to Others (Push-подписка для других). Появится диалоговое окно Create and Manage Publications (Создание и управление публикациями) (рис. 28.14).

    Публикация, выбранная в диалоговом окне Create and Manage Publications (Создание и управление публикациями)


    Рис. 28.14.  Публикация, выбранная в диалоговом окне Create and Manage Publications (Создание и управление публикациями)

    Выделите публикацию в списке Databases and Publications (Базы данных и публикации) и затем щелкните на кнопке Push New Subscription (Создать push-подписку). Чтобы использовать второй метод, выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizards, выберите Create Push Subscription Wizard и щелкните на кнопке OK. Выделите публикацию в появившемся диалоговом окне Create and Manage Publications и затем щелкните на кнопке Push New Subscription.
  2. Появится начальное окно мастера Push Subscription Wizard (рис. 28.15).

    Начальное окно мастера Push Subscription Wizard


    Рис. 28.15.  Начальное окно мастера Push Subscription Wizard

  3. Щелкните на кнопке Next, чтобы появилось окно Choose Subscribers (Выбор подписчиков) (рис. 28.16). В этом окне выбирается система, которая будет получателем выбранной вами публикации. Сделайте выбор из списка активизированных подписчиков.

    Окно Choose Subscribers (Выбор подписчиков)


    Рис. 28.16.  Окно Choose Subscribers (Выбор подписчиков)

  4. Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (рис. 28.17). В этом окне вы указываете базу данных, в которой будет размещаться данная публикация на подписчике. Вы можете выбрать базу данных, которая уже существует, или создать новую базу данных – в зависимости от конфигурации вашей системы и ваших требований. Чтобы увидеть список существующих баз данных, щелкните на кнопке Browse Or Create (Обзор или создание). Если вы хотите создать базу данных, щелкните на кнопке Browse Or Create, щелкните на кнопке Create New (Создать новую) и затем создайте базу данных в появившемся окне Database Properties (Свойства базы данных).

     Окно Choose Destination Database


    Рис. 28.17.  Окно Choose Destination Database

  5. Щелкните на кнопке Next, чтобы появилось окно Set Merge Agent Location (Задать местоположение для агента слияния) (рис. 28.18). Здесь вы можете выбрать, где будет запускаться Merge Agent. Вы можете согласиться с вариантом, принятым по умолчанию, который указывает запуск Merge Agent на дистрибьюторе, или выбрать запуск агента на подписчике. Если ваш дистрибьютор не слишком сильно загружен, вам следует принять вариант по умолчанию.

     Окно Set Merge Agent Location (Задать местоположение для агента слияния)


    Рис. 28.18.  Окно Set Merge Agent Location (Задать местоположение для агента слияния)

  6. Щелкните на кнопке Next, чтобы появилось окно Set Merge Agent Schedule (рис. 28.19). В этом окне вы можете выбрать непрерывные обновления или обновления по указанному вами расписанию. Щелкните на кнопке Change, чтобы появилось диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий). Здесь вы можете легко конфигурировать повторяющееся расписание. Принимая решение о том, как обновлять подписку, помните, что непрерывные обновления сопряжены с большой нагрузкой на систему.

    Окно Set Merge Agent Schedule (Задать расписание для агента слияния)


    Рис. 28.19.  Окно Set Merge Agent Schedule (Задать расписание для агента слияния)

  1. Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки) (рис. 28.20).

    Окно Initialize Subscription (Инициализация подписки)


    Рис. 28.20.  Окно Initialize Subscription (Инициализация подписки)

    В этом окне вы указываете, нужно ли инициализировать данную подписку. По умолчанию выбран вариант инициализации схемы и набора данных на подписчике. В этом окне вы можете также запустить Snapshot Agent, если он еще не запущен. Имеет смысл запускать Snapshot Agent, когда вы инициализируете снимок; в противном случае вам придется запускать этот агент вручную. После того как снимок инициализирован и начинается репликация, вам не нужно использовать снимок, пока не потребуется создать новую подписку. Каждый раз, как вы создаете подписку, создавайте новый снимок, и вам больше не нужно создавать снимки в соответствии с каким-либо расписанием, если только вам не потребуется ресинхронизация базы данных подписчика с использованием снимков.
  2. Щелкните на кнопке Next, чтобы появилось окно Set Subscription Priority (рис. 28.21). Здесь вы можете задать значение приоритета подписки, которое будет использовано для определения "победителя" конфликта. Вариант по умолчанию (рекомендованный) указывает, что для разрешения конфликта будет использоваться значение приоритета по издателю.

    Окно Set Subscription Priority (Задать приоритет подписки)


    Рис. 28.21.  Окно Set Subscription Priority (Задать приоритет подписки)

  3. Щелкните на кнопке Next, чтобы появилось окно Start Required Services (рис. 28.22), где вы можете задать запуск агента SQL Server Agent, если он еще не запущен.

    Окно Start Required Services


    Рис. 28.22.  Окно Start Required Services

  4. Щелкните на кнопке Next, чтобы появилось окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки) (рис. 28.23). Просмотрите сводку ваших установок и затем щелкните на кнопке Finish, чтобы начать процесс копирования снимка подписчику. После завершения работы этого мастера создается push-подписка, которая будет обновляться на регулярной основе.

    Окно Completing the Push Subscription Wizard


    Рис. 28.23.  Окно Completing the Push Subscription Wizard

Управление репликацией

Теперь вы знаете, как создавать и конфигурировать реплицируемую базу данных в среде SQL Server 2000. Чтобы управлять этой реплицируемой средой или устранять проблемы, если репликация не запускается, вы будете использовать возможности мониторинга и параметры конфигурирования в Enterprise Manager.

Мониторинг и управление агентами репликации

Агенты репликации можно найти в папке Replication Monitor окна Enterprise Manager. Для доступа к этим агентам выполните следующие шаги.

  1. Раскройте группу серверов, раскройте сервер и затем раскройте папку Replication Monitor.
  2. Если сервер, который вы раскрыли, является издателем, то под папкой Replication Monitor появится папки Publishers (Издатели) и Agents (Агенты). В папке Publishers находятся издатели, которые принадлежат данному серверу. В папке Agents находятся папки для агентов Snapshot Agents, Log Reader Agents, Distribution Agents, Merge Agents и различных агентов (папка Miscellaneous Agents), которые используются для очистки и протоколирования выполняемых операций.
  3. Хотя обычно не требуется запускать или прекращать работу агентов, вы можете использовать для этого Replication Monitor. Если создается впечатление, что ваша реплицируемая система не работает после того, как вы сконфигурировали ее, то вполне вероятно, что не запущен агент Snapshot Agent, возможно, из-за того, что этот агент использует принятое по умолчанию расписание. (Именно поэтому в процессе конфигурирования вы имеете возможность сразу инициализировать создание снимка.) Проверяйте состояние агентов, щелкая на папке соответствующих агентов в Enterprise Manager и просматривая информацию об этих агентах в правой панели (рис. 28.24). Здесь вы можете определить, был ли запущен данный агент, и можете запустить его при необходимости. После запуска агента он действует, пока не закончит свою работу, после чего он становится неактивным. После этого SQL Server Agent будет запускать этот агент репликации, исходя из его регулярного расписания.

    Агент Merge Agent, представленный в окне Enterprise Manager


    увеличить изображение

    Рис. 28.24.  Агент Merge Agent, представленный в окне Enterprise Manager

  4. Щелкните правой кнопкой мыши на агенте, чтобы появилось контекстное меню, содержащее ряд опций, которые вы можете использовать для мониторинга и управления агентами. Меню, которое появляются для агента Merge Agent (рис. 28.25).

    Ниже описываются опции меню для агента Merge Agent.

    • Error Details (Подробности ошибок).Выводятся подробное описание возникших ошибок.
    • Agent History (Журнал работы агента). Выводится протокол операций агента.
    • Agent Properties (Свойства агента).Позволяет вам модифицировать расписание работы агента репликации. Вы можете также модифицировать метод доступа к базе данных, задачи данного агента и уведомления. Кроме того, вы можете задать получение сообщений электронной почты, оповещающих вас о событиях данного агента.

      Опции агента Merge Agent


      увеличить изображение

      Рис. 28.25.  Опции агента Merge Agent

    • Agent Profiles (Профили агента). Позволяет вам просматривать и модифицировать параметры агента, такие как тайм-ауты учетной записи подключения (login), размер пакета и тайм-ауты запросов.
    • Run Agent At Subscriber (Запуск агента на подписчике). Позволяет указывать запуск агента на подписчике.
    • Run Agent At Distributor (Запуск агента на дистрибьюторе). Позволяет указывать запуск агента на дистрибьюторе.
    • Start Agent и Stop Agent (Запуск агента и Остановка агента). Позволяют вам запускать агент, если он остановлен, или останавливать его, если он запущен.
    • Refresh Rate And Settings (Частота и параметры обновления). Позволяет вам модифицировать частоту обновления данных монитора производительности Performance Monitor.
    • Select Columns (Выбрать колонки). Позволяет вам указывать, какие колонки просматриваются в панели результатов.
    • Show Anonymous Subscriptions (Показать анонимные подписки). Указывает, будут ли показаны анонимные подписки в этом окне.
    • Help (Справка). Справочная информация для данного окна.
Конфигурирование Merge Agent

После создания публикации вам, возможно, потребуется модифицировать поведение агента слияния Merge Agent. Например, вы можете задать, как происходит вызов Merge Agent, выбрав режим, в котором он будет работать. В непрерывном режиме запуск Merge Agent происходит при запуске SQL Server Agent. В режиме расписания (который является предпочтительным режимом) Merge Agent запускается в соответствии с расписанием и переходит в неактивное состояние после доставки всех реплицируемых транзакций. Чтобы сконфигурировать Merge Agent, выполните следующие шаги.

  1. В окне Enterprise Manager раскройте сервер, раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Merge Agents.
  2. В правой панели Enterprise Manager щелкните правой кнопкой мыши на публикации и выберите из появившегося контекстного меню пункт Agent Properties (Свойства агента).
  3. Появится окно свойств данного агента Merge Agent (рис. 28.26).

     Вкладка General окна свойств Merge Agent


    Рис. 28.26.  Вкладка General окна свойств Merge Agent

  4. Щелкните на вкладке Steps (Шаги) (рис. 28.27).

    Вкладка Steps (Шаги) окна свойств Merge Agent


    Рис. 28.27.  Вкладка Steps (Шаги) окна свойств Merge Agent

    В этой вкладке вы увидите шаги, которые выполняет данный Merge Agent, когда происходит его вызов. Здесь выводятся и описываются три следующих шага.
    • Merge Agent Startup Message (Сообщение о запуске агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение (таблица MSLogreader_history в дистрибутивной базе данных).
    • Run Agent (Запуск агента). Запуск данного агента в соответствии с заданным расписанием. При работе в непрерывном режиме этот агент работает, пока не будет отключена система.
    • Detect Nonlogged Agent Shutdown (Обнаружено незарегистрированное отключение агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение в случае отключения агента.
  5. Выделите шаг Run Agent и щелкните на кнопке Edit (Редактировать), чтобы появилось диалоговое окно Edit Job Step (Редактирование шага) (рис. 28.28). В этом диалоговом окне вы можете конфигурировать способ вызова Merge Agent.

     Вкладка General диалогового окна Edit Job Step (Редактирование шага)


    Рис. 28.28.  Вкладка General диалогового окна Edit Job Step (Редактирование шага)

    Для агента Merge Agent можно сконфигурировать много параметров. Параметры по умолчанию этого агента можно модифицировать в окне Command (Команда) диалогового окна Edit Job Step и в диалоговом окне Replication Agent Profile Details (Детали профиля агента репликации), которое описано ниже в этой лекции. Здесь описаны два параметра, которые вы можете модифицировать в диалоговом окне Edit Job Step. Д
    • Continuous (Непрерывный). Указывает, работает ли Merge Agent в непрерывном режиме. Чтобы задать режим расписания, удалите этот параметр.
    • DistributorSecurityMode (Режим безопасности дистрибьютора). Указывает, какой режим аутентификации использует Merge Agent: SQL или Microsoft Windows 2000.
    Кроме того, вы можете задать в диалоговом окне Edit Job Step другие параметры, такие как LoginTimeout, PollingInterval, QueryTimeout, информацию о дистрибьюторе и подписчиках и Output.
    Дополнительная информация. Описание этих параметров можно найти в SQL Server Books Online. Выполните поиск "Merge Agent, starting" (Merge Agent, запуск) в индексе Books Online.
  6. Закончив модифицирование свойств Merge Agent, щелкните на кнопке OK, чтобы сохранить ваши изменения.

Вы можете модифицировать другие параметры в профиле Merge Agent. Чтобы модифицировать профиль, выполните следующие шаги:

  1. В правой панели Enterprise Manager щелкните правой кнопкой мыши на Merge Agent, как это описано выше в этом разделе, и выберите из появившегося контекстного меню пункт Agent Profiles (Профили агента). Появится диалоговое окно Merge Agent Profiles (рис. 28.29).

    Диалоговое окно Merge Agent Profiles


    Рис. 28.29.  Диалоговое окно Merge Agent Profiles

    Отметим, что это диалоговое окно содержит гораздо больше вариантов, чем диалоговое окно Log Reader Agent Profiles, которое вы видели в лекции 27. Эти профили обеспечивают широкий диапазон функциональных возможностей, чтобы вы могли выбрать профиль, который наиболее подходит для конкретной конфигурации вашей системы.
  2. Щелкните на кнопке New Profile (Создать профиль), чтобы создать новый профиль. Текущий профиль нельзя модифицировать. В результате появится диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации), (рис. 28.30).
  3. В этом диалоговом окне вы можете модифицировать следующие параметры:
    • BcpBatchSize. Указывает количество строк, которые будут передаваться в операции массового копирования. Он используется в основном для журнального протоколирования.
    • ChangesPerHistory. Указывает пороговое значение, при переходе которого происходит журнальное протоколирование передаваемых и получаемых сообщений.
    • DownloadGenerationsPerBatch. Указывает количество поколений данных, которое будет загружаться в пакете
    • DownloadReadChangesPerBatch. Указывает количество изменений, которое будет считываться в пакете.
    • DownloadWriteChangesPerBatch. Указывает количество изменений, которое будет применяться в пакете.

      иалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)


      Рис. 28.30.  иалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)

    • FastRowCount. Указывает тип проверки достоверности, который будет использоваться. Значение 1 указывает быстрый метод, значение 0 – метод подсчета строк (rowcount).
    • HistoryVerboseLevel. Указывает, сколько информации будет протоколироваться в журнале.
    • KeepAliveMessageInterval. Указывает количество секунд между проверкой с помощью метода контрольных импульсов (heartbeat), реализуемого участниками репликации, чтобы определить, функционируют ли остальные участники репликации.
    • LoginTimeout. Указывает допустимое время ожидания в секундах для Merge Agent.
    • MaxDownloadChanges. Указывает максимальное количество получаемых загрузок в одном сеансе.
    • MaxUploadChanges. Указывает максимальное количество отправляемых загрузок в одном сеансе.
    • MaxDeadlockRetries. Указывает максимальное количество попыток агента в случае взаимоблокировки.
    • PollingInterval. Указывает, насколько часто опрашивается журнал транзакций на издателе (для получения новых транзакций).
    • QueryTimeout. Указывает допустимое время ожидания в секундах для запроса.
    • UploadGenerationsPerBatch. Указывает количество поколений отправляемых загрузок, которые будут обрабатываться в одном пакете.
    • UploadReadChangesPerBatch. Указывает количество операций чтения, которое будет обрабатываться в одном пакете.
    • UploadWriteChangesPerBatch.Указывает количество операций записи, которое будет обрабатываться в одном пакете.
    • Validate. Указывает, нужно ли проводить проверку достоверности в конце сеанса.
    • ValidateInterval. Указывает, насколько часто проводится проверка достоверности (если она вообще проводится), когда агент работает в непрерывном режиме.

Если Merge Agent используется в режиме расписания, а не в непрерывном режиме, то он вызывается агентом SQL Server Agent и выполняет, прежде чем закончить работу, то количество изменений, которое указано параметрами MaxUploadChanges и MaxDownloadChanges.

Отключение репликации

Вы можете легко отключить все операции или часть операций репликации в вашей системе с помощью мастеров Enterprise Manager, чтобы удалить определенные компоненты репликации. В этом разделе вы узнаете, как выполнять эту простую задачу.

Удаление push-подписок

Чтобы удалить push-подписку, используйте Enterprise Manager в системе дистри-бьютора для вызова мастера Push Subscription Wizard. После вызова этого мастера появится диалоговое окно Create and Manage Publications. В поле списка Databases and Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication (Удалить публикацию). Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку. Щелкните на кнопке Yes, чтобы удалить подписку.

Удаление pull-подписок

Чтобы удалить pull-подписку, используйте Enterprise Manager в системе подписчика для вызова мастера Pull Subscription Wizard. После вызова этого мастера появится диалоговое окно Create and Manage Publications. В поле списка Databases And Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication. Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку.

Удаление распространения и публикаций

Чтобы удалить распространение и публикации, вы должны вызвать мастер Disable Publishing and Distribution Wizard (Отключение публикования и распространения). В первом окне этого мастера вы указываете, что вам нужно: отключить все распространение и все публикации или удалить только публикации. Если выбрать первый вариант, то будет удалено все – публикование, распространение и публикации. Если выбрать второй вариант (принятый по умолчанию), то будут удалены только публикации. Затем вы должны выбрать публикации, которые хотите удалить. После вашего выбора появится окно подтверждения, где вам дается последняя возможность отменить свое решение. Чтобы удалить выбранные вами компоненты репликации, щелкните на кнопке Yes.

Мониторинг и настройка системы репликации слиянием

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

Атрибуты репликации слиянием

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

Репликация слиянием начинается с применения снимка, но поскольку эта операция выполняется только один раз, вам не нужно настраивать процесс репликации снимка. Чтобы выполнять репликацию, система слияния создает таблицы как на издателе, так и на дистрибьюторе. Кроме того, к каждой реплицируемой таблице добавляется новая колонка, содержащая уникальный идентификатор строк. Он используется для уникального идентифицирования каждой строки, чтобы агент репликации мог эффективно отслеживать изменения.

При вставке или модифицировании строки триггер помечает эту строку для репликации. Затем происходит активизация агента Merge Agent, который собирает все помеченные строки и отправляет их дистрибьютору для репликации. Одновременно с этим Merge Agent модифицирует любые строки в таблицах издателя, которые были модифицированы в таблицах системы или систем подписчика. Так осуществляется двусторонняя репликация.

Конфигурирование репликации слиянием

Если вы используете репликацию слиянием, правильное конфигурирование сети и подсистем ввода-вывода, участвующих в репликации систем, крайне важно для повышения производительности репликации так же, как и в случае использования других методов репликации. Вы можете также повысить производительность репликации слиянием за счет конфигурирования размера пакета слияния. Увеличивая размер этого пакета, вы обеспечиваете использования меньшего числа более крупных пакетов, что является более эффективным методом. Кроме того, вам может потребоваться настройка репликации снимка, однако репликация снимка происходит только один раз, поэтому вы можете пропустить этот шаг. И наконец, вы можете модифицировать Merge Agent; этот процесс был описан выше в этой лекции. В данном разделе описаны конфигурирование ввода-вывода и конфигурирование размера пакета слияния.

Конфигурирование достаточной мощности ввода-вывода

Конфигурируя достаточную мощность подсистем ввода-вывода, вы можете повысить производительность всего процесса репликации. Как и в любой системе SQL Server, журнал транзакций системы, участвующей в репликации, должен находиться для защиты данных на своем собственном томе RAID 1. Файлы данных должны находиться на одном или нескольких томах RAID 10 или RAID 5. В отличие от репликации транзакций для репликации слиянием требуются лишь небольшие изменения в стандартных конфигурациях ввода-вывода.

Конфигурирование подсистем ввода-вывода на издателе. В общем случае при конфигурировании подсистемы ввода-вывода издателя вы должны следовать стандартным рекомендациям по конфигурированию SQL Server, описанным на протяжении этой книги. В отличие от репликации транзакций при репликации слиянием не возникает дополнительной нагрузки на журнал транзакций, поэтому следуйте стандартным рекомендациям по настройке, когда конфигурируете мощность подсистемы ввода-вывода для этого журнала.

Конфигурирование подсистемы ввода-вывода на дистрибьюторе.Дистрибьютор следует конфигурировать таким образом, чтобы дистрибутивная база данных имела собственный журнал транзакций на выделенном дисковом томе RAID 1. Это позволит получить максимальную производительность для журнала дистрибутивной базы данных, что повысит производительность самого дистрибьютора.

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

Конфигурирование размера пакета слияния

В нагруженных системах вы можете повышать производительность репликации слиянием путем конфигурирования размера пакета слияния. Размер пакета слияния определяет, сколько измененных строк копируется на дистрибьютор за один раз. Если увеличить размер пакета, то будет отправляться меньшее количество более крупных пакетов, что может оказаться более эффективным.

Мониторинг системы репликации слиянием

Мониторинг репликации слиянием выполняется через Windows 2000 Performance Monitor (perfmon). В perfmon имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Это следующие объекты:

Счетчики репликации слиянием SQL Server не слишком полезны для выявления проблем производительности. Лучше всего настроить систему репликации транзакций так же, как любую систему SQL Server, и уделить особое внимание тому, как работает сеть. Выявляйте узкие места там, где они обычно возникают в сети, а также следуйте рекомендациям этой лекции и двух предыдущих лекций, чтобы определить, не перегружен ли дистрибьютор.

Настройка системы репликации слиянием

Основные шагами в настройке системы репликации слиянием являются надлежащее конфигурирование и мониторинг системы, как это описано в предыдущих разделах; кроме того, следует уделять особое внимание производительности подсистем ввода-вывода и сети. Вы можете выполнять мониторинг системы через perfmon, но, как уже говорилось, perfmon не дает достаточно полезных данных для репликации слиянием. Вместо этого для настройки системы вы можете полагаться на другие счетчики SQL Server и счетчики Microsoft Windows 2000.

Как уже говорилось в лекции 24, вам может потребоваться изменение размера пакета массового копирования (BCP) и размера пакета слияния, если ваша система выполняет много обновлений. Увеличивая размер пакета BCP, вы увеличиваете производительность применения исходного снимка. Увеличивая размер пакета слияния, вы обеспечиваете копирование большего количества изменений за один раз, что может оказаться более эффективным методом. Если за один раз копируется больше изменений, система затрагивается менее часто, но она должна выполнять больше работы во время выполнения репликации.

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

Вам может также потребоваться мониторинг производительности сети и (при необходимости) ее увеличение, как и в случае репликации снимков или репликации транзакций. Если видно, что ваша система работает не оптимально, например, если центральные процессоры и подсистемы ввода-вывода достигли предела своих возможностей, а процесс репликации занимает слишком много времени, то у вас, возможно, имеются сетевые проблемы. К сожалению, сетевые проблемы нельзя диагностировать с помощью perfmon. Perfmon не имеет счетчика, который бы отражал проблемы сети. Следует использовать продукт для мониторинга сети, такой как Microsoft Systems Management Server (SMS). Выполните мониторинг сетевой платы, чтобы определить, не достигла ли она предела своих возможностей. Если ваша сеть достигла предела своих возможностей, приобретите более быстрые сетевые платы или добавьте для репликации и/или резервного копирования и восстановления частную сеть. И, наконец, помните, что издатель, дистрибьютор и подписчики – это системы SQL Server. Поэтому вам следует настраивать эти системы точно так же, как и любую другую систему SQL Server. Рекомендации по настройке для систем SQL Server приводятся на протяжении всей этой книги.

Заключение

Эта лекция является последней из трех лекций, описывающих репликацию в SQL Server. В этой лекции вы узнали, как выполняется репликация слиянием, почему вам может потребоваться репликация слиянием и как правильно конфигурировать, отслеживать и настраивать репликацию слиянием. В следующей лекции вы узнаете, что такое Microsoft Analysis Services и как использовать эти службы.

Лекция 29. Использование Microsoft SQL Server Аnalysis Services

Для управления данными, используемыми в оперативной аналитической обработке используется Аnalysis Services. Основной формой представления данных в Аnalysis Services является куб OLAP, что позволяет описывать данные как многомерные системы. Рассматриваются схемы типа "звезда" и "снежинка". Описывается подробное использование Аnalysis Services. Множество полезной информации: скриншоты, описания, пояснения. Различные графики для представления быстродействия.

Microsoft SQL Server 2000 Аnalysis Services (прежнее название OLAP Services) – это компонент SQL Server 2000, предназначенный для оперативной аналитической обработки (OLAP); с помощью этого компонента вы можете получать доступ и извлекать данные вашего склада данных (data warehouse) и рынка данных (data mart). В этой лекции вы узнаете, из каких компонентов состоит Аnalysis Services, как их инсталлировать и как их использовать. Кроме того, вы узнаете об улучшениях Аnalysis Services, включенных в SQL Server 2000. Поскольку эта книга предназначена для администраторов SQL Server, а не разработчиков приложений, здесь рассматриваются только темы инсталляции, конфигурирования и администрирования Аnalysis Services. Темы разработки приложений здесь не рассматриваются.

Примечание. На протяжении всей этой лекции используются термины "склад данных" и "рынок данных". Термин "склад данных" определяется различными способами. Склад данных можно представить себе как хранилище деловых данных, содержащее как накопленные данные, так и текущие данные, получаемые из систем оперативной обработки транзакций какой-либо компании (OLTP). Рынок данных похож на склад данных, но содержит данные, относящиеся только к одному аспекту работы компании. Например, компания может иметь склад данных, содержащий счета кредиторов, счета дебиторов, а также информацию по людским ресурсам, и рынок данных, содержащий только данные по счетам кредиторов. И склады данных, и рынки данных обычно состоят из данных, сконфигурированных в виде схемы, имеющей форму звезды или форму снежинки; обе схемы описываются ниже в этой лекции. Концепции, рассматриваемые в этой лекции, относятся как складам, так и к рынкам данных. Если не указано иначе, для обоих типов баз данных используется термин "склад данных".

Обзор Аnalysis Services

Аnalysis Services – это набор средств (инструментов), помогающий вам в разработке и управлении данными, которые используются в оперативной аналитической обработке. Аnalysis Services состоит из сервера Аnalysis Service, English Query и других поддерживающих компонентов. Сервер Аnalysis Service формирует кубы данных, используемые в многомерном анализе. Термин "куб" используется для описания агрегированных данных. Эти агрегированные (итоговые) данные используются для комплексных аналитических запросов, таких как ежемесячные объемы продаж и прогнозы продаж. (Кубы описаны более подробно в подразделе "Кубы OLAP" далее.)

В многомерном анализе для исследования базы данных с различных точек зрения (размерностей) используется несколько запросов. Рассмотрим один пример. Представим себе базу данных магазина велосипедов, где хранятся данные по продажам за последний год. Один запрос в операции многомерного анализа может использоваться для исследования покупательского спроса. Другой запрос – для получения результатов ежемесячных продаж. Еще один запрос – для исследования продаж определенного велосипеда или компонента. Хотя все запросы используют одни и те же данные, каждый запрос применяется для получения своего аспекта (размерности) по этим данным.

Компоненты Аnalysis Services

Аnalysis Services содержит ряд инструментов и мастеров, которые вы можете использовать для доступа к многомерным данным. Аnalysis Services состоит из следующих компонентов:

Как вы увидите в данной лекции, эти компоненты совмещаются друг с другом, как элементы головоломки, образуя единый инструмент.

Кубы OLAP

Основной формой представления данных в Аnalysis Services является куб OLAP. Куб является многомерным представлением как подробных, так и итоговых данных. Подробные данные – это конкретные данные строки, в то время как итоговые данные – это агрегированные данные. Кубы разрабатываются на основе аналитических требований, устанавливаемых самими данными. Каждый куб представляет свой бизнес-объект, такой как продажи или материально-производственные запасы. Каждая сторона куба является соответствующим размерностным представлением данных. Иными словами, куб состоит из различных "плоскостей" данных (отсюда название "куб данных").

Кубы Аnalysis Services формируются с использованием одного из двух типов схем баз данных: "звезда" и "снежинка". (Хотя тема формирования схем относится к вопросам разработки, в этой лекции дается краткое описание этих двух типов схем, чтобы вы могли лучше понимать работу Аnalysis Services.) Схемы обоих типов состоят из таблиц фактов и таблиц размерности. Аnalysis Services агрегирует данные в этих таблицах для создания кубов. Рассмотрим этот процесс более подробно.

Таблицы фактов

Таблица фактов (fact table) – это таблица для склада данных (data warehouse), в которой хранятся накопленные данные. Эти накопленные данные являются базовой информацией склада данных. В нашем примере магазина велосипедов эта информация состоит из записи транзакций (транзакций базы данных и транзакций [операций] продаж), которые произошли в магазине велосипедов. В эту запись включаются такие данные, как дата транзакции, тип транзакции, наименование проданного товара, стоимостное выражение транзакции (в долларах), имя покупателя и имя продавца. Эту запись можно использовать как основу для многомерного анализа.

Итак, данные таблицы фактов основываются на бизнес-транзакции (деловой операции). Этой транзакцией может быть продажа какого-либо товара, транзакция с использованием кредитной карты, прибыль и т.д. По сути, в таблицу фактов записывается некоторый тип бизнес-события.

Таблица фактов в складе данных является самой большой таблицей базы данных с наибольшей интенсивностью операций. Как вы понимаете, таблица фактов может содержать миллионы записей и занимать более одного терабайта (1024 гигабайт).

Таблицы размерности

Таблица размерности (dimension table) используется для определения полей в таблице фактов, например, имени продавца, типа транзакции или наименования товара. Этот процесс похож на нормализацию, т.е. разбиение данных на группы для более эффективной обработки. В то время как таблица фактов содержит накапливаемую информацию о транзакциях, таблица размерности содержит информацию, которая используется для извлечения полезного материала из таблицы фактов. Иными словами, таблицы размерности используются для определения "смысла" данных, содержащихся в таблице фактов.

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

В отличие от таблицы фактов таблицы размерности обычно занимают немного места и содержат лишь несколько строк. Склад данных обычно содержит только одну или две таблицы фактов, но несколько таблиц размерности.

Схемы

Схема типа "звезда" (или плоская схема) характерна для складов данных. Эта схема состоит из одной таблицы фактов и нескольких таблиц размерности. Схема типа "звезда" обычно представляется как таблица фактов, окруженная несколькими таблицами размерности в форме звезды. Каждая таблица размерности соответствует какой-либо колонке в таблице фактов. Таблицы размерности используются как основа для анализа данных в таблице фактов.

В схеме типа "снежинка" (или многомерной схеме) несколько таблиц размерности связываются друг с другом, прежде чем присоединиться к таблице фактов; иными словами, создается несколько уровней таблиц размерности, и каждый уровень соответствует колонке в таблице фактов (рис. 29.1).

Схемы типа "звезда" и "снежинка"


Рис. 29.1.  Схемы типа "звезда" и "снежинка"

Агрегирование данных

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

Кубы OLAP, создаваемые с помощью Аnalysis Services, это, по сути, функции агрегирования, которые рассчитываются в соответствии со схемой типа "звезда" или "снежинка". Для создания этих агрегатов применяется мастер Аnalysis Services Wizard, который вы используете по своему усмотрению для создания бизнес-моделей и принятия деловых решений.

Метаданные

Термин "метаданные" используется для описания данных о данных. Так, подробные и итоговые данные, которые используются для описания данных в базе данных, считаются метаданными. В примере, который мы использовали, таблица продаж и окружающие таблицы размерности представляют данные. Итоговая информация, которую мы создаем (распределение продаж по продавцам, продаж по товарам), – это метаданные. Возможность создания метаданных (итоговых таблиц или агрегатов данных) является главным преимуществом Аnalysis Services. Используя Аnalysis Services, вы можете легко создавать метаданные и далее заниматься другой работой без необходимости поддержки этих данных вручную.

Улучшения анализа данных в SQL Server 2000

В SQL Server 2000 включено несколько улучшений и новых средств для анализа данных и складов данных. Эти улучшения включают дополнительные средства и информацию, помогающие выполнять процесс анализа данных. В этом разделе вы узнаете о некоторых важных улучшениях.

Улучшения в извлечении данных

В Аnalysis Services включена новая технология извлечения (добычи) данных, которую можно использовать для выявления связей данных в реляционных базах данных и кубах OLAP. Эти связи можно добавлять к существующим кубам OLAP для дополнительного анализа данных. Одним из уникальных новых средств извлечения данных является дерево решений Microsoft Decision Tree. Decision Tree использует для анализа данных усложненные методы и алгоритмы классификации. Затем процесс дерева решений формирует одно или несколько деревьев решений, которые можно использовать для упреждающего анализа по новым данным. Например, дерево решений можно сформировать для анализа кредитной истории и покупательской истории потенциальных покупателей в нашем магазине велосипедов. Это дерево решений можно, тем самым, использовать для оценки кредитоспособности покупателя.

Еще одним новым средством извлечения данных в Аnalysis Services является использование кластеризации. Технология кластеризации, используемая в извлечении данных, полностью отличается от типа кластеризации, описанного в лекции 12. При выполнении кластеризации в Аnalysis Services используется алгоритм "ближайшего соседа", позволяющий быстро группировать записи данных в кластеры, имеющие сходные характеристики. Эти связи часто бывают неочевидными или интуитивными. Тем самым технология кластеризации открывает новые пути для анализа данных.

Кроме того, в состав средств извлечения данных SQL Server включены новые мастера и диалоговые окна, что упрощает их использование. Эти улучшения позволяют DBA быстро выполнять большинство задач создания и поддержки рынка данных или склада данных.

Улучшения для таблиц размерности

SQL Server 2000 содержит несколько улучшений по таблицам размерности. SQL Server теперь поддерживает родительские/дочерние размерности, размерности реляционной OLAP (ROLAP) и размерности с разрешением записи.

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

ROLAP-размерность смягчает ограничения размеров, присущие стандартной многомерной модели OLAP (MOLAP), которая используется в Аnalysis Services. Модель MOLAP позволяет использовать размерности, содержащие до 5 миллионов элементов. Если набор элементов выходит за этот предел, требуется ROLAP-размерность. Модель ROLAP может разрастаться до очень больших размеров, но модель MOLAP существенно превосходит ROLAP в производительности при запросе набора элементов. По этой причине вам следует определять модели ROLAP только для очень больших размерностей.

При использовании размерности с разрешением записи элементы этой размерности можно модифицировать с помощью Аnalysis Manager и клиентских приложений, поддерживающих отложенную запись по размерности. Для управления доступом к размерности по записи клиентских приложений используются роли SQL Server. Роли SQL Server описываются в лекции 34.

Улучшения по безопасности

В SQL Server 2000 включены также улучшения по безопасности, которые позволяют вам лучше защищать используемые в анализе вашего предприятия данные, которые могут оказаться крайне важными. Эти улучшения включают изменения в защите таблиц размерности, средства защиты ячеек и поддержку дополнительных методов аутентификации.

Таблицы размерности теперь функционируют в рамках основанной на ролях модели безопасности SQL Server. Для каждой из определенных ролей вы можете ограничить доступ к отдельным размерностям, уровням и элементам. Кроме того, вы можете задать полномочия доступа к этим ресурсам по чтению и чтению/записи. SQL Server 2000 поддерживает основанную на ролях модель безопасности как для систем FAT, так и систем NTFS.

SQL Server 2000 позволяет применять роли на уровне ячеек куба. В Аnalysis Manager включены диалоговые окна, позволяющие управлять доступом роли к любой комбинации ячеек куба. Кроме того, вы можете изменять полномочия доступа к кубу по чтению и чтению/записи для каждой роли.

Поскольку в систему SQL Server 2000 включена модель безопасности Windows 2000, в ней можно использовать протокол Kerberos, NT Lane Manager Security Support Provider или любой другой тип провайдера, использующего интерфейс Security Support Provider Interface (SSPI) для выполнения аутентификации, когда пользователь или приложение запрашивает доступ к кубам и их данным. Это позволяет вам использовать согласованную модель безопасности на всех уровнях вашей системы SQL Server.

Улучшения в English Query

Средство English Query улучшено в SQL Server 2000 для обеспечения большей интеграции с комплектом продуктов Microsoft Visual Studio 6. Это позволяет разработчикам включать в приложения обычные предложения на английском языке вместо операторов T-SQL. Кроме того, включено новое графическое авторское средство, помогающее разработке предложений English Query. В SQL Server 2000 включен также мастер SQL Project Wizard, который автоматически создает базовые структуры базы данных для поддержки English Query, что несколько смягчает сложность установки среды English Query. Этот мастер сканирует таблицы базы данных и строит соответствующие компоненты SQL Server.

Инсталляция Аnalysis Services

Аnalysis Services инсталлируется вместе с SQL Server 2000 как составная часть комплекта SQL Server 2000 Components. Для инсталляции Аnalysis Services выполните следующие шаги.

  1. В меню инсталляции SQL Server 2000 щелкните на SQL Server Components и затем щелкните на Install Аnalysis Services. Появится начальное диалоговое окно Welcome.
  2. Щелкните на кнопке Next (Далее), чтобы появилось диалоговое окно лицензионного соглашения Software License Agreement. Прочитав и согласившись с текстом лицензии, щелкните на кнопке Yes (Да).
  3. Появится диалоговое окно Select Components (Выбор компонентов) (рис. 29.2). В этом диалоговом окне нужно выбрать компоненты Аnalysis Services, которые вы хотите инсталлировать. Выберите все компоненты, установив флажок рядом с именем каждого компонента. Если вы уже инсталлировали определенный компонент, то вы не сможете изменить его флажок. Чтобы выбрать новое местоположение для инсталляции Аnalysis Services, щелкните на кнопке Browse (Обзор). Выбрав целевую папку, щелкните на кнопке Next.

    Диалоговое окно Select Components (Выбор компонентов)


    Рис. 29.2.  Диалоговое окно Select Components (Выбор компонентов)

  4. Появится диалоговое окно Data Folder Location (Местоположение папки Data) (рис. 29.3). Это диалоговое окно похоже на диалоговое окно Choose а Destination Location. Однако здесь выбирается местоположение папки Data. Чтобы указать местоположение, отличное от принятого по умолчанию, вы можете щелкнуть на кнопке Browse. Выбрав местоположение папки Data, щелкните на кнопке Next.

     Диалоговое окно Data Folder Location (Местоположение папки Data)


    Рис. 29.3.  Диалоговое окно Data Folder Location (Местоположение папки Data)

  5. Появится диалоговое окно Select Program Folder (Выбор папки для программы) (рис. 29.4). Здесь нужно выбрать папку, в которой разместится Аnalysis Services. Обычно установка по умолчанию является приемлемой. Щелкните на кнопке Next, чтобы завершить инсталляцию.

    Диалоговое окно Select Program Folder (Выбор папки для программы)


    Рис. 29.4.  Диалоговое окно Select Program Folder (Выбор папки для программы)

Завершив инсталляцию Аnalysis Services, вы можете инсталлировать English Query. Средство English Query считается частью Аnalysis Services, но оно инсталлируется отдельно. Вы не обязаны инсталлировать English Query для использования Аnalysis Services. Чтобы инсталлировать English Query, выполните следующие шаги.

  1. В меню инсталляции SQL Server 2000 щелкните на SQL Server Components и затем щелкните на Install English Query. Процесс инсталляции сначала установит Microsoft Data Access Components (MDAC) и Microsoft Visual Studio Components. После инсталляции этих компонентов появится диалоговое окно Welcome. Для продолжения щелкните на кнопке Continue.
  2. Появится диалоговое окно лицензионного соглашения Software License Agreement. Прочитав и согласившись с текстом лицензии, щелкните на кнопке I Agree (Я согласен).
  3. Появится диалоговое окно Microsoft English Query 2000 Setup (рис. 29.5).

    Диалоговое окно Microsoft English Query 2000 Setup


    Рис. 29.5.  Диалоговое окно Microsoft English Query 2000 Setup

    Здесь вы можете выбрать тип инсталляции – Complete (Полная) или Run-time Only (Только для выполнения). В случае типа Complete инсталлируются все компоненты, в то время как инсталляция типа Run-time Only позволяет указывать, какие компоненты нужно инсталлировать. Вы можете также указать папку для инсталляции, но установка по умолчанию обычно является приемлемой. Если вы не слишком хорошо знаете English Query, щелкните на кнопке Complete. После этого будут инсталлированы компоненты English Query. Щелкните на кнопке OK, чтобы завершить инсталляцию.

Для доступа к Аnalysis Services и компонентам English Query после их инсталляции щелкните на кнопке Start (Пуск), укажите Programs (Программы), укажите Microsoft SQL Server и затем укажите Аnalysis Services. В подменю Аnalysis Services вы можете указать один из следующих вариантов.

Использование Аnalysis Services

Теперь, когда вы знаете, что такое Аnalysis Services и как происходит инсталляция этого средства, мы рассмотрим, как использовать эти его службы для создания и управления вашим складом данных. В этом разделе мы сконфигурируем источник данных, создадим базу данных OLAP по этому источнику данных и, наконец, создадим куб по этой базе данных.

Конфигурирование источника данных

Первым шагом в подключении Аnalysis Services к базе данных SQL Server является создание системного источника данных ODBC (Open Database Connectivity – интерфейса открытого взаимодействия с базами данных) для данного сервера. Для выполнения этой задачи используется утилита ODBC Data Sources, которая находится в папке Administrative Tools. Чтобы задать системный источник данных, выполните следующие шаги.

  1. Щелкните на кнопке Start, укажите Programs, укажите Administrative Tools (Администрирование) и затем выберите Data Sources (ODBC) (Источники данных [ODBC]). Появится диалоговое окно ODBC Data Source Administrator (Администратор источников данных ODBC) (рис. 29.6).
  2. Щелкните на вкладке System DSN (Системный источник данных) (рис. 29.7). Вы увидите несколько источников данных в окне списка System Data Sources (Системные источники данных). Некоторые из этих источников данных уже определены как подключения к SQL Server. Допустимо, а иногда желательно иметь несколько источников данных ODBC, которые ссылаются на одну и ту же базу данных, – в зависимости от того, как используется эта база данных. В этом примере мы создадим источник данных ODBC, который ссылается на базу данных Northwind.

    Вкладка User DSN диалогового окна ODBC Data Source Administrator


    Рис. 29.6.  Вкладка User DSN диалогового окна ODBC Data Source Administrator

     Вкладка System DSN диалогового окна ODBC Data Source Administrator


    Рис. 29.7.  Вкладка System DSN диалогового окна ODBC Data Source Administrator

  3. Щелкните на кнопке Add (Добавить). Появится диалоговое окно Create New Data Source (Создание нового источника данных) (рис. 29.8). В окне списка выберите SQL Server. Затем щелкните на кнопке Finish (Готово).
  4. Появится диалоговое окно Create a New Data Source to SQL Server (Создать новый источник данных для SQL Server) (рис. 29.9). Здесь вы должны присвоить имя вашему источнику данных, задать его описание и указать, к какому серверу SQL вы хотите подсоединиться. Для продолжения щелкните на кнопке Next.
  5. В следующем диалоговом окне (рис. 29.10) нужно указать режим аутентификации, который будет использоваться при подсоединении пользователей к SQL Server. Вы можете выбрать аутентификацию Windows NT (первая кнопка выбора) или аутентификацию SQL Server (вторая кнопка выбора). В нижней части этого диалогового окна вы увидите флажок, который установлен по умолчанию. Если вы не хотите подсоединиться к SQL Server в данный момент, чтобы получить принятую по умолчанию информацию для остальной части процесса установки, сбросьте этот флажок. Для продолжения щелкните на кнопке Next.

    Диалоговое окно Create New Data Source (Создание нового источника данных)


    Рис. 29.8.  Диалоговое окно Create New Data Source (Создание нового источника данных)

     Диалоговое окно Create a New Data Source to SQL Server (Создать новый источник данных для SQL Server)


    Рис. 29.9.  Диалоговое окно Create a New Data Source to SQL Server (Создать новый источник данных для SQL Server)

    Задание режима аутентификации


    Рис. 29.10.  Задание режима аутентификации

  6. В следующем диалоговом окне (рис. 29.11), вы указывает базу данных, которая будет использоваться, имя файла этой базы данных и режимы ANSI. Аnalysis Services позволяет вам выбирать базу данных, к которой вы будете подсоединяться, поэтому вы не обязаны задавать имя базы данных по умолчанию. Однако нет ничего страшного, если вы укажете это имя, поскольку другие приложения могут использовать это имя источника данных (DSN). По окончании щелкните на кнопке Next.

     Указание базы данных по умолчанию


    Рис. 29.11.  Указание базы данных по умолчанию

  7. В следующем диалоговом окне (рис. 29.12), вы можете заменить английский язык, используемый для сообщений SQL Server, на другой язык, активизировать переводы, указать региональные параметры и местоположение файла журнала для длительных запросов и статистики драйвера. Для продолжения щелкните на кнопке Finish.

    Задание языка и других параметров


    Рис. 29.12.  Задание языка и других параметров

  8. Появится диалоговое окно ODBC Microsoft SQL Server Setup (рис. 29.13). В этом диалоговом окне сообщается, что будет создан новый источник данных ODBC, и приводятся все параметры, выбранные вами для данного источника данных.

     Диалоговое окно сводки ODBC Microsoft SQL Server Setup


    Рис. 29.13.  Диалоговое окно сводки ODBC Microsoft SQL Server Setup

  9. Вы должны проверить этот источник данных, щелкнув на кнопке Test Data Source (Тестировать источник данных). В результате будет проверено соединение с базой данных. После успешной проверки соединения щелкните на кнопке OK, и выбранный источник данных (DSN) будет доступен для использования.
    Примечание. Чтобы вы могли конфигурировать и тестировать источник данных, у вас должен быть запущен SQL Server.
Создание базы данных OLAP

Теперь, когда вы сконфигурировали и проверили источник данных ODBC, можно переходить к созданию базы данных OLAP. Создание базы данных OLAP заключается в установке существующей базы данных как базы данных OLAP. Вы должны подготовиться к тому, чтобы указать, какие таблицы будут использоваться как таблицы фактов и какие таблицы – как таблицы размерности.

Примечание. В этом разделе мы зададим в качестве базы данных OLAP базу данных Northwind. Эта база данных не обладает всеми свойствами рынка данных или склада данных, но мы будем использовать ее в этом примере, поскольку она поставляется вместе с SQL Server, и вы можете легко воспроизвести этот пример.

В процессе создания базы данных вы будете использовать Аnalysis Manager, мастер Cube Wizard, мастер Dimension Wizard и мастер Storage Design Wizard. Для создания этой базы данных выполните следующие шаги.

  1. Щелкните на кнопке Start, укажите Programs, укажите Microsoft SQL Server, укажите Аnalysis Services и затем выберите Аnalysis Manager. Появится окно Аnalysis Manager (рис. 29.14).

    Окно Аnalysis Manager


    увеличить изображение

    Рис. 29.14.  Окно Аnalysis Manager

  2. Раскройте в левой панели папку Аnalysis Servers и затем раскройте папку с именем вашего сервера. Щелкните правой кнопкой мыши на имени этого сервера и выберите из контекстного меню пункт New Database (Создать базу данных), чтобы появилось диалоговое окно Database (рис. 29.15). Задайте имя новой базы данных (поле Name) и введите краткое описание (поле Description). В данном примере мы назовем базу данных Northwind_OLAP.

    Диалоговое окно Database (База данных)


    Рис. 29.15.  Диалоговое окно Database (База данных)

    Примечание. Раскрыв папку с именем вашего сервера, вы увидите базу данных, уже сконфигурированную в Аnalysis Manager. Эта база данных с именем FoodMart 2000 создается автоматически, если во время инсталляции Аnalysis Services у вас установлен флажок Sample Applications (Примеры приложений) в диалоговом окне Select Components.
  3. Щелкните на кнопке OK, чтобы вернуться в окно Аnalysis Manager. Если раскрыть папку Аnalysis Servers и раскрыть папку с именем вашего сервера, то вы увидите, что в нее добавлена новая база данных. (Эта база данных имеет имя, но она еще не имеет связи с источником данных SQL Server – мы займемся этим чуть позже.) Раскройте папку этой базы данных (в данном случае это база данных Northwind_OLAP), чтобы появились папки Data Sources (Источники данных), Cubes (Кубы), Shared Dimensions (Разделяемые размерности), Mining Models (Модели извлечения данных) и Database Roles (Роли базы данных) (рис. 29.16).

    Раскрытая база данных OLAP


    увеличить изображение

    Рис. 29.16.  Раскрытая база данных OLAP

  4. Щелкните правой кнопкой мыши на папке Cubes, укажите в контекстном меню команду New Cube (Создать куб) и затем выберите пункт Wizard (Мастер) в подменю New Cube. Появится начальное окно Cube Wizard (Мастер создания куба) (рис. 29.17). Этот мастер используется для выбора источника данных, который указывается на уровне куба.

    Начальное окно мастера Cube Wizard (Мастер создания куба)


    Рис. 29.17.  Начальное окно мастера Cube Wizard (Мастер создания куба)

  5. Щелкните на кнопке Next, чтобы появилось окно Select a fact table from a data source (Выбор таблицы фактов из источника данных) (рис. 29.18). Чтобы выбрать базу данных SQL Server, щелкните на кнопке New Data Source (Новый источник данных).Появится окно Data Link Properties (Свойства канала данных) (рис. 29.19). Во вкладке Provider (Провайдер) вы можете указать источник данных для данного куба, но в данном случае мы будем использовать вкладку Connection (Соединение) для выбора источника данных, который мы создали выше в этой лекции.

    Окно Select a fact table from a data source (Выбор таблицы фактов из источника данных)


    Рис. 29.18.  Окно Select a fact table from a data source (Выбор таблицы фактов из источника данных)

  6. Появится окно Data Link Properties (Свойства канала данных) (рис. 29.19). Во вкладке Provider (Провайдер) вы можете указать источник данных для данного куба, но в данном случае мы будем использовать вкладку Connection (Соединение) для выбора источника данных, который мы создали выше в этой лекции.

    Вкладка Provider (Провайдер) окна Data Link Properties (Свойства канала данных)


    Рис. 29.19.  Вкладка Provider (Провайдер) окна Data Link Properties (Свойства канала данных)

  7. Во вкладке Connection окна Data Link Properties (рис. 29.20) выберите имя источника данных (в нашем примере DataSourceExample), введите имя пользователя (поле User name) и пароль (Password) и введите начальный каталог, который будете использовать (поле Enter the initial catalog to use). Если у вас нет пароля администратора (вам следует его использовать, если вы находитесь в сети), установите флажок Blank password (Пустой пароль).

    Вкладка Connection (Соединение) окна Data Link Properties


    Рис. 29.20.  Вкладка Connection (Соединение) окна Data Link Properties

  8. Здесь вам нужно проверить данное соединение, щелкнув на кнопке Test Connection (Тестировать соединение). Если проверка закончится успешно, появится сообщение "connection succeeded" (Успешное соединение). В противном случае у вас, возможно, что-то указано неверно. В случае успешной проверки щелкните на кнопке OK, чтобы вернуться в окно Select a fact table from a data source мастера Cube Wizard ( рис. 29.21).

    Окно Select a fact table from a data source мастера Cube Wizard с указанными источниками данных и таблицами


    Рис. 29.21.  Окно Select a fact table from a data source мастера Cube Wizard с указанными источниками данных и таблицами

  1. В списке Data Sources and Tables (Источники данных и таблицы) этого окна дважды щелкните на таблице, которую хотите использовать как источник данных для вашего куба. В этом примере нужно дважды щелкнуть на таблице Orders. Несмотря на то, что таблица Orders не является в точности таблицей размерности, она устроена аналогично такой таблице. (Эта таблица используется здесь, чтобы данный пример мог выполнить обычный пользователь.)
  2. Щелкните на кнопке Next, чтобы появилось окно Select the numeric columns that define your measures (Выберите числовые колонки, которые определяют ваши измерения) (рис. 29.22).

    Окно select the numeric columns that define your measures (Выберите числовые колонки, которые определяют ваши измерения)


    Рис. 29.22.  Окно select the numeric columns that define your measures (Выберите числовые колонки, которые определяют ваши измерения)

    Здесь вы можете выбрать колонку или колонки, которые будут определять числовые измерения куба; они будут использоваться для агрегирования. В данном случае выберите колонки OrderID и Freight, дважды щелкнув на этих именах или выделив каждую колонку и щелкнув на направленной вправо стрелке.
  3. Щелкните на кнопке Next, чтобы появилось окно Select the dimensions for your cube (Выберите размерности для вашего куба) (рис. 29.23). Здесь вам нужно выбрать таблицы размерности, которые будут использоваться в данном кубе. В нашем примере мы создадим таблицу размерности.
  4. Щелкните на кнопке New Dimension (Создать размерность), чтобы появилось начальное окно мастера Dimension Wizard, показанное на рис. 29.24.
  5. Для продолжения щелкните на кнопке Next. Появится окно Choose how you want to create the dimension (Выбор способа создания размерности) (рис. 29.25). В этом окне нужно указать, как будет создана размерность. Вы можете выбрать схему "звезда" (кнопка выбора Star schema), схему "снежинка" (Snowflake schema), родительские/дочерние отношения (Parent-Child), виртуальную размерность (Virtual dimension) или модель извлечения данных (Mining model). В данном примере щелкните на кнопке выбора Star Schema.

    Окно Select the dimensions for your cube (Выберите размерности для вашего куба)


    Рис. 29.23.  Окно Select the dimensions for your cube (Выберите размерности для вашего куба)

    Начальное окно мастера Dimension Wizard


    Рис. 29.24.  Начальное окно мастера Dimension Wizard

    Окно Choose how you want to create the dimension (Выбор способа создания размерности)


    Рис. 29.25.  Окно Choose how you want to create the dimension (Выбор способа создания размерности)

  6. Щелкните на кнопке Next, чтобы появилось окно Select the dimension table (Выбор таблицы размерности) (рис. 29.26). В данном примере выберите в качестве таблицы размерности таблицу Employees.

    Окно Select the dimension table (Выбор таблицы размерности)


    Рис. 29.26.  Окно Select the dimension table (Выбор таблицы размерности)

  7. Щелкните на кнопке Next, чтобы появилось окно Select the dimension type (Выбор типа размерности) (рис. 29.27). Здесь вы можете выбрать тип размерности: стандартную размерность (Standard dimension) или размерность времени (Time dimension). В данном примере щелкните на кнопке выбора Standard Dimension.

    Окно Select the dimension type (Выбор типа размерности)


    Рис. 29.27.  Окно Select the dimension type (Выбор типа размерности)

  1. Щелкните на кнопке Next, чтобы появилось окно Select the levels for your dimension (Выбор уровней для вашей размерности) (рис. 29.28). Вы можете выбрать в этом окне несколько уровней агрегирования, но в данном простом примере мы выберем только один уровень – Employee Id. Чтобы выбрать уровень, выделите соответствующую колонку и щелкните на направленной вправо стрелке или дважды щелкните на этой колонке.

     Окно Select the levels for your dimension (Выбор уровней для вашей размерности)


    Рис. 29.28.  Окно Select the levels for your dimension (Выбор уровней для вашей размерности)

  2. Щелкните на кнопке Next, чтобы появилось окно Specify the member key columns (Задание ключевых колонок) (рис. 29.29). Если вы формируете куб из нескольких таблиц, то указываете здесь ключевые колонки таблиц.

     Окно Specify the member key columns (Задание ключевых колонок)


    Рис. 29.29.  Окно Specify the member key columns (Задание ключевых колонок)

  3. Щелкните на кнопке Next, чтобы появилось окно Select advanced options (Выбор дополнительных параметров) (рис. 29.30). Здесь вы можете модифицировать размерность (флажок Changing dimension), указать порядок сортировки по элементам размерности (флажок Ordering ...) и определять режим хранения (флажок Storage mode ...). Если вы создаете очень большой куб, то должны задать модель хранения ROLAP, описанную выше в этой лекции. При выборе любого из этих вариантов мастер выведет соответствующие окна, в которых вы сможете сделать свой выбор. Мы не рассматриваем здесь эти окна.

     Окно Select advanced options (Выбор дополнительных параметров)


    Рис. 29.30.  Окно Select advanced options (Выбор дополнительных параметров)

  4. Щелкните на кнопке Next, чтобы появилось окно Finish the Dimension Wizard (Завершение работы мастера размерности) (рис. 29.31). Задайте имя размерности и щелкните на кнопке Finish.

    Окно Finish the Dimension Wizard (Завершение работы мастера размерности)


    Рис. 29.31.  Окно Finish the Dimension Wizard (Завершение работы мастера размерности)

  5. Закончив работу мастера Dimension Wizard, вы возвратитесь в окно Select the dimensions for your cube (рис. 29.23) мастера Cube Wizard. Ваша новая размерность появится в списке Cube Dimensions (Размерности куба). Здесь вы можете продолжить работу, выбрав таблицу размерности, которая используется для создания итоговых данных по таблице фактов, или можете создать новые таблицы размерности, щелкнув на кнопке New Dimension и снова запустив мастер Dimension Wizard.

    Для продолжения щелкните на кнопке Next. Получив вопрос, хотите ли вы считать строки (if you want to count the rows), щелкните на кнопке Yes. Появится окно Finish the Cube Wizard (Завершение работы мастера создания куба) (рис. 29.32). Вам останется только задать имя этого куба.

    Окно Finish the Cube Wizard (Завершение работы мастера создания куба)


    Рис. 29.32.  Окно Finish the Cube Wizard (Завершение работы мастера создания куба)

  6. После щелчка на кнопке Finish появится окно Cube Editor (Редактор куба) (рис. 29.33). Выполните необходимое редактирование куба и затем выйдите из окна Cube Editor, щелкнув на кнопке Close. Обычно никакого редактирования не требуется.

    Окно Cube Editor (Редактор куба)


    увеличить изображение

    Рис. 29.33.  Окно Cube Editor (Редактор куба)

  1. После выхода из окна Cube Editor появится сообщение, где запрашивается, хотите ли вы задать варианты хранения для вашего куба. Щелкните на кнопке Yes. Появится начальное окно мастера Storage Design Wizard (Мастер структуры хранения) (рис. 29.34).

     Начальное окно мастера Storage Design Wizard (Мастер структуры хранения)


    Рис. 29.34.  Начальное окно мастера Storage Design Wizard (Мастер структуры хранения)

  2. Щелкните на кнопке Next, чтобы появилось окно Select the type of data storage (Выбор типа хранения данных) (рис. 29.35).

    Окно Select the type of data storage (Выбор типа хранения данных)


    Рис. 29.35.  Окно Select the type of data storage (Выбор типа хранения данных)

    Здесь вы можете выбрать между хранением данных в виде размерностей, в реляционной форме или в виде комбинации этих двух типов; для данного примера щелкните на кнопке выбора MOLAP, чтобы хранить данные в виде структур данных Аnalysis Services. Если выбрать хранение данных в реляционной форме (кнопка выбора ROLAP), то новые таблицы будут сохраняться в базе данных, с которой вы работаете (в данном случае – Northwind). И последний вариант – HOLAP (гибридная OLAP), при котором базовые данные хранятся в реляционной форме и агрегированные данные – в виде многомерной структуры.
  3. Щелкните на кнопке Next, чтобы появилось окно Set aggregation options (Задание параметров агрегирования) (рис. 29.36), где вы можете задать дополнительные параметры создания агрегированных данных. Для данного примера используйте вариант, принятый по умолчанию (100 MB), и щелкните на кнопке Start, чтобы создать агрегаты данных.

     Окно Set aggregation options (Задание параметров агрегирования)


    Рис. 29.36.  Окно Set aggregation options (Задание параметров агрегирования)

    Поскольку в этом примере мы используем очень небольшую таблицу, для расчета агрегатов данных потребуется лишь несколько секунд. Результирующие агрегаты будут рассчитаны в виде графиков, после чего снова появится окно Set aggregation options (рис. 29.37). Отметим, что у нас не слишком много данных для этого примера, поэтому график – это всего лишь вертикальная линия вдоль оси ординат.

    Окно Set aggregation options с графиком агрегированных данных


    Рис. 29.37.  Окно Set aggregation options с графиком агрегированных данных

  4. Щелкните на кнопке Next, чтобы появилось окно Finish the Storage Design Wizard (Завершение работы мастера) (рис. 29.38). Здесь вы можете завершить работу мастера Storage Design Wizard в данный момент (кнопка выбора Process Now) или сохранить ваши параметры и отложить завершение на другой момент (Save, but don’t process Now). Второй вариант полезно использовать, если вы хотите подождать до окончания основного рабочего времени, когда снизится нагрузка на систему, чтобы создать данное хранилище. В данном примере щелкните на кнопке Process Now.

    Окно Finish the Storage Design Wizard (Завершение работы мастера)


    Рис. 29.38.  Окно Finish the Storage Design Wizard (Завершение работы мастера)

  5. Щелкните на кнопке Finish. Появится диалоговое окно Process (Обработка) (рис. 29.39). По окончании операции создания хранилища для куба внизу этого окна появится сообщение, информирующее об успешном завершении этой операции. Щелкните на кнопке Close, чтобы закончить этот процесс.

    Диалоговое окно Process (Обработка)


    Рис. 29.39.  Диалоговое окно Process (Обработка)

Модифицирование существующей базы данных OLAP

База данных OLAP модифицируется в Аnalysis Manager аналогично созданию базы данных OLAP. В этом разделе мы будет модифицировать базу данных FoodMart 2000. База данных FoodMart 2000 включается в инсталляцию Аnalysis Services (если во время инсталляции вы установили флажок Sample Applications). Чтобы отредактировать куб в базе данных FoodMart 2000, выполните следующие шаги.

  1. В окне Аnalysis Manager раскройте папку Аnalysis Servers, раскройте сервер, раскройте папку FoodMart 2000 и затем раскройте папку Cubes (рис. 29.40).

    Окно Аnalysis Manager


    увеличить изображение

    Рис. 29.40.  Окно Аnalysis Manager

  2. Щелкните правой кнопкой мыши на папке Sales и выберите из контекстного меню пункт Edit (Редактировать). Появится окно Cube Editor (рис. 29.41). В этом окне показаны связи между таблицами размерности и фактов в этом кубе.

    После вызова окна Cube Editor вы получаете целый ряд возможностей.

    • Создание новой размерности. Вызовите Dimension Manager, щелкнув правой кнопкой мыши на папке Dimensions или на имени любой размерности в левой панели. Средство Dimension Manager устроено аналогично мастеру Dimension Wizard, о котором мы говорили выше в этой лекции. Оно используется для добавления к базе данных новых размерностей или удаления существующих размерностей.
    • Удаление размерности. Для удаления размерности нужно щелкнуть на ней правой кнопкой мыши и выбрать пункт Remove (Удалить). Эта операция необратимым образом удаляет размерность из базы данных.
    • Создание, удаление или переименование измерения (measure). Щелкните правой кнопкой мыши на данном измерении (в папке Measures) и выберите пункт New Measure, Delete или Rename.

      Окно Cube Editorr


      увеличить изображение

      Рис. 29.41.  Окно Cube Editorr

    • Создание нового расчетного элемента. Щелкните правой кнопкой мыши на папке Calculated Members или на любом расчетном элементе и выберите пункт New Calculated Member (Новый расчетный элемент).
    • Редактирование, удаление или переименование расчетного элемента. Щелкните правой кнопкой мыши на расчетном элементе и затем выберите пункт Edit, Delete или Rename.

      Во вкладке Schema (Схема) правой панели вы можете щелкать правой кнопкой мыши на заголовках таблиц размерности или фактов и выбирать следующие команды:

    • Insert A Table (Вставить таблицу). Позволяет добавлять таблицы к базе данных.
    • Change Alias (Изменить алиас). Позволяет переименовывать существующее свойство куба. Вы можете определять производное свойство куба, которое базируется на другом свойстве куба, не изменяя базового свойства.
    • Browse Data (Обзор данных). Позволяет считывать данные таблиц для просмотра.
    • Replace (Заменить). Позволяет выбрать другую таблицу для замены таблицы, которая уже находится в базе данных.
    • Remove (Удалить – только для таблиц размерности). Позволяет удалить таблицу размерности из базы данных.
  3. Чтобы убедиться в полезности системы OLAP, выберите пункт Data (Данные) из меню View (Вид) в Аnalysis Manager или щелкните на вкладке Data. Во вкладке Data окна Cube Editor (рис. 29.42), вы можете выбрать итоговые данные в соответствии с критериями, которые можете выбрать с помощью целого ряда раскрывающихся меню. Эти меню порождаются размерностями данного куба. Вкладка Data аналогична диалоговому окну Cube Browser (Браузер куба), которое мы вскоре рассмотрим.

    Вкладка Data окна Cube Editor


    увеличить изображение

    Рис. 29.42.  Вкладка Data окна Cube Editor

    Во вкладке Data вы можете выбирать различные комбинации переменных, чтобы получать различные представления данных. Поскольку итоговые данные уже рассчитаны, результаты появляются очень быстро. Если бы у вас не было итоговых данных, то вам пришлось бы запускать отдельные запросы. В случае большого рынка данных или склада данных процесс расчета агрегатов данных мог бы занять много времени.
Обработка данных

После создания кубов вы получаете ряд средств, позволяющих вам просматривать и обрабатывать данные. Для доступа ко многим из этих средств вы можете щелкнуть правой кнопкой мыши на имени куба в левой панели окна Аnalysis Manager. Вот некоторые из этих средств:

Поскольку Аnalysis Services не выполняет автоматического обновления кубов OLAP и поскольку базовые данные могут изменяться, вы должны обновлять эти данные с частотой, которую считаете необходимой для вашей системы. Если данные модифицируются часто и пользователям требуется свежая информация, то вам может потребоваться частое обновление кубов. Если приемлемы вчерашние данные, то вполне достаточно обновлять данные ночью.

Для обновления кубов нужно щелкнуть правой кнопкой мыши на соответствующей папке базы данных OLAP и выбрать пункт Process All Cubes (Обработка всех кубов). Как уже говорилось, если вы хотите обновлять кубы по отдельности, щелкните правой кнопкой мыши на имени куба и выберите из контекстного меню пункт Process.

Ваш доступ к OLAP-кубам SQL Server происходит через приложение OLE DB, путем просмотра данных через Аnalysis Manager или путем установки связи с базой данных OLAP. Диалоговое окно Cube Browser в Аnalysis Manager является полезным средством просмотра данных, основываясь на кубах, которые вы уже создали.

Но если у вас есть уже функционирующий склад данных или рынок данных, который уже функционирует, то вам, возможно, будет трудно включить SQL Server Аnalysis Services в уже существующую работу, поскольку Аnalysis Services действует путем создания новых кубов данных, базирующихся на вашей базе данных, и доступ к этим кубам осуществляется через интерфейс OLE DB. Если ваше текущее приложение не использует OLE DB, то вам, видимо, не удастся использовать возможности Аnalysis Services.

Аnalysis Services можно использовать для выполнения многомерного анализа во многих типах складов и рынков данных. Для выполнения многомерного анализа из агрегатов данных вы можете использовать диалоговое окно Cube Browser в Аnalysis Manager. Использование преимуществ Аnalysis Services зависит от возможностей включения этих служб в вашу деловую среду.

Заключение

В этой лекции вы узнали, что такое Аnalysis Services и как устанавливать это средство. Вы также узнали, как создавать кубы и как поддерживать агрегированные данные в базе данных SQL Server. Информация этой лекции поможет вам определить, подойдет ли для вашей среды использование Аnalysis Services. В следующей лекции вы узнаете о некоторых задачах и средствах, связанных с администрированием системы SQL Server.

Лекция 30. Администрирование Microsoft SQL Server

Гарантией того, что ваша система будет работать эффективно и правильно является грамотное администрирование и регулярное выполнение задач обслуживания баз данных. SQL Server содержит множество средств для автоматического конфигурирования, такие как динамическое управление памятью, пул памяти, использование дополнительной памяти, различные параметры. С помощью многочисленных параметров системной хранимой процедуры sp_configure можно активизировать/останавливать различные свойства. Необходимым фактором, влияющим на бесперебойную работы системы является план обслуживания, который следует тщательно настраивать и грамотно управлять. Знание системных хранимых процедур sp_createstats и sp_autostats помогут в решении повседневных задач.

Правильное конфигурирование ваших серверов SQL и регулярное выполнение задач обслуживания ваших баз данных – это ключ к достижению высокой эффективности работы. В этой лекции вы узнаете о средствах динамического конфигурирования Microsoft SQL Server 2000, которые помогают упростить процесс конфигурирования системы баз данных. Вы также узнаете, как использовать мастер Database Maintenance Plan Wizard для создания автоматизированного плана обслуживания ваших баз данных. Использование планов обслуживания – это отличный способ поддерживать ваши базы данных в рабочем состоянии.

Средства автоматического конфигурирования SQL Server

SQL Server содержит множество автоматических средств, предназначенных для снижения расходов, которые обычно связаны с конфигурированием и настройкой системы управления реляционными базами данных (RDBMS). В этом разделе вы ознакомитесь с некоторыми из этих средств. (Те, кто работал с Microsoft SQL Server 7, уже знают об этих средствах, поскольку они были введены именно в SQL Server 7.) Вы узнаете, как они действуют, как их использовать для облегчения вашей работы администратора баз данных (DBA) и как переопределять при необходимости эти автоматические средства.

Динамическое управление памятью

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

Как действует динамическое управление памятью

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

Компьютерная система, которая используется в основном как сервер базы данных SQL Server, вполне подходит для динамического управления памятью. В такой системе количество памяти, используемое процессами, отличными от SQL Server, стабильно, поэтому SQL Server будет автоматически выделять себе память, необходимую для своей эффективной работы вплоть до предела доступной физической памяти. Затем SQL Server будет поддерживать это количество, пока не потребуется память другим процессам. Если другому процессу действительно требуется память, SQL Server освобождает необходимое количество памяти, чтобы оно было доступно для другого процесса.

Компьютерная система, на которой выполняются процессы с постоянно изменяющимися требованиями памяти, причем количество процессов часто увеличивается или уменьшается, не слишком подходит для динамического управления памятью. На такой системе использование памяти постоянно изменяется, что требует от SQL Server постоянного закрепления и освобождения памяти, когда она требуется другим процессам, что может оказаться неэффективным из-за дополнительной нагрузки. В системе такого типа может оказаться более эффективным ручное выделение фиксированного количества памяти для SQL Server или задание минимального и максимального количества памяти, которое может получать SQL Server. Вы узнаете, как это сделать, ниже в этой лекции.

Таким образом, выбор между динамическим и ручным управлением памятью определяется степенью изменчивости использования памяти в системе. Применяя мониторинг использования памяти системой SQL Server, вы можете определить, изменяется ли количество используемой памяти каким-либо регулярным образом или остается достаточно стабильным. Для мониторинга использования памяти вы можете использовать Microsoft Windows 2000 Performance Monitor. Счетчик Total Server Memory (KB) внутри объекта SQLServer:Memory Manager показывает количество памяти в килобайтах (Кб), которое использует в данный момент SQL Server. Чтобы определить, как изменяется использование памяти в течение времени, следите за этим счетчиком в окне диаграмм (chart window).

Пул памяти

SQL Server динамически выделяет и освобождает память в пуле. Пул памяти содержит определенное количество памяти, которое разделяется между следующими компонентами:

Поскольку в случае использования динамического управления памятью распределение памяти динамически изменяется, пул памяти может все время увеличиваться или уменьшаться. Кроме того, указанные пять компонентов пула памяти тоже могут динамически изменять свои размеры. Это распределение недоступно для конфигурирования; управление осуществляет SQL Server. Например, когда требуется больше памяти, чтобы в кэше процедур можно было хранить больше операторов T-SQL, SQL Server может забирать часть памяти из буферного кэша и использовать ее для кэша процедур.

Использование дополнительной памяти

Количество памяти, доступной для SQL Server, зависит от используемой операционной системы Windows. Microsoft Windows NT Server 4 поддерживает 4 Гб памяти, 2 Гб из которых выделяется для пользовательских процессов и 2 Гб резервируется для использования системой. Это ограничение в 2 Гб представляет максимальное количество памяти, которое может быть выделено для SQL Server в NT 4.0. Но в системе Windows NT Server 4 Enterprise Edition количество виртуальной памяти, выделяемой для процесса, на 50 процентов больше – 3 Гб. Это увеличение стало возможным, так как память, выделенная для системы, была сокращена до 1 Гб. Такое увеличение виртуальной памяти, выделенной для процессов, позволяет вам увеличивать размер пула памяти до величины, близкой к 3 Гб. Чтобы активизировать эту поддержку в Windows NT 4 Enterprise Edition, вы должны добавить флаг /3GB к строке загрузки в файле Boot.ini, что можно сделать с помощью значка System (Система) в панели управления.

Имеется две версии операционной системы Windows 2000, в которых SQL Server 2000 Enterprise Edition может использовать интерфейс расширенной памяти Windows 2000 Address Windowing Extensions (AWE) API, поддерживающий адресные пространства большего размера. SQL Server поддерживает около 8 Гб в системе Windows 2000 Advanced Server и около 64 Гб в системе Windows 2000 Datacenter Server. AWE поддерживается только в этих двух операционных системах и не поддерживается в Windows 2000 Professional. (Для получения более подробной информации см. лекцию 2 этой книги и тему "Using AWE Memory on Windows 2000" [Использование AWE-памяти в Windows 2000] в Books Online.)

Параметры конфигурирования памяти SQL Server

Следующие параметры конфигурирования SQL Server связаны с конкретными аспектами распределения памяти. Вы можете задать эти параметры с помощью SQL Server Enterprise Manager или с помощью хранимой процедуры sp_configure. Для просмотра всех этих параметров с помощью sp_configure у вас должно быть задано значение 1 для параметра show advanced options (показать дополнительные параметры).

Примечание. Для использования возможностей AWE-памяти у вас должна использовать система Windows 2000 Advanced Server или Windows 2000 Datacenter Server в сочетании с SQL Server 2000 Enterprise Edition.
Другие параметры динамического конфигурирования

В SQL Server имеется несколько параметров динамического конфигурирования или SQL Server Enterprise Manager (но не все параметры можно задать через Enterprise Manager). Чтобы задать какой-либо параметр через sp_configure, откройте Query Analyzer (Анализатор очередей) или osql-соединение в окне командной строки и запустите эту хранимую процедуру со следующими параметрами:

sp_configure "имя параметра", значение

Имя параметра – это имя параметра конфигурирования, а значение – это значение, которое вы хотите ему присвоить. Если запустить эту команду, не указывая значение, то SQL Server возвратит текущее значение указанного параметра. Чтобы увидеть список всех параметров и их значений, запустите sp_configure без какого-либо параметра. Несколько параметров считаются дополнительными. Для просмотра и конфигурирования этих параметров с помощью sp_configure вы должны сначала задать для параметра show advanced options (показать дополнительные параметры) значение 1, как это показано ниже:

sp_configure "show advanced options", 1

Параметр show advanced options не оказывает влияния на параметры, которые можно конфигурировать через Enterprise Manager.

Чтобы задать значение какого-либо параметра с помощью Enterprise Manager, сначала откройте в Enterprise Manager окно Properties (Свойства) для сервера, щелкнув правой кнопкой мыши на имени этого сервера и выбрав из контекстного меню пункт Properties (рис. 30.1).

 Вкладка General окна Properties в Enterprise Manager


Рис. 30.1.  Вкладка General окна Properties в Enterprise Manager

Вы можете затем осуществлять доступ к определенным динамическим параметрам во вкладках этого окна. В следующих разделах описываются динамические параметры SQL Server, не связанные с памятью; в каждом разделе указывается, можно ли задавать соответствующий параметр в Enterprise Manager, и если да, то указывается местоположение этого параметра в окне Properties.

Параметр locks (блокировки)

SQL Server динамически конфигурирует количество используемых в системе блокировок в соответствии с текущими потребностями. Вы можете задать значение параметра locks для указания максимального количества блокировок, ограничив тем самым количество памяти, которое использует для блокировок SQL Server. По умолчанию задано значение 0, что позволяет SQL Server динамически захватывать и освобождать блокировки в зависимости от изменяющихся требований системы. В SQL Server разрешается использовать для блокировок до 40 процентов всей его памяти. Вам следует оставить для этого параметра принятое по умолчанию значение 0, чтобы SQL Server захватывал блокировки по необходимости. Этот параметр входит в группу дополнительных параметров, и его можно задать только с помощью sp_configure.

Параметр recovery interval (интервал восстановления)

Параметр recovery interval указывает максимальное количество минут, которое может потратить SQL Server для восстановления после аварии. (См. ниже в этой лекции раздел "Контрольные точки" с более подробным описанием того, как действуют контрольные точки.) Время, которое требуется SQL Server для восстановления базы данных, зависит от момента, когда была создана последняя контрольная точка. Поэтому значение recovery interval используется в SQL Server для динамического определения моментов автоматического применения контрольных точек.

Например, когда происходит "чистое" закрытие SQL Server, контрольные точки создаются по всем базам данных, поэтому при перезапуске SQL Server восстановление занимает немного времени. Но если происходит вынужденная остановка SQL Server без "чистого" отключения (из-за отказа источника питания или аварии другого типа), то при повторном запуске SQL Server должен восстанавливать каждую базу данных путем отката всех транзакций, которые не были фиксированы, и повторного выполнения транзакций, которые были фиксированы, но их изменения еще не были записаны на диск к моменту аварии. Если последняя контрольная точка была создана незадолго до аварии системы, то на восстановление уйдет немного времени. Если последняя контрольная точка была создана задолго до аварии системы, это потребует более длительного времени восстановления.

SQL Server определяет, насколько часто нужно создавать контрольные точки, согласно встроенному алгоритму и, как уже говорилось, в соответствии со значением recovery interval. Например, если вы зададите для recovery interval значение 5, то SQL Server будет создавать контрольные точки по каждой базе данных с такой частотой, чтобы восстановление после аварии занимало бы примерно 5 минут. По умолчанию значение recovery interval равно 0, указывая на автоматическое конфигурирование интервала в SQL Server. Если используется это значение по умолчанию, то время восстановления меньше 1 минуты и контрольные точки создаются для активных баз данных приблизительно каждую минуту. Во многих случаях преимущества частого создания контрольных точек теряются за счет снижения производительности, вызываемого созданием контрольных точек. Со временем вам придется снизить количество создаваемых контрольных точек, увеличив значение recovery interval. Выбираемое вами значение будет зависеть от деловых требований, связанных с тем, сколько времени могут ждать пользователи в случае восстановления системы после аварии. Обычно следует использовать значение в интервале от 5 до 15 минут, соответствующее времени восстановления от 5 до 15 минут.

Параметр recovery interval входит в группу дополнительных параметров. Вы можете задать его в Enterprise Manager во вкладке Database Settings (Параметры базы данных) окна Properties в поле Recovery Interval (min) (рис. 30.2).

 Задание параметра recovery interval


Рис. 30.2.  Задание параметра recovery interval

Параметр user connections (количество соединений с пользователями)

SQL Server динамически конфигурирует допустимое количество соединений пользователей с SQL Server. В SQL Server допускается до 32767 соединений с пользователями Задавая значение user connections, отличное от 0, вы указываете максимально допустимое количество одновременных подсоединений пользователей к SQL Server. (Количество допустимых подсоединений пользователей также зависит от ограничений ваших приложений и оборудования.) Количество подсоединений пользователей будет также динамически конфигурироваться вплоть до указанного максимума.

Например, если подсоединяются только 10 пользователей, будет выделено только 10 объектов-соединений с пользователями (user connection). Если достигнуто максимальное значение, а SQL Server требуются новые соединения с пользователями, то вы получите сообщение об ошибке, где указывается, что достигнуто максимальное значение по количеству соединений с пользователями.

В большинстве случаев принятое по умолчанию значение параметра user connections изменять не требуется. Отметим, что для каждого соединения требуется порядка 40 Кб памяти.

Чтобы определить максимальное количество соединений с пользователями, допустимое в вашей системе, вы можете использовать SQL Server Query Analyzer или следующий оператор T-SQL:

SELECT @@MAX_CONNECTIONS

Параметр user connections входит в группу дополнительных параметров. Вы можете задать его в Enterprise Manager во вкладке Connections (Соединения) окна Properties в поле-счетчике Maximum Concurrent User Connections (Максимальное число одновременных соединений с пользователями) (рис. 30.3).

Задание параметра user connections


Рис. 30.3.  Задание параметра user connections

Параметр open objects (количество открытых объектов)

Параметр open objects входит в группу дополнительных параметров; его можно задать только с помощью процедуры sp_configure. Этот параметр определяет максимально допустимое количество одновременно открытых объектов базы данных, таких как таблицы, представления, хранимые процедуры, триггеры, правила и значения по умолчанию. Принятое по умолчанию значение 0 указывает, что SQL Server будет динамически регулировать допустимое количество одновременно открытых объектов в данной системе. Вам следует оставить это значение по умолчанию без изменений. Если вы все же измените его, а SQL Server потребуется больше открытых объектов, чем вы сконфигурировали, то появится сообщение об ошибке от SQL Server, где указывается, что вы превысили допустимое количество открытых объектов. Кроме того, для каждого открытого объекта требуется некоторое количество памяти, поэтому вашей системе может потребоваться большее количество физической памяти, чтобы поддерживать необходимое количество открытых объектов.

Статистика

Статистика по колонкам необходима для повышения производительности запросов в вашей системе. SQL Server может собирать статистическую информацию, касающуюся распределения значений в колонке таблицы. Оптимизатор запросов Query Optimizer затем использует эту информацию для определения оптимального плана исполнения запроса. Статистику можно собирать по двум типам колонок: по тем, что являются частью индекса, и по тем, что не входят в индекс, но используются в предикате запроса (в предложении WHERE ). Оставив принятые по умолчанию значения SQL Server для базы данных, вы разрешаете автоматическое создание обоих типов статистики в SQL Server. Статистика по индексированным колонкам создается при создании соответствующего индекса. Статистика по неиндексированным колонкам создается, когда она требуется для какого-либо запроса (только по одной колонке, а не по нескольким, как вы увидите в подразделе "Команда CREATE STATISTICS" этого раздела). Если статистика устарела (не использовалась в течение определенного периода времени), то SQL Server автоматически удаляет ее.

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

В Enterprise Manager вы можете активизировать или отключать автоматическое создание статистики по базе данных. Для этого сначала откройте окно Properties этой базы данных. Во вкладке Options вы увидите флажок Auto Create Statistics (Автоматическое создание статистики). (На рис. 30.4 этот флажок установлен для базы данных MyDB.) Этот флажок установлен (активизирован) по умолчанию.

В окне Properties соответствующей базы данных вы также увидите флажок Auto Update Statistics (Автоматическое обновление статистики). Этот флажок, который установлен по умолчанию для каждой базы данных, указывает, что SQL Server при необходимости будет автоматически обновлять статистику по колонкам таблицы. Статистику требуется обновлять в тех случаях, когда изменилось большое количество (или большой процент) строк таблицы (посредством операций обновления, вставки и удаления). При большом числе изменений в данных текущая статистика становится менее точной. SQL Server автоматически определяет, когда требуется обновить статистику. Если вы решили отключить автоматическое создание статистики, сбросив этот флажок, то вы должны выполнять эти задачи вручную, чтобы убедиться в нормальной работе вашей базы данных. В следующих разделах описывается, как создавать и обновлять статистику вручную.

Окно Properties для базы данных MyDB


Рис. 30.4.  Окно Properties для базы данных MyDB

Команда CREATE STATISTICS

Вы можете создавать статистику по определенным колонкам таблицы вручную с помощью оператора T-SQL CREATE STATISTICS. Создание статистики вручную отличается от автоматического создания в том, что оно позволяет вам объединять несколько колонок, генерируя для комбинации колонок такую информацию, как среднее количество дублированных значений и отличающихся значений. Команда CREATE STATISTICS имеет следующий синтаксис:

CREATE STATISTICS имя_статистики ON
     имя_таблицы ( колонка [ , колонка... ] )
  [   [WITH [ FULLSCAN | SAMPLE размер PERCENT ]
  [   , NORECOMPUTE ]

Вам следует ввести имя для набора статистики, который вы создаете, имя таблицы, а также имя хотя бы одной колонки. Вы можете указать несколько имен колонок для сбора статистики по комбинации колонок. Отметим, что вы не можете указывать для статистики расчетные колонки или колонки с типом данных ntext, text или image. Для сбора статистики можно указывать полное сканирование ( FULLSCAN ) или выборку данных ( SAMPLE ). Для полного сканирования требуется больше времени, чем для выборки, поскольку сканируется каждая строка таблицы, но результаты могут оказаться более точными. Используя выборку, вы должны указать процент данных, включаемых в выборку. Ключевое слово NORECOMPUTE указывает, что автоматическое обновление этой статистики отключено, что позволяет использовать статистику, которая уже не отражает текущее состояние данных.

Вам может потребоваться создание статистики по колонкам, которые совместно используются в предикате запроса. Например, вы можете создать статистику по колонкам FirstName (Имя) и LastName (Фамилия) таблицы Employees (Сотрудники) базы данных Northwind для поиска сотрудника по имени и фамилии. Для этого используется следующая последовательность T-SQL:

CREATE STATISTICS name
ON Northwind..Employees (FirstName, LastName)
WITH FULLSCAN, NORECOMPUTE

Этот оператор рассчитывает статистику для всех строк колонок FirstName и LastName и отключает автоматический перерасчет статистики.

Если вы хотите запустить статистику для всех колонок всех таблиц базы данных вручную без ввода операторов CREATE STATISTICS для каждой колонки каждой таблицы, то можете использовать хранимую процедуру sp_createstats. Эта хранимая процедура описана в следующем разделе.

Процедура sp_createstats

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

sp_createstats [ 'indexonly' ] [ , 'fullscan' ]  [ , 'norecompute' ]

Параметр indexonly указывает, что статистика будет создана только по колонкам, включаемым в индекс. Параметр fullscan указывает, что будет выполнено полное сканирование всех строк, а не случайная выборка; иначе говоря, будет использована выборка 100 процентов данных. Параметр norecompute указывает, что по этой новой статистике будет отключено автоматическое обновление статистики. Новой статистике присваивается имя колонки, по которой она создается.

Команда UPDATE STATISTICS

По умолчанию SQL Server автоматически обновляет статистику. Вы можете отключить эту возможность с помощью команды UPDATE STATISTICS и затем обновлять статистику вручную, чтобы она соответствовала текущему состоянию данных. Эта команда позволяет вам обновлять статистику по индексированным колонкам и неиндексированным колонкам. Возможно, вы создадите сценарий, который будет выполнять команду UPDATE STATISTICS для наиболее часто модифицируемых таблиц, и затем будете периодически запускать этот сценарий как задание SQL Server. Это позволит поддерживать статистику в соответствии с текущим состоянием данных и поддерживать более высокую производительность запросов. (О синтаксисе и параметрах команды UPDATE STATISTICS см. в разделе "Перестроение индексов" [Rebuilding Indexes] лекция 17.) Чтобы активизировать или отключить автоматическое обновление для определенной статистики, вы можете использовать хранимую процедуру sp_autostats, которая описывается далее.

Процедура sp_autostats

Используя системную хранимую процедуру sp_autostats, вы можете активизировать или отключить автоматическое обновление определенной статистики. Запуск этой процедуры не приводит к обновлению данной статистики; она просто определяет, должно ли происходить автоматическое обновление статистики. Вызов этой хранимой процедуры происходит с одним, двумя или тремя параметрами: имя таблицы и – дополнительно – флаг и имя статистики. Флаг указывает состояние автоматического обновления и может принимать значения ON (включено) или OFF (отключено). Чтобы вывести текущий статус обновления для всех наборов статистики по определенной таблице (статистика по индексированным колонкам и неиндексированным колонкам), запустите эту команду с именем этой таблицы. Следующая команда выводит этот статус для наборов статистики по таблице Customers:

USE Northwind
GO
sp_autostats Customers
GO

Будет выведено имя каждого набора статистики независимо от значения флага автоматического обновления ( ON или OFF ) и время последнего обновления. Не обращайте внимания на заголовок первой колонки Index Name (Имя индекса). Он относится ко всем наборам статистики, а не только к индексам. Если вы не отключили вручную обновление для этих наборов статистики, то они будут представлены со статусом ON, поскольку это принятое по умолчанию состояние в SQL Server.

Чтобы отключить автоматическое обновление всех наборов статистики в таблице Customers базы данных Northwind, используйте следующую команду:

USE Northwind
GO
sp_autostats Customers, 'OFF'
GO

Вы можете снова активизировать автоматическое обновление статистики, задав для флага значение ON. Чтобы изменить статус определенного набора статистики или статистики для индекса, включите в обращение соответственно имя набора статистики или имя индекса. Например, следующая команда задает автоматическое обновление статистики для индекса PK_Customers:

USE Northwind
GO
sp_autostats Customers, 'ON', 'PK_Customers'
GO

Статус всех других наборов статистики по таблице Customers не изменится.

Рост файлов

Работая с SQL Server 2000, вы можете конфигурировать файлы данных для их автоматического увеличения по мере необходимости. Это средство полезно, поскольку оно препятствует случайному выходу файлов за пределы допустимого дискового пространства. Однако использование это средства не освобождает вас от обязанности мониторинга размера ваших баз данных и выполнения время от времени процедур планирования мощности. Вы также должны следить за тем, как быстро происходит рост таблиц, чтобы вы могли определить, нужно ли вам выполнять регулярное удаление ненужных, возможно, устаревших данных в некоторых таблицах, чтобы сдерживать рост ваших таблиц. По мере роста количества данных в таблице запросы могут занимать больше времени, что приводит к снижению уровня производительности. Тема конфигурирования автоматического роста при создании базы данных была затронута в лекции 9, а здесь вы узнаете, как изменять параметры увеличения файлов для существующей базы данных. Параметры автоматического роста файлов можно сконфигурировать в Enterprise Manager. Для этого выполните следующие шаги.

  1. В левой панели Enterprise Manager раскройте сервер и затем щелкните на папке Databases (Базы данных). Щелкните правой кнопкой мыши на базе данных, которую вы хотите модифицировать (в данном примере мы будем модифицировать базу данных MyDB), и выберите из контекстного меню пункт Properties, чтобы открыть окно свойств базы данных Properties.
  2. Щелкните на вкладке Data Files (Файлы данных) (рис. 30.5), чтобы увидеть свойства файлов данных для этой базы данных. Параметры секции File properties (Свойства файлов) предназначены для того, чтобы вы могли контролировать рост файла данных. Чтобы разрешить автоматический контроль роста файла, установите флажок Automatically grow file (Автоматический рост файла). Используя средство автоматического увеличения файла, вы должны задать ограничения, чтобы воспрепятствовать неконтролируемому росту файла.

    Вкладка Data Files (Файлы данных) окна Properties базы данных MyDB


    Рис. 30.5.  Вкладка Data Files (Файлы данных) окна Properties базы данных MyDB

    Максимальный размер файла указывается с помощью параметров секции Maximum file size (Максимальный размер файла). Щелкните на кнопке выбора Restrict file growth (Ограничить рост файла) и введите максимально допустимый размер в прокручиваемом поле-счетчике. Если щелкнуть на кнопке выбора Unrestricted file growth (Неограниченный рост файла), то в дальнейшем вы можете столкнуться с тем, что вся ваша дисковая подсистема заполнена до конца без какого-либо предупреждения, создавая проблемы как для работы, так и производительности.

    Степень роста файла задается с помощью параметров секции File growth (Рост файла). Если щелкнуть на кнопке выбора In megabytes (Мегабайты), то после заполнения этого файла данных SQL Server увеличит его размер на указанную величину. Если щелкнуть на кнопке выбора By percent (Проценты), то SQL Server увеличит размер файла данных на указанную величину в процентах от текущего размера.

  3. Щелкните на вкладке Transaction Log (Журнал транзакций) (рис. 30.6), чтобы задать параметры автоматического роста для журнала транзакций. Параметры этой вкладки используются так же, как и соответствующие параметры вкладки Data Files. Вы должны задать пределы для файлов журнала транзакций, чтобы воспрепятствовать их неконтролируемому росту.

    Вкладка Transaction Log (Журнал транзакций) для окна Properties базы данных MyDB


    Рис. 30.6.  Вкладка Transaction Log (Журнал транзакций) для окна Properties базы данных MyDB

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

SQL Server выполняет операции с контрольными точками автоматически. Частота создания контрольных точек автоматически рассчитывается в соответствии со значением, которые вы задали для параметра конфигурирования SQL Server recovery interval. Этот параметр указывает длительность вашего ожидания в минутах при восстановлении базы данных после аварии системы. Контрольные точки создаются достаточно часто, чтобы время восстановления системы не превысило указанного вами значения в минутах. Кроме того, контрольные точки автоматически создаются при отключении SQL Server с помощью оператора SHUTDOWN или Service Control Manager (Диспетчер управления службами). Вы можете также создавать контрольные точки вручную с помощью оператора CHECKPOINT.

Если вы хотите, чтобы система работала оптимальным образом и если вы готовы подождать подольше, то можете задать для параметра recovery interval достаточно большое значение, например, 60. Это означает, что при аварии вашей системы автоматическое восстановление будет занимать до 60 минут. При создании контрольных точек выполняется большое количество операций записи на диск, а они могут отбирать часть ресурсов обработки у пользовательских транзакций, увеличивая время отклика на запросы пользователей. Вот почему менее частое создание контрольных точек может помочь в повышении производительности по транзакциям в целом. Конечно, слишком большое значение параметра может приводить к слишком длительному простою после аварии. Обычно для recovery interval задают значение от 5 до 15 (минут).

По умолчанию для recovery interval задано значение 0. Это значение указывает, что SQL Server будет определять наилучшие моменты создания контрольных точек, исходя из загруженности системы. Обычно при использовании этого значения по умолчанию контрольные точки создаются приблизительно раз в минуту. Если вы считаете, что они создаются слишком часто, то можете изменить значение recovery interval. Чтобы определить, не слишком ли часто SQL Server создает контрольные точки, используйте флаг трассировки SQL Server -T3502. Это флаг указывает запись информации по контрольным точкам в журнал ошибок SQL Server. Отметим, что контрольные точки создаются по каждой базе данных.

Планы обслуживания баз данных

План обслуживания – это набор задач, которые SQL Server будет автоматически выполнять по вашим базам данных согласно заданному вами расписанию. Целью плана обслуживания является автоматизация важных административных задач и снижение объема ручной работы DBA. Вы можете создавать отдельный план для каждой базы данных, несколько планов для одной базы данных или один план для нескольких баз данных.

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

Выполнение этих задач имеет важное значение для поддержки хорошо работающей и восстанавливаемой базы данных. Типы оптимизационных задач, которые вы включите в ваш план, будут зависеть от производительности и степени использования вашей базы данных. Выполнение проверок целостности является хорошим средством, чтобы обеспечить согласованность и сохранность базы данных. А регулярное резервное копирование требуется для того, чтобы обеспечить восстанавливаемость базы данных в случае аварии системы или пользовательских ошибок. В силу особой важности операций резервного копирования вам следует разработать стратегию автоматизированного резервного копирования. Мы подробно рассмотрим каждую из этих категорий задач в данном разделе.

Для создания плана обслуживания используется мастер Database Maintenance Plan Wizard. В данном разделе вы узнаете, как использовать этот мастер, а затем узнаете, как выводить на экран задания плана обслуживания и как редактировать этот план.

Использование мастера Database Maintenance Plan Wizard для создания плана обслуживания

Для использования мастера Database Maintenance Plan Wizard выполните следующие шаги.

  1. Запустите этот мастер из Enterprise Manager с помощью одного из следующих методов.
    • Выберите из меню Tools пункт Database Maintenance Planner (Планировщик обслуживания баз данных).
    • Щелкните на имени базы данных в левой панели и затем щелкните на New Maintenance Plan (Новый план обслуживания) под заголовком Maintenance (Обслуживание) в правой панели. Если вы не видите заголовка Maintenance, убедитесь в том, что у вас выбран пункт Taskpad (Панель задач) в меню View (Вид) Enterprise Manager. Возможно, вам придется также выполнить прокрутку, чтобы увидеть заголовок Maintenance.
    • Щелкните на имени базы данных, выберите пункт Wizards (Мастера) из меню Tools, раскройте в появившемся диалоговом окне Select Wizard (Выбор мастера) папку Management (Управление) и затем выберите Database Maintenance Plan Wizard.
    • Раскройте сервер в левой панели, раскройте папку Management, щелкните правой кнопкой мыши на Database Maintenance Plans (Планы обслуживания баз данных) и затем выберите из появившегося контекстного меню пункт New Maintenance Plan.
    • Щелкните правой кнопкой мыши на имени соответствующей базы данных, выберите пункт All Tasks (Все задачи) и затем выберите из этого меню Maintenance Plan.
    Открыв мастер, вы увидите начальное окно мастера Database Maintenance Plan Wizard (рис. 30.7).

    Начальное окно мастера Database Maintenance Plan Wizard


    Рис. 30.7.  Начальное окно мастера Database Maintenance Plan Wizard

  2. Щелкните на кнопке Next (Далее), чтобы появилось окно Select Databases (Выбор баз данных) (рис. 30.8). Здесь вы можете выбрать базу или базы данных, для которых хотите создать план обслуживания.

    Окно Select Databases (Выбор баз данных)


    Рис. 30.8.  Окно Select Databases (Выбор баз данных)

  3. Щелкните на кнопке Next, чтобы появилось окно Update Data Optimization Information (Обновление информации по оптимизации данных) (рис. 30.9). Вы можете выбирать следующие типы оптимизации для базы или баз данных, выбранных на предыдущем шаге.
    • Reorganize data and index pages (Реорганизация страниц данных и индексов).Этот флажок указывает, что все индексы и все таблицы базы данных будут удалены и воссозданы с использованием указанного коэффициента заполнения (или количества свободного места на каждой странице), что может повысить производительность обновлений. В случае таблиц, предназначенных только для чтения, реорганизация страниц не является необходимостью. В случае таблиц, для которых часто выполняются вставки или изменения, свободное место, которое первоначально было доступно на ваших индексных страницах, постепенно заполняется, и начинает происходить фрагментация страниц. Установите этот флажок, чтобы выполнить повторное создание ваших индексов и образовать свободное место для будущего роста во избежание задержек и нагрузок, вызываемых фрагментацией страниц.

      Вы можете выбрать между повторным созданием индексов с исходным количеством свободного места или указать новый процент свободного места на одну страницу. Если задать слишком большой процент, то вы рискуете снизить производительность операций чтения. Установив этот флажок, вы не можете установить следующий флажок – Update statistics used by query optimizer.

      Совет.Удаление и повторное создание индексов может оказаться более длительным, чем использование DBCC DBREINDEX, см. раздел "Перестроение индексов" (Rebuilding Indexes) лекции 17. Вы можете также создать свое собственное задание по перестроению индексов вместо использования этого средства.

       Окно Update Data Optimization Information (Реорганизация страниц данных и индексов)


      Рис. 30.9.  Окно Update Data Optimization Information (Реорганизация страниц данных и индексов)

    • Update statistics used by query optimizer (Обновление статистики, используемой оптимизатором запросов) При установке этого флажка SQL Server выполнит перерасчет статистики распределения по всем индексам в соответствующей базе данных. SQL Server использует эту информацию для выбора оптимального плана исполнения для запросов. Если вы не изменили принятый по умолчанию параметр для обновления статистики (рассмотренный выше в этой лекции), то SQL Server автоматически генерирует статистику путем выборки небольшого процента данных в таблице, соответствующей каждому индексу.

      Флажок этого окна можно использовать для того, чтобы SQL Server выполнял выборку с использованием большего процента данных (указанного вами) или чтобы задать частоту, с которой SQL Server должен обновлять эту статистику, вместо автоматического выбора частоты в SQL Server. Чем больше процент выборки данных, тем точнее будет статистика, но при этом SQL Server потратит больше времени. Эта информация может помочь в повышении производительности при интенсивном изменении данных в индексируемых колонках. Вы можете проверить используемый план исполнения для ваших запросов с помощью анализатора запросов SQL Query Analyzer, чтобы определить, насколько эффективно используются индексы и насколько необходима установка данного флажка. Установив этот флажок, вы не сможете установить предыдущий флажок.

    • Remove unused space prom database files (Удалить неиспользуемое пространство из файлов базы данных) Этот флажок применяется для удаления неиспользуемого пространства; этот процесс также известен как уплотнение (сжатие) файла (file shrink). Вы можете задать, насколько большим должно стать неиспользуемое пространство, чтобы произошло сжатие файла, а также процент пространства, которое должно остаться свободным после сжатия. Удалив свободное пространство, вы можете использовать DBCC SHRINKFILE для снижения размера данного файла. Если нужно, вы можете сделать его меньше, чем при первоначальном создании. Это позволит использовать для других целей дисковое пространство, которое раньше было занято файлом. Кроме того, сжатие файла за счет удаления неиспользуемого пространства может повысить производительность. В случае таблиц, предназначенных только для чтения, реорганизация страниц не является необходимостью.

      Вы можете задать время, за которое должны выполняться эти задачи, щелкнув на кнопке Change (Изменить) и введя новое расписание в появившемся диалоговом окне Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) (рис. 30.10). Эти задачи следует выполнять в периоды небольшой загруженности системы, например, в выходные дни или ночью, поскольку это требует определенного времени и может увеличивать время отклика на запросы пользователей.

      Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий)


      Рис. 30.10.  Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий)

  1. Щелкните на кнопке Next, чтобы появилось окно Database Integrity Check (Проверка целостности базы данных) (рис. 30.11).

    Окно Database Integrity Check (Проверка целостности базы данных)


    Рис. 30.11.  Окно Database Integrity Check (Проверка целостности базы данных)

    В этом окне вы можете указать, нужно ли выполнять проверку целостности. При проверке целостности проверяется размещение и структурная целостность таблиц и индексов (если индексы включены в проверку) с помощью команды DBCC CHECKDB. Вы можете указывать, будут ли включаться в проверку индексы, будет ли SQL Server пытаться устранить небольшие проблемы (рекомендуется устанавливать этот флажок) и должны ли все эти проверки целостности выполняться перед резервным копированием. Если вы указали, что выполнение проверок должно происходить перед резервным копированием, то в случае обнаружения какой-либо проблемы это резервное копирование выполняться не будет. Щелкните на кнопке Change, чтобы изменить время, когда будут выполняться эти задачи. Проверка целостности может занимать несколько часов в зависимости от размера ваших баз данных, поэтому следите за тем, чтобы они не планировались на периоды интенсивного использования баз данных. Проверки должны проводиться регулярно, возможно, ежемесячно или еженедельно, или перед резервным копированием баз данных.
  2. Щелкните на кнопке Next, чтобы появилось окно Specify the Database Backup Plan (План резервного копирования баз данных) (рис. 30.12). В этом окне вы указываете, будет ли создаваться план автоматизированного резервного копирования. (Рекомендуется создавать такой план.) Чтобы активизировать автоматическое резервное копирование, установите флажок Back up the database as part of the maintenance plan (Выполнять резервное копирование как часть плана обслуживания). (О выполнении резервного копирования см. лекцию 32.) Вы можете указать для SQL Server проверку целостности резервной копии по окончании копирования. SQL Server выполняет это для подтверждения того, что резервная копия создана полностью и все тома резервной копии доступны. Вы можете также указывать, где должна храниться резервная копия – на ленте или диске. Щелкните на кнопке Change, чтобы изменить время, когда будет выполняться резервное копирование.

    Окно Specify the Database Backup Plan (План резервного копирования баз данных)


    Рис. 30.12.  Окно Specify the Database Backup Plan (План резервного копирования баз данных)

  3. Щелкните на кнопке Next, чтобы появилось окно Specify Backup Disk Directory (Дисковая директория для резервной копии) (рис. 30.13).

    Окно Specify Backup Disk Directory (Дисковая директория для резервной копии)


    Рис. 30.13.  Окно Specify Backup Disk Directory (Дисковая директория для резервной копии)

    Это окно появляется, только если вы задали в предыдущем окне резервное копирование на диск; оно не появится, если вы задали резервное копирование на ленту. В этом окне вы можете задать местоположение файла резервной копии или использовать принятую по умолчанию директорию для резервной копии. Если у вас несколько баз данных, для которых выполняется резервное копирование (таких как master, model, msdb), то вы можете выбрать размещение резервной копии каждой базы данных в ее собственной поддиректории, чтобы поддерживать определенную организацию файлов резервных копий. Вы можете выбрать автоматическое удаление файлов резервных копий по истечении определенного срока хранения, чтобы освобождалось пространство на дисках, а также можете задавать расширение имен файлов, которое хотите использовать для файлов резервных копий.
  4. Щелкните на кнопке Next, чтобы появилось окно Specify the Transaction Log Backup Plan (План резервного копирования журнала транзакций) (рис. 30.14).

    Окно Specify the Transaction Log Backup Plan)


    Рис. 30.14.  Окно Specify the Transaction Log Backup Plan)

    Это окно устроено аналогично окну Specify the Database Backup Plan, показанному на рис. 30.12, но параметры этого окна используются для создания плана резервного копирования журнала транзакций. Резервное копирование журнала транзакций должно происходить между резервными копированиями вашей базы данных. Для восстановления любых изменений, выполненных с момента последнего резервного копирования базы данных, используется резервная копия журнала транзакций. Иначе говоря, резервные копии журнала транзакций позволяют вам восстанавливать данные между резервными копированиями базы данных.

    Если у вас выбрано сохранение резервных копий на диске, то следующим будет окно Specify Backup Disk Directory, в котором вы задаете информацию о местоположении файла резервной копии.

  1. Щелкните на кнопке Next, чтобы появилось окно Reports to Generate (Генерируемые отчеты) (рис. 30.15). В этом окне вы можете выбрать создание отчета, содержащего результаты выполнения задач плана обслуживания. Этот отчет содержит подробности выполненных шагов и любые возникшие ошибки. В этом окне вы также задаете местоположение для сохранения отчета, а также можете задать удаление отчетов через определенный период времени и отправку отчета по электронной почте указанным адресатам.

    Окно Reports to Generate (Генерируемые отчеты)


    Рис. 30.15.  Окно Reports to Generate (Генерируемые отчеты)

  2. Щелкните на кнопке Next, чтобы появилось окно Maintenance History (Журнал обслуживания) (рис. 30.16). Здесь вы можете выбрать запись отчета с журналом (историей) обслуживания в таблицу базы данных на локальном сервере и задать максимальный размер этого отчета. Вы можете также указать запись этого отчета на удаленный сервер и задать максимальный размер этого отчета.
  3. Щелкните на кнопке Next, чтобы появилось окно Completing the Database Maintenance Plan Wizard (Завершение работы мастера создания плана обслуживания баз данных) (рис. 30.17). В этом окне показана сводка вашего плана обслуживания. План получит имя по умолчанию, но вы можете задать другое имя, набрав его в текстовом поле Plan Name (Имя плана). Проверьте эту сводку и пройдите в обратном направлении, если хотите изменить какие-то параметры. Если план вас устраивает, щелкните на кнопке Finish (Готово).

    Окно Maintenance History (Журнал обслуживания)


    Рис. 30.16.  Окно Maintenance History (Журнал обслуживания)

    Окно Completing the Database Maintenance Plan Wizard (Завершение работы мастера создания плана обслуживания баз данных)


    Рис. 30.17.  Окно Completing the Database Maintenance Plan Wizard (Завершение работы мастера создания плана обслуживания баз данных)

Отображение заданий плана обслуживания

Для нашего примера плана обслуживания мы создали по одной задаче в каждой из четырех категорий. Чтобы увидеть список этих заданий (запланированных задач), раскройте папку Management в левой панели Enterprise Manager, раскройте агент SQL Server Agent и затем щелкните на строке Jobs (Задания) (рис. 30.18).

Задания, созданные в нашем примере плана обслуживания


увеличить изображение

Рис. 30.18.  Задания, созданные в нашем примере плана обслуживания

Редактирование плана обслуживания

Чтобы отредактировать план обслуживания, щелкните в левой панели Enterprise Manager на имени базы данных, для которой создан план обслуживания, и затем выберите имя этого плана под заголовком Maintenance в правой панели. Возможно, вам потребуется выполнить прокрутку, чтобы увидеть заголовок Maintenance. Появится диалоговое окно Database Maintenance Plan (рис. 30.19).

Во вкладке General вы можете указывать, какие базы данных будет затрагивать ваш план обслуживания. В других вкладках вы можете изменять значения параметров, которые сконфигурировали с помощью мастера Database Maintenance Plan Wizard. Закончив редактирование плана, щелкните на кнопке OK. Ваш план теперь начнет выполняться в соответствии с указанным вами расписанием.

Примечание.Для автоматического выполнения планов в соответствии с расписанием у вас должен быть запущена служба SQL Server Agent. (О службе SQL Server Agent см. лекцию 31.)

Вкладка General диалогового окна Database Maintenance Plan


Рис. 30.19.  Вкладка General диалогового окна Database Maintenance Plan

Заключение

В этой лекции вы узнали о средствах динамического конфигурирования SQL Server 2000, которые помогают снижать объем работы по настройке, выполняемой администраторами баз данных (DBA). Вы также узнали, как создавать план обслуживания баз данных для автоматического выполнения административных задач. В лекции 31 вы узнаете, как использовать SQL Server Agent для определения заданий и оповещений. Создавая задания и оповещения, вы можете еще больше автоматизировать административные задачи.

Лекция 31. Автоматизация административных задач

Автоматизация административных задач осуществляется заданиями, оповещениями, операторами. С помощью службы SQLServerAgent можно управлять автоматизацией задач. Maintenance Plan Wizard и Create Job Wizard помогают конфигурировать задачи и планы работ. Служба SQLServerAgent имеет собственный журнал ошибок, который позволяет протоколировать любые действия, связанные со службой. Описывается подробное использование T-SQL, системные хранимые процедуры sp_addmessage, sp_altermessage, xp_logevent, sp_help_jobhistory. Проводится их подробное описание и примеры решения конкретных задач.

В лекции 30 мы рассмотрели некоторые из параметров автоматического конфигурирования и параметров баз данных, входящих в Microsoft SQL Server 2000 и помогающих снизить объем работы DBA по настройке баз данных. В этой лекции вы узнаете, как использовать некоторые дополнительные средства, предоставляемые в SQL Server, для автоматизации других административных задач с помощью службы SQLServerAgent. Служба SQLServerAgent позволяет автоматически выполнять определенные периодические задачи с базой данных и оповещать DBA или другое указанное лицо о том, что на сервере возникла какая-либо проблема или событие. Использование этих возможностей позволяет DBA обходиться без ручного и непрерывного мониторинга системы баз данных, чтобы определять, когда должны выполняться определенные задачи, что позволяет выделить время для более сложных вопросов по базам данных, таких как построение и настройка индексов, оптимизация запросов или планирование будущего роста.

Для автоматизации административных задач используются три основных средства: задания (jobs), оповещения (alerts) и операторы (operators). В этой лекции вы узнаете о службе SQLServerAgent и о том, как использовать эту службу для создания и использования заданий, оповещений и операторов. Вы также узнаете о журнале ошибок SQLServerAgent, который можете использовать для слежения за работой, выполняемой SQLServerAgent.

Служба SQLServerAgent

Агент SQL Server Agent запускается отдельно от SQL Server, как служба с именем SQLServerAgent. Эта служба включена в состав SQL Server 2000, но она должна запускаться отдельно – вручную или автоматически. (Об инструкциях по запуску SQLServerAgent см. лекцию 8.) После запуска этой службы вы можете переходить к определению любых нужных вам заданий, оповещений и операторов.

Примечание.Служба SQLServerAgent называлась SQL Executive в Microsoft SQL Server 6.5 и более ранних версиях. Она также используется для репликации. (См. лекции 26, 27 и 28.)

Задания

Задания – это административные задачи, которые определяются один раз и могут выполняться многократно. Вы можете запускать задание вручную, а также планировать запуск задания системой SQL Server в определенное время, в соответствии с регулярным расписанием или при возникновении оповещения. (Об оповещениях описаны далее в разделе "Оповещения".) Задания могут состоять из операторов Transact-SQL (T-SQL), команд Microsoft Windows NT или Microsoft Windows 2000, исполняемых программ или сценариев Microsoft ActiveX. Задания также автоматически создаются для вас, когда вы используете репликацию или создаете план обслуживания базы данных. Задание может состоять из одного или нескольких шагов, и каждый шаг может быть вызовом более сложного набора шагов, например обращением к хранимой процедуре. SQL Server автоматически следит за результатом выполнения заданий (успешное или неуспешное завершение); вы можете задавать оповещения, которые будут отправляться в каждом случае.

Задания могут выполняться локально на сервере, а в случае нескольких серверов в сети вы можете назначать один из серверов как главный сервер, а остальные серверы – как серверы-получатели. На главном сервере хранятся определения заданий для всех серверов, и этот сервер действует как центр обмена информацией для координирования работы всех заданий. Каждый сервер-получатель периодически подсоединяется к главному серверу, обновляет список своих заданий, если какие-либо задания изменились, загружает любые новые задания с главного сервера и затем отсоединяется для выполнения этих заданий. Когда сервер-получатель завершает какое-либо задание, он снова подсоединяется к главному серверу и сообщает о статусе его завершения.

Рассмотрим ситуацию, в которой вам может потребоваться создать задание. Предположим, что у вас имеется таблица базы данных, в которой ведется запись по каждой выполненной в банковской среде транзакции, такой как вклад денег на счет, снятие денег со счета и перевод (трансферт) денег. Каждая запись содержит колонку временной метки (timestamp),где указывается время выполнения транзакции. Эта таблица непрерывно растет, и ее нужно периодически сокращать. Для удаления строк из этой таблицы вы можете написать небольшую хранимую процедуру, в которой используется оператор DELETE для удаления строк, которые хранятся больше двух месяцев (в предположении, что банк должен хранить записи только два месяца). Затем вы можете создать задание для выполнения этой хранимой процедуры раз в неделю, например в ночь на воскресенье. Тем самым вы можете воспрепятствовать бесконечному росту данной таблицы. Это позволяет экономить пространство на диске и, кроме того, обычно повышает производительность. При меньшем количестве данных, среди которых выполняется по запросу, SQL Server может быстрее выполнить этот запрос. А теперь перейдем к подробностям создания заданий.

Примечание.Для работы ваших заданий должна быть запущена служба SQLServerAgent.
Создание задания

Чтобы определить задание, вы можете использовать Enterprise Manager, сценарии T-SQL, мастер создания заданий Create Job Wizard или SQL-Distributed Management Objects (SQL-DMO). Поскольку метод SQL-DMO связан с программированием, он выходит за рамки материала этой книги. В этом разделе вы узнаете о трех других методах создания заданий.

Дополнительная информация. Для получения информации по созданию заданий найдите "jobs" (задания) в индексе Books Online и выберите тему "Creating SQL Server Agent Jobs (SQL-DMO)" (создание заданий SQL Server Agent [SQL-DMO]) в диалоговом окне Topics Found (Найденные темы).
Использование Enterprise Manager

Сначала создадим задание с помощью Enterprise Manager. Один из наиболее распространенных случаев применения заданий – это резервное копирование баз данных. (Для этого можно также использовать мастер плана обслуживания Maintenance Plan Wizard, см. лекцию 30.) В следующем примере создается задание на резервное копирование базы данных MyDB. В нем запланированы запуск резервного копирования каждый вечер в 11 P.M. (23:00) и запись результата завершения этого задания (успешное или неуспешное) в журнал событий приложения Windows NT или Windows 2000 и в выходной файл. Для создания этого задания, которое мы назовем MyDB_backup_job, выполните следующие шаги.

  1. В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management (Управление) и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Jobs (Задания) и выберите из контекстного меню пункт New Job (Создать задание). Появится окно New Job Properties (Свойства нового задания) (рис. 31.1).

     Вкладка General окна New Job Properties (Свойства нового задания)


    Рис. 31.1.  Вкладка General окна New Job Properties (Свойства нового задания)

  2. Во вкладке General задайте следующие параметры:
    • Name (Имя). Введите в текстовом поле Name имя задания (в данном случае – MyDB_backup_job ). Имя задания может содержать до 128 символов. Каждое задание на сервере должно иметь уникальное имя. Постарайтесь задать описательное имя.
    • Enabled (Активизировать). Установленный флажок Enabled указывает, что задание должно быть активизировано. Возможно, вы захотите сначала деактивизировать задание, чтобы проверить его вручную и убедиться, что оно правильно работает. Проверив задание и убедившись в правильности его работы, используйте этот флажок для активизации задания, чтобы оно автоматически запускалось в соответствии с расписанием.
    • Category (Категория).Выберите категорию для задания; в данном случае мы используем принятую по умолчанию категорию Uncategorized (Local) (Без категории [Локально]). Вы можете выбирать из списка категорий, которые создаются при инсталляции SQL Server, или можете создавать свои собственные категории. (О создании новой категории см. в подразделе "Создание новой категории" далее.) В список инсталлированных категорий входят Uncategorized (Local), Database Maintenance (Обслуживание базы данных), Full Text (Полнотекстовый поиск), Web Assistant (Web-помощник) и 10 категорий для репликации. Категории используются для группирования родственных заданий. Например, вы можете группировать в одной категории все задания, которые используются для выполнения задач обслуживания базы данных, или группировать задания по отделам, таким как отделы бухгалтерского учета, продаж и маркетинга. Категории позволяют вам следить за несколькими заданиями: вам не нужно просматривать весь список заданий, когда вас интересует только определенная часть заданий.
    • Owner (Владелец). Владелец – это пользователь, который создает задание, или пользователь, для которого создается задание. Только роли sysadmin позволяют изменять владельца задания или изменять задание, владельцем которого является другой пользователь. (О роли SQL Server см. лекцию 34). Все роли sysadmin, а также владелец задания могут изменять определение задания, а также запускать и останавливать задание. В раскрывающемся списке Owner всегда выбирайте пользователя, который будет выполнять задание. В данном примере используется пользователь, который создает задание, поэтому соответствующий пользователь выбран автоматически, и вы можете оставить этот выбор без изменений.
    • Description (Описание).В текстовом поле Description вы указываете, какие задачи выполняет этот задание, и цель этого задания. Вам следует всегда вводить описание. Это позволяет другим пользователям быстро определять, для чего предназначено задание. Описание может содержать до 512 символов.
    • Target local server (На локальном сервере). Если щелкнуть на этой кнопке выбора, то задание будет выполняться только на локальном сервере. Если к данному серверу подсоединены удаленные серверы, то будет доступна кнопка выбора Target multiple servers (На нескольких серверах). Щелкните на этой кнопке выбора, чтобы указать удаленные серверы, на которых также будет запускаться это задание.
    На рис. 31.2 показана заполненная вкладка General для задания.

     Заполненная вкладка General


    Рис. 31.2.  Заполненная вкладка General

  3. Щелкните на вкладке Steps (Шаги) и щелкните на New (Создать), чтобы появилось диалоговое окно New Job Step (Новый шаг задания) (рис. 31.3). Шаги задания – это команды или операторы, которые определяют задачи данного задания. Каждое задание должно содержать хотя бы один шаг и может содержать несколько шагов. Во вкладке General диалогового окна New Job Step введите следующую информацию:
    • В текстовом поле Step name (Имя шага) введите имя данного шага (в данном случае введите MyDB_backup ).
    • В раскрывающемся списке Type (Тип) выберите тип шага. В данном примере выберите Transact-SQL Script (TSQL) (Сценарий T-SQL), поскольку для выполнения этого задания мы будем использовать команды T-SQL. Среди других вариантов выбора – ActiveX Script (Сценарий ActiveX), Operating System Command (Команда операционной системы), Replication Distributor (Дистрибьютор репликации), Replication Transaction-Log Reader (Репликация, чтение журнала транзакций), Replication Merge (Репликация слиянием), QueueReader (Репликация, чтение данных из очереди) и Replication Snapshot (Репликация моментального снимка).

       Заполненная вкладка General диалогового окна New Job Step (Новый шаг задания)


      Рис. 31.3.  Заполненная вкладка General диалогового окна New Job Step (Новый шаг задания)

    • В раскрывающемся списке Database (База данных) выберите имя базы данных, с которой будет работать данное задание. Для данного примера выберите базу данных MyDB.
    • В текстовом поле Command (Команда) введите команды, которые хотите включить в данный шаг. Для данного примера это команды T-SQL для резервного копирования базы данных MyDB устройство резервного копирования с именем MyDB_backup1. Это устройство должно быть создано заранее. (О создании устройств резервного копирования см. лекцию 32.} Кроме того, наш случай – это простой пример, в котором резервная копия базы данных будет записываться в один и тот же файл каждую ночь. На практике для выполнения резервного копирования вам следует использовать план обслуживания базы данных (см. лекцию 30), поскольку это позволит вам создавать новое устройство резервного копирования на каждый день. Вы можете также щелкнуть на кнопке Open (Открыть), чтобы открыть файл, если у вас есть подготовленный сценарий, который вы хотите ввести как задание.
  4. Щелкните на кнопке Parse (Синтаксический разбор), чтобы проверить синтаксис ваших шагов T-SQL, и затем щелкните на вкладке Advanced (Дополнительно) и задайте параметры (рис. 31.4). В этой вкладке вы можете выбрать, какое действие следует предпринять при успешном (success) и неуспешном (failure) завершении данного задания: Quit the job reporting success (Завершить задание с выдачей кода успешного завершения), Quit the job reporting failure (Завершить задание с выдачей кода неуспешного завершения) или перейти к следующему шагу. Вы можете также задать количество повторных попыток выполнения шага задания, если он не был успешно выполнен, а также интервал между попытками. Если шаг представлен командой T-SQL или сценарием, то вы можете выбрать выходной файл, в который будут выводиться результаты T-SQL. Вы можете задать добавление выходных результатов к этому файлу при каждом запуске задания (кнопка выбора Append) или указать замещение старых результатов новыми (кнопка выбора Overwrite). Щелкните на кнопке View (Просмотр), чтобы увидеть содержимое выходного файла. Установите флажок Append output to step history (Добавлять выходные результаты в журнал выполнения шагов), чтобы результаты выполнения задания добавлялись в таблицу журнала для данного задания. Вы можете также указать пользователя (поле Run as user), который будет запускать этот набор T-SQL.

     Заполненная вкладка Advanced (Дополнительно) диалогового окна New Job Step


    Рис. 31.4.  Заполненная вкладка Advanced (Дополнительно) диалогового окна New Job Step

  1. Щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK, чтобы вернуться во вкладку Steps окна New Job Properties, где вы можете при необходимости определить другие шаги задания. Щелкните на кнопке New, чтобы добавить новый шаг вслед за существующим шагом. Чтобы вставить новый шаг перед существующим шагом, выделите этот существующий шаг и затем щелкните на кнопке Insert (Вставить), чтобы появилось окно New Job Step. Введите информацию для шага, который вы хотите вставить. Для удаления шага выделите этот шаг и щелкните на кнопке Delete (Удалить); для редактирования шага выделите его и щелкните на кнопке Edit (Редактирование). Вы можете также переместить шаг в списке, выделив его и щелкая на кнопке "стрелка вверх" или "стрелка вниз" справа от метки Move Step (Переместить шаг). В раскрывающемся списке Start Step (Начальный шаг) вы можете выбрать шаг, который будет выполняться первым в данном задании. Рядом с идентификационным номером шага, который будет выполняться первым, появится зеленый флаг. Щелкните на кнопке Apply, чтобы включить ваши шаги в задание. Если логика последовательности выполняемых шагов приводит к тому, что не будет выполняться какой-либо шаг, то после щелчка на кнопке Apply SQL Server выведет предупреждающее сообщение и позволит вам изменить логику последовательности.
  2. Чтобы создать расписание для этого задания, щелкните на вкладке Schedules (Расписания). Чтобы найти текущее время на каком-либо сервере, выберите имя этого сервера в раскрывающемся списке NOTE: The Current Date/Time On Target Server (Текущие дата/время на целевом сервере). Щелкните на кнопке New Schedule (Создать расписание), чтобы появилось диалоговое окно New Job Schedule (Новое расписание задания) (рис. 31.5). Расписание указывает, в какие моменты времени и по каким дням следует запускать задание. Задание может запускаться один раз или регулярно. Если вы хотите запускать задание вручную или время от времени, то вы не обязаны задавать расписание задания, а просто запускать задание, когда вам потребуется. Введите в поле имени расписания (Name) MyDB_backup_schedule, задайте параметры в секции Schedule Type (Тип расписания) (в данном случае щелкните на кнопке выбора Recurring [Повторяющееся]) и установите флажок Enabled (Активизировать). (Эти параметры показаны на рис. 31.5.) Флажок Enabled имеет то же назначение, что и в окне New Job Properties.

      Диалоговое окно New Job Schedule (Новое расписание задания)


    Рис. 31.5.  Диалоговое окно New Job Schedule (Новое расписание задания)

  3. Поскольку мы выбрали расписание повторяющегося типа, то вы должны задать моменты времени и дни, когда должно запускаться это задание. Для этого щелкните на кнопке Change (Изменить), чтобы появилось диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий). Введите новые моменты времени и дни, затем щелкните на кнопке OK, чтобы вернуться в диалоговое окно New Job Schedule. (Напомним, что нам нужно задать ежедневное резервное копирование, которое будет запускаться в 11 P.M.)
  4. Щелкните на кнопке OK в диалоговом окне New Job Schedule, чтобы согласиться с расписанием и вернуться в окно New Job Properties. Чтобы удалить какое-либо расписание, выделите имя этого расписания и щелкните на кнопке Delete. Чтобы отредактировать какое-либо расписание, выделите имя этого расписания и щелкните на кнопке Edit.
    Примечание. Вы можете также создать новое оповещение для этого задания. Оповещения подробно рассматриваются далее.
  5. Щелкните на вкладке Notifications (Уведомления) (рис. 31.6). В этой вкладке вы можете определять процесс уведомления, чтобы оператор (или указанный пользователь) получал уведомление об успешном или неуспешном результате выполнения задания или об окончании задания. Это уведомление может быть отправлено по электронной почте, на пейджер или как сообщение в сети с помощью команды NET SEND. Статус задания можно записывать в журнал событий Windows NT или Windows 2000, и вы можете даже автоматически удалять задание в случае успешного выполнения, неуспешного завершения или после окончания. Чтобы сконфигурировать уведомление для операторов, установите нужные флажки E-mail operator (Оператор для электронной почты), Page operator (Оператор с пейджером) и Net send operator (Оператор в сети) и выберите имя оператора в раскрывающемся списке справа от флажка. (О создании операторов см. раздел "Операторы" далее.) В крайних правых списках выберите условие, по которому инициируется уведомление. Чтобы записывать результаты в журнал событий (Write to Windows application event log) или автоматически удалять задание по его окончании (Automatically delete job), установите нужные флажки и затем в соответствующих раскрывающихся списках выберите условие, по которому нужно выполнить действие, указанное флажком. В данном примере установите флажок Write to Windows application event log.

     Вкладка Notifications (Уведомления) окна New Job Properties


    Рис. 31.6.  Вкладка Notifications (Уведомления) окна New Job Properties

  6. Закончив формирование параметров, щелкните на кнопке Apply, чтобы создать ваше задание, и затем щелкните на кнопке OK, чтобы выйти из окна New Job Properties и вернуться в Enterprise Manager.
  7. Щелкните на строке Jobs в левой панели Enterprise Manager. Вы увидите задание MyDB_backup_job, включенное в список заданий в правой панели.

Создание новой категории. Чтобы создать новую категорию, раскройте сервер в левой панели Enterprise Manager, раскройте папку Management (Управление), щелкните правой кнопкой мыши на строке Jobs, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Manage Job Categories (Управление категориями заданий). Появится диалоговое окно Job Categories (Категории заданий) (рис. 31.7), где вы можете добавлять новые категории, просматривать существующие категории и задания, которые в них входят, и удалять категории.

Диалоговое окно Job Categories (Категории заданий)


Рис. 31.7.  Диалоговое окно Job Categories (Категории заданий)

Использование T-SQL

Команды T-SQL, используемые для создания задания, добавления шагов к заданию и создания расписания для задания, – это системные хранимые процедуры sp_add_job, sp_add_jobstep и sp_add_jobschedule. Эти хранимые процедуры имеют много необязательных параметров, как это показано в их синтаксисе, представленном в этом разделе. SQL Server присваивает каждому неуказанному параметру значение по умолчанию. Enterprise Manager намного удобнее для создания заданий, поскольку его графический пользовательский интерфейс позволяет вам увидеть все параметры для задания, чтобы вы ничего не забыли. Используя T-SQL, вы должны задавать значения для всех необязательных параметров или быть уверенным в том, что принятые по умолчанию значения всех пропущенных вами параметров подходят для вашего задания. Вместо запуска этих хранимых процедур вручную вам следует использовать Enterprise Manager. Вы можете затем генерировать сценарии T-SQL, которые использовал Enterprise Manager для создания вашего задания; для этого щелкните правой кнопкой мыши на имени этого задания, укажите в контекстном меню All Tasks и выберите команду Generate SQL Script (Генерировать SQL-сценарий). Этот метод поможет вам повторно создать задание с помощью сценария, если это когда-нибудь потребуется.

Для запуска этих хранимых процедур вы должны использовать базу данных msdb, поскольку они хранятся в этой базе данных. Рассмотрим параметры, которые указываются в этих хранимых процедурах, – на тот случай, если вы все же захотите использовать их. Для всех хранимых процедур, описанных в этом разделе, используется один общий синтаксис. Хранимая процедура sp_add_job имеет следующий синтаксис:

sp_add_job [@job_name =] 'job_name'
[,[@enabled =] enabled] 
[,[@description =] 'description']
[,[@start_step_id =] step_id] 
[,[@category_name =] 'category']
[,[@category_id =] category_id] 
[,[@owner_login_name =] 'login']
[,[@notify_level_eventlog =] eventlog_level]
[,[@notify_level_email =] email_level]
[,[@notify_level_netsend =] netsend_level]
[,[@notify_level_page =] page_level]
[,[@notify_email_operator_name =] 'email_name']
[,[@notify_netsend_operator_name =] 'netsend_name'] 
[,[@notify_page_operator_name =] 'page_name']
[,[@delete_level =] delete_level] 
[,[@originating_server =] 'server_name'
[,[@job_id =] job_id OUTPUT]

Процедура sp_add_jobstep имеет следующий синтаксис:

sp_add_jobstep [@job_id =] job_id | [@job_name =] 'job_name'] 
[,[@step_id =] step_id] 
{,[@step_name =] 'step_name'}
[,[@subsystem =] 'subsystem'] 
[,[@command =] 'command']
[,[@additional_parameters =] 'parameters']
[,[@cmdexec_success_code =] code]
[,[@on_success_action =] success_action]
[,[@on_success_step_id =] success_step_id]
[,[@on_fail_action =] fail_action]
[,[@on_fail_step_id =] fail_step_id] 
[,[@server =] 'server']
[,[@database_name =] 'database'] 
[,[@database_user_name =] 'user']
[,[@retry_attempts =] retry_attempts] 
[,[@retry_interval =] retry_interval]
[,[@os_run_priority =] run_priority] 
[,[@output_file_name =] 'file_name']
[,[@flags =] flags]

Процедура sp_add_jobschedule имеет следующий синтаксис:

sp_add_jobschedule [@job_id =] job_id, | [@job_name =] 'job_name',
[@name =] 'name'
[,[@enabled =] enabled] 
[,[@freq_type =] freq_type]
[,[@freq_interval =] freq_interval]
[,[@freq_subday_type =] freq_subday_type]
[,[@freq_subday_interval =] freq_subday_interval]
[,[@freq_relative_interval =] freq_relative_interval]
[,[@freq_recurrence_factor =] freq_recurrence_factor] 
[,[@active_start_date =] active_start_date]
[,[@active_end_date =] active_end_date]
[,[@active_start_time =] active_start_time]
[,[@active_end_time =] active_end_time]
Дополнительная информация.Чтобы получить описание каждого параметра и его значения по умолчанию, найдите имя соответствующей хранимой процедуры в индексе Books Online.
Примечание. Описанные здесь хранимые процедуры, как и другие хранимые процедуры, связанные с созданием и управлением для заданий, операторов, уведомлений и оповещений, хранятся в базе данных msdb. Для запуска этих процедур у вас должна использоваться эта база данных.
Использование мастера Create Job Wizard

В состав Enterprise Manager включен мастер, который помогает вам пройти через процесс формирования заданий в пошаговом режиме. Правда, этот мастер ограничен в том, что вы можете создать только один шаг задания. Тем не менее он позволяет вам создавать расписание для задания и указывать операторов, которые будут получать уведомление о статусе задания. Создав такое задание, вы можете затем добавлять к нему новые шаги, модифицируя задание с помощью Enterprise Manager.

Чтобы использовать мастер Create Job Wizard, выполните следующие шаги.

  1. В Enterprise Manager выберите из меню Tools пункт Wizards (Мастера) в появившемся диалоговом окне Select Wizard (Выбор мастера) раскройте папку Management и выберите Create Job Wizard, чтобы появилось начальное окно мастера Create Job Wizard (рис. 31.8).

    Начальное окно мастера Create Job Wizard


    Рис. 31.8.  Начальное окно мастера Create Job Wizard

  2. Щелкните на кнопке Next, чтобы появилось окно Select job command type (Выбор типа команды для задания) (рис. 31.9). В этом окне вы можете указывать, какой тип шага вы создаете для задания. Для данного примера щелкните на Transact-SQL command (Команда T-SQL)

     Окно Select job command type (Выбор типа команды для задания)


    Рис. 31.9.  Окно Select job command type (Выбор типа команды для задания)

    .
  3. Щелкните на кнопке Next, чтобы появилось окно Enter Transact-SQL Statement (Ввод оператора T-SQL) (рис. 31.10). Для оператора T-SQL вы должны выбрать базу данных, в которой будет выполняться эта команда, и затем ввести оператор или операторы для задания или щелкнуть на кнопке Open (Открыть), чтобы найти и открыть файл, содержащий операторы T-SQL, которые вы хотите использовать. Щелкните на кнопке Parse для проверки синтаксиса введенных вами операторов T-SQL. Если у вас выбран тип команды Operating-system shell command (Команда для запуска из командной строки) или Active script (Активный сценарий), то вы получите запрос на ввод команд этого типа. Для данного примера введите оператор T-SQL для резервного копирования главной базы данных на ранее созданное устройство с именем backup_master_dev (рис. 31.10).

    Окно Enter Transact-SQL Statement (Ввод оператора T-SQL)


    Рис. 31.10.  Окно Enter Transact-SQL Statement (Ввод оператора T-SQL)

  4. Щелкните на кнопке Next, чтобы появилось окно Specify job schedule (Задать расписание задания) (рис. 31.11). Здесь вы можете указать, когда должно запускаться это задание.

    Окно Specify job schedule (Задать расписание задания)


    Рис. 31.11.  Окно Specify job schedule (Задать расписание задания)

    Вариант Now (Сейчас) указывает, что задание будет запущено, как только мастер завершит свою работу. Назначение других кнопок выбора описывается их названием. Для данного примера щелкните на кнопке выбора On a recurring basis (На повторяющейся основе) и затем щелкните на кнопке Schedule, чтобы задать расписание. Появится диалоговое окно Edit Recurring Job Schedule (рис. 31.12). Используйте его параметры для создания нужного расписания и щелкните на кнопке OK для возврата в окно Specify job schedule.

    Диалоговое окно Edit Recurring Job Schedule


    Рис. 31.12.  Диалоговое окно Edit Recurring Job Schedule

  5. Щелкните на кнопке Next, чтобы появилось окно Job Notifications (Уведомления для задания) (рис. 31.13).

    Окно Job Notifications (Уведомления для задания)


    Рис. 31.13.  Окно Job Notifications (Уведомления для задания)

    В раскрывающихся списках Net send и/или E-mail выберите оператора, который будет получать уведомление о статусе завершения этого задания. У вас уже должны быть определены операторы, чтобы они появились в раскрывающемся списке. На рис. 31.13 не определено ни одного оператора (No operators). Если вы хотите уведомлять оператора, который еще не определен, завершите работу мастера и затем добавьте этого оператора, как это описано в разделе "Операторы" далее. Вы можете затем модифицировать свойства задания, включив уведомление для этого оператора. Вы можете также прекратить работу мастера, создать оператора и затем снова выполнить запуск мастера.
  6. Щелкните на кнопке Next, чтобы появилось окно Completing the Create Job Wizard (Завершение работы мастера) (рис. 31.14). Здесь вы можете назначить имя задания, заменив заданное по умолчанию имя в текстовом поле Job Name (Имя задания); в данном примере ваше задание названо Backup_master_job. Проверьте текст в окне Description, чтобы убедиться, что он отражает нужные вам параметры, и если да, то щелкните на кнопке Finish (Готово), чтобы создать это задание. Если нет, то щелкните на кнопке Back (Назад) и внесите нужные изменения. Если задание создано успешно, то появится окно информационного сообщения. Щелкните на кнопке OK, чтобы закрыть это окно.

     Окно Completing the Create Job Wizard


    Рис. 31.14.  Окно Completing the Create Job Wizard

    После завершения работы мастера Create Job Wizard это новое задание появится в папке Jobs окна Enterprise Manager.
Управление заданием

Вы можете управлять вашими заданиями и редактировать их в Enterprise Manager или с помощью T-SQL. И здесь для вас будет проще использовать Enterprise Manager, поскольку вам не нужно заботиться о синтаксисе и значениях по умолчанию, связанных с хранимыми процедурами T-SQL, поскольку графический интерфейс Enterprise Manager помогает вам пройти через всю установку свойств задания.

Использование Enterprise Manager

С помощью Enterprise Manager вы можете вручную запускать, останавливать, деактивизировать, активизировать и редактировать задание, а также создавать для него сценарии T-SQL. Ниже приводятся инструкции для каждой из этих задач.

Использование T-SQL

Вы можете также запускать, останавливать, активизировать, деактивизировать и редактировать задание с помощью следующих хранимых процедур T-SQL. Не забудьте, что при выполнении этих процедур у вас должна использоваться база данных msdb.

Дополнительная информация. Для просмотра синтаксиса этих процедур и параметров, которые используются при их вызове, найдите нужную хранимую процедуру в индексе Books Online.
Просмотр журнала выполнения задания

SQL Server поддерживает журнал (историю) с информацией о выполнении задания в таблице sysjobhistory системной базы данных msdb. Вы можете просмотреть информацию журнала выполнения задания с помощью Enterprise Manager или T-SQL.

Использование Enterprise Manager

Для просмотра журнала задания с помощью Enterprise Manager выполните следующие шаги.

  1. Щелкните правой кнопкой мыши на имени задания в правой панели Enterprise Manager и выберите из контекстного меню пункт View Job History (Просмотр журнала задания), чтобы появилось диалоговое окно Job History (рис. 31.15). Здесь вы увидите строку информации, описывающую каждое выполнение этого задания, любых операторов, получивших уведомления, а также ошибки или сообщения, полученные от SQL Server.

    Диалоговое окно Job History (Журнал заданий)


    Рис. 31.15.  Диалоговое окно Job History (Журнал заданий)

  2. Для просмотра дополнительных подробностей о статусе выполнения задания установите флажок Show step details (Показать подробности по шагам) в верхнем правом углу этого диалогового окна. На рис. 31.16 показаны подробности резервного копирования базы данных MyDB.

    Подробности по шагам, представленные в диалоговом окне Job History


    Рис. 31.16.  Подробности по шагам, представленные в диалоговом окне Job History

  3. Для удаления всех сообщений щелкните на кнопке Clear All (Очистить все). Для обновления экрана, чтобы можно было увидеть статус любых новых заданий, которые были запущены после того, как вы открыли диалоговое окно Job History, щелкните на кнопке Refresh (Обновить). Чтобы закрыть диалоговое окно Job History, щелкните на кнопке Close (Закрыть).
Использование T-SQL

Для просмотра журнала с информацией о выполнении запланированных заданий с помощью T-SQL запустите хранимую процедуру sp_help_jobhistory в базе данных msdb. Эта процедура имеет следующий синтаксис:

sp_help_jobhistory [[@job_id =] job_id]
[, [@job_name =] 'job_name']
[, [@step_id =] step_id]
[, [@sql_message_id =] sql_message_id]
[, [@sql_severity =] sql_severity]
[, [@start_run_date =] start_run_date]
[, [@end_run_date =] end_run_date]
[, [@start_run_time =] start_run_time]
[, [@end_run_time =] end_run_time]
[, [@minimum_run_duration =] minimum_run_duration]
[, [@run_status =] run_status]
[, [@minimum_retries =] minimum_retries]
[, [@oldest_first =] oldest_first]
[, [@server =] 'server']
[, [@mode =] 'mode']

Если запустить эту процедуру без параметров или без параметра job id (Идентификатор задания) или job name (Имя задания), то будет возвращена информация обо всех запланированных заданиях. Параметр mode (режим) указывает, нужно ли возвращать всю информацию журнала задания ( FULL ) или только сводку ( SUMMARY ). Значение по умолчанию – SUMMARY.

Дополнительная информация. Для получения подробной информации обо всех других параметрах этой хранимой процедуры найдите "sp_help_jobhistory" в индексе Books Online.

Оповещения

Оповещение – это действие, которое возникает на сервере в ответ на событие или состояние производительности. Оповещения могут реализоваться как уведомления операторам, могут инициировать запуск указанных заданий и могут перенаправлять события другому серверу. Событие – это ошибка или сообщение, которые записываются в журнал событий приложений Windows NT или Windows 2000 (вы можете просматривать этот журнал с помощью утилиты Event Viewer, поставляемой вместе с Windows NT или Windows 2000). Состояние производительности – это характеристика работы системы, доступная для мониторинга с помощью Performance Monitor (Windows NT) или System Monitor (Windows 2000), такая как процент использования ЦП или количество блокировок, используемых SQL Server. В этой лекции мы будем рассматривать System Monitor в Windows 2000, хотя Performance Monitor в Windows NT действует почти так же.

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

Запуск оповещения для определенного состояния производительности происходит в том случае, если указанный объект SQL Server в System Monitor достигает определенного порогового значения производительности, например, счетчик User Connections (Количество пользовательских соединений) внутри объекта General Statistics (Общая статистика) в System Monitor. Например, вы можете указать запуск оповещения, если значение этого счетчика достигнет 50. (О работе System Monitor описывается см. лекцию 36.)

Примечание. Для запуска оповещений требуется, чтобы работала служба SQLServerAgent.
Протоколирование сообщений в журнале событий

Прежде чем перейти к созданию оповещения для какого-либо события, мы рассмотрим типы событий, которые приводят к передаче сообщений в журнал событий приложений Windows NT или Windows 2000; только эти события можно использовать для создания оповещений. События (или ошибки) с уровнем серьезности (severity level) от 19 до 25 автоматически передаются в журнал событий приложений Windows NT или Windows 2000 и поэтому могут использоваться для запуска оповещений. По умолчанию события с уровнем серьезности меньше 19 не протоколируются в журнале, и поэтому эти события не могут использоваться для запуска оповещений. Чтобы эти события протоколировались в журнале, вы должны использовать sp_altermessage, оператор RAISERROR WITH LOG или xp_logevent, позволяющие изменить статус протоколирования события или сообщения. В данном разделе вы узнаете, как создавать определенное пользователем сообщение о событии и как изменять это сообщение, чтобы обеспечить его запись в журнал событий приложений.

Примечание. Если сообщение SQL Server протоколируется в журнале событий приложений Windows NT или Windows 2000, то оно также протоколируется в журнале SQL Server. Для просмотра журнала SQL Server в Enterprise Manager раскройте папку Management для вашего сервера и раскройте папку SQL Server Logs.
Создание определенного пользователем сообщения о событии

Вся информация для системных и определенных пользователем сообщений сохраняется в таблице sysmessages базы данных master. Чтобы создать определенное пользователем сообщение, используйте системную хранимую процедуру T-SQL sp_addmessage. Она имеет следующий синтаксис:

sp_addmessage [@msg_num =] msg_id,
[@severity=] severity,  
[@msg_text=] 'msg_text' 
[,[@lang =] 'language'] 
[,[@with_log=] 'with_log'] 
[,[@replace =] 'replace']

Определенное пользователем сообщение должно иметь значение идентификатора сообщения ( msg_id ) 50001 или больше. Параметр severity – это уровень серьезности ошибки, на который ссылается сообщение, в диапазоне от 1 до 25, причем более высокие значения означают более высокий уровень серьезности ошибки. Уровни серьезности от 19 до 25 может задавать только системный администратор. Параметр msg_text – это текст сообщения об ошибке, который появится в журнале событий приложений при возникновении данной ошибки. Параметр language указывает, на каком языке будет написано сообщение, поскольку вместе с SQL Server может быть инсталлировано несколько языков. Параметр with_log (с журналом) может иметь значение TRUE или FALSE, указывая, будет ли данное сообщение всегда протоколироваться в журнале событий приложений Windows NT или Windows 2000. Значение по умолчанию – FALSE. Оператор RAISERROR WITH LOG (описывается в следующем разделе) изменяет это значение, если оно равно FALSE. Параметр replace (заменять) указывает, что данное сообщение должно заменять существующее сообщение, имеющее тот же номер идентификатора ( msg_id ).

Владельцы роли public имеют полномочия выполнения процедуры sp_addmessage, но чтобы создать сообщение с уровнем серьезности больше 18 или задать значение TRUE для параметра with_log, вы должны быть владельцем роли sysadmin.

Рассмотрим пример использования sp_addmessage. Следующий оператор создает новое сообщение, которое будет всегда протоколироваться в журнале событий (поскольку для параметра with_log задано значение TRUE ):

sp_addmessage 50001, 16, "Customer ID is out of range.", @with_log = "TRUE"
GO
Изменение параметров протоколирования сообщения о событии

Предположим, что существующее сообщение, или сообщение, которое вы только что создали, не позволяет протоколировать его в журнале (или вы не включили параметр with_log ), как в следующем примере:

sp_addmessage 50001, 16, "Customer ID is out of range.", @with_log = "FALSE"
GO

Если в дальнейшем вам потребуется протоколировать это сообщение в журнале, вы должны изменить его статус протоколирования. Для этого используйте процедуру sp_altermessage, чтобы всегда происходило протоколирование в журнале, как в следующем примере:

sp_altermessage 50001, WITH_LOG, "TRUE" 
GO

В качестве альтернативного средства вы можете использовать оператор RAISERROR с параметром WITH LOG, чтобы возвращать данное сообщение в ваше приложение, а также в журнал событий приложений и в журнал SQL Server. Например, следующий оператор отправляет в вашу программу сообщение 50001 с уровнем серьезности 16 и значением параметра состояния (state) 1, где state – это числовое значение, которое можно использовать для отслеживания, если сообщение передается более чем в одно местоположение:

RAISERROR (50001, 16, 1) WITH LOG
GO
Дополнительная информация.Для получения более подробной информации об использовании RAISERROR найдите "RAISERROR" в индексе Books Online и выберите "Using RAISERROR" в диалоговом окне Topics Found.

Чтобы изменить статус протоколирования сообщения вы можете также использовать расширенную хранимую процедуру xp_logevent, которая находится в базе данных master. При использовании этой процедуры сообщение передается в журнал событий и в журнал SQL Server, но не в клиентское приложение. Ниже приводится пример использования этой процедуры:

USE master
GO
xp_logevent 50002, "Customer ID out of range", warning 
GO

Первые два параметра являются обязательными: это идентификационный номер определенного пользователем сообщения (который, как уже говорилось, должен быть больше 50000) и текст сообщения, которое будет передаваться в эти журналы. Третий параметр (уровень серьезности) не является обязательным. Он может быть представлен одной из трех текстовых строк: informational (информационное), warning (предупреждение) или error (ошибка). Значение уровня серьезности определяет, какой тип значка появится рядом с сообщением в окне Event Viewer, чтобы вы могли легко отличать предупреждения от ошибок. Для Windows 2000 информационное сообщение снабжено синим значком "i", предупреждение – желтым значком "!" и ошибка – красным значком "X". Если уровень серьезности не задан, то по умолчанию используется значение informational.

Создание оповещения

Теперь мы готовы создать оповещение по событию и по состоянию производительности. Для создания оповещения вы можете использовать Enterprise Manager, T-SQL или SQL-DMO. И здесь мы будем рассматривать только методы использования Enterprise Manager и T-SQL, поскольку SQL-DMO выходит за рамки материала этой книги.

Использование Enterprise Manager для создания оповещения по событию

В этом примере мы создадим оповещение по системному сообщению, которое уже имеет уровень серьезности 24. Это сообщение будет протоколироваться по умолчанию в журнале событий без какого-либо вмешательства пользователя, необходимого для изменения его статуса протоколирования. Чтобы создать оповещение по событию, выполните следующие шаги.

  1. В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management (Управление) и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Alerts (Оповещения) и выберите из контекстного меню пункт New Alert (Создать оповещение). Появится окно New Alert Properties (Свойства нового оповещения) (рис. 31.17). Во вкладке General введите имя оповещения, которое может содержать до 128 символов. Для данного примера введите IO_error_alert. Флажок Enabled (Активизировано) позволяет вам активизировать или деактивизировать это оповещение. Деактивизация оповещения означает, что оно не будет запускаться (аналогично деактивизации задания). Для данного примера проследите за тем, чтобы оповещение было активизировано. В раскрывающемся списке Type (Тип) выберите SQL Server event alert (Оповещение по событию), поскольку нам нужно создать оповещение, которое будет запускаться при возникновении определенного события. (Другой тип оповещения – SQL Server performance condition alert (Оповещение по состоянию производительности); пример этого типа события будет показан далее.) Для нашего примера мы создадим оповещение, которое будет запускаться при возникновении ошибки ввода-вывода.

    Вкладка General окна New Alert Properties


    Рис. 31.17.  Вкладка General окна New Alert Properties

  2. В секции Event alert definition (Определение оповещения по событию) окна New Alert Properties нужно задать событие, по которому будет запускаться данное оповещение, щелкнув на кнопке выбора Error number (Номер ошибки) или Severity (Уровень серьезности) и указав затем номер ошибки или уровень серьезности. Если задан уровень серьезности, то данное оповещение будет запускаться по всем ошибкам с этим уровнем серьезности. Для данного примера щелкните на кнопке выбора Error Number и затем щелкните на кнопке обзора Browse (...), чтобы выполнить поиск номера. Появится диалоговое окно Manage SQL Server Messages (Управление сообщениями SQL Server) (рис. 31.18).
  3. Для поиска определенной ошибки, нужно выбрать соответствующую категорию в окне списка Severity вкладки Search (Поиск) и щелкнуть на кнопке Find (Найти). Найденные ошибки будут представлены в списке вкладки Messages (Сообщения). Два флажка внизу вкладки Search можно использовать для ограничения поиска. Флажок Only include logged messages (Включать только протоколируемые в журнале сообщения) позволяет выполнять поиск только тех сообщений, которые автоматически протоколируются в журнале событий. Флажок Only include user-defined messages (Включать только определенные пользователем сообщения) ограничивает поиск только теми сообщениями, которые определены пользователями. Для нашего примера мы хотим найти все фатальные ошибки оборудования, поэтому выделите в окне списка Severity ошибку 024 – Fatal Error: Hardware Error (Фатальная ошибка: Ошибка оборудования) и затем щелкните на кнопке Find. Во вкладке Messages (рис. 31.19), появится ошибка с номером 823 (и уровнем серьезности 24).

    Вкладка Search (Поиск) диалогового окна Manage SQL Server Messages


    Рис. 31.18.  Вкладка Search (Поиск) диалогового окна Manage SQL Server Messages

    Вкладка Messages (Сообщения) диалогового окна Manage SQL Server Messages


    Рис. 31.19.  Вкладка Messages (Сообщения) диалогового окна Manage SQL Server Messages

  4. Щелкните на кнопке OK, чтобы подтвердить выбор этого сообщения и вернуться во вкладку General окна New Alert Properties. В раскрывающемся списке Database Name (Имя базы данных) вы можете задать, что оповещение будет запускаться, только если данное событие возникло в указанной базе данных. Оставьте значение по умолчанию All Databases (Все базы данных). В текстовом поле Error message contains this text (Сообщение об ошибке содержит следующий текст) вы можете ввести строку символов (до 100 символов), которая ограничивает круг ошибок, по которым будет запускаться данное оповещение, только теми ошибками, текст которых содержит данную строку. Если оставить это поле пустым, то никакого ограничения не применяется.
  5. Щелкните на вкладке Response (Отклик) (рис. 31.20). В этой вкладке вы можете указать действие, которое следует предпринять, если возникнет это оповещение. Установите флажок Execute job (Выполнить задание) и выберите в раскрывающемся списке имя задания, которое будет выполнено в случае этого оповещения. Щелчок на кнопке New Operator (Создать оператора) позволяет вам создать нового оператора, который будет получать уведомление. В списке Operators to notify (Операторы для уведомления) будут представлены существующие операторы. Вы можете задать, нужно ли уведомлять оператора по электронной почте (колонка E-mail), через пейджер (pager), с помощью NET SEND или с помощью комбинации этих методов.

    Вкладка Response (Отклик) окна New Alert Properties


    Рис. 31.20.  Вкладка Response (Отклик) окна New Alert Properties

    Если вы указываете какого-либо оператора для уведомления по электронной почте, а также устанавливаете флажок Include alert error text in E-mail (Включить текст ошибки оповещения в электронную почту), то текст ошибки будет отправлен оператору в сообщении оповещения. Чтобы включить в сообщение электронной почты дополнительный текст, введите его в текстовом поле Additional notification message to send (Дополнительное сообщение уведомления для отправки) внизу этой вкладки. В этом поле можно ввести до 512 символов. На рис. 31.20 показан оператор TestOperator, выбранный для уведомления по электронной почте. Включено также дополнительное сообщение.

    Отметим также поля-счетчики Delay between responses (Задержки между откликами). Они указывают, насколько часто будет извещаться оператор при повторных случаях этого оповещения. Значение 60 минут означает, что уведомление оператору будет отправляться только один раз в течение любого 60-минутного периода.

  6. Для подтверждения введенных вами параметров оповещения и отклика щелкните на кнопке Apply. Затем щелкните на кнопке OK, чтобы закрыть это окно.
Использование Enterprise Manager для создания оповещения по состоянию производительности

Теперь мы используем Enterprise Manager для создания оповещения, которое будет запускаться при возникновении определенного состояния производительности. Отметим, что служба SQLServerAgent опрашивает счетчики производительности с 20-секундными интервалами, поэтому кратковременные пиковые или низкие нагрузки, возникающие между опросами, возможно, не будут обнаруживаться. Чтобы создать оповещение, выполните следующие шаги.

  1. В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Alerts и выберите из контекстного меню пункт New Alert. Появится окно New Alert Properties (рис. 31.21). Во вкладке General в текстовом поле Name введите имя оповещения. (Для данного примера используйте user_alert.) Флажок Enabled (Активизировано) позволяет вам активизировать или деактивизировать это оповещение. Чтобы задать оповещение по состоянию производительности, выберите в раскрывающемся списке Type вариант SQL Server performance condition alert.

    Вкладка General окна New Alert Properties


    Рис. 31.21.  Вкладка General окна New Alert Properties

  2. В секции Performance condition alert definition (Определение оповещения по состоянию производительности) нужно определить состояние производительности, по которому будет запускаться это оповещение. Выберите в раскрывающемся списке Object (Объект) объект производительности SQL Server, который хотите использовать для запуска оповещения, и затем выберите в раскрывающемся списке Counter (Счетчик) нужный счетчик. Используйте поле Alert if counter (Оповещение в случае, если счетчик), чтобы указать, в какой ситуации должно запускаться оповещение. И, наконец, задайте пороговое значение (поле Value), переход которого будет приводить к запуску этого оповещения. На рис. 31.21 показаны параметры, используемые для запуска оповещения, когда счетчик SQL Server User Connections превышает значение 100.
  3. Чтобы завершить создание этого оповещения, задайте параметры на вкладке Response, как это описано на шаге 5 предыдущего раздела, щелкните на кнопке Apply и затем щелкните на кнопке OK.
Использование T-SQL для создания оповещения по событию или по состоянию производительности

Вы можете также использовать для создания оповещений T-SQL, но не забывайте, что если вы создаете оповещения с помощью Enterprise Manager, то можете затем генерировать для этих оповещений сценарии T-SQL. (Для этого щелкните правой кнопкой мыши на Alerts в папке SQL Server Agent, укажите в контекстном меню пункт All Tasks и затем выберите оператор Generate SQL Script.) Вероятно, использование Enterprise Manager вам покажется более легким для создания оповещений, поскольку для метода T-SQL требуется знать и помнить много необязательных параметров вместе с их значениями по умолчанию. Чтобы добавить оповещение с помощью T-SQL, нужно использовать хранимую процедуру sp_add_alert. Эта процедура используется для создания оповещений как по событию, так и по состоянию производительности. Тип создаваемого оповещения указывается соответствующим параметром. Процедура sp_add_alert имеет следующий синтаксис:

sp_add_alert [@name =] 'name' 
[, [@message_id =] message_id] 
[, [@severity =] severity] 
[, [@enabled =] enabled]
[, [@delay_between_responses =] delay_between_responses] 
[, [@notification_message =] 'notification_message']
[, [@include_event_description_in =] include_event_description_in] 
[, [@database_name =] 'database']
[, [@event_description_keyword =] 'event_description_keyword_pattern'] 
[, {[@job_id =] job_id | [@job_name =] 'job_name'}]
[, [@raise_snmp_trap =] raise_snmp_trap] 
[, [@performance_condition =] 'performance_condition'] 
[, [@category_name =] 'category']

Для модификации оповещения, просмотра информации оповещения и удаления оповещения используются соответственно хранимые процедуры sp_update_alert, sp_help_alert и sp_delete_alert. Напомним, что все эти хранимые процедуры находятся в базе данных msdb.

Дополнительная информация. Для получения более подробной информации о процедурах, описанных в этом разделе, найдите эти процедуры в индексе Books Online.

Операторы

Операторы – это отдельные люди, которые могут получать уведомление от SQL Server по завершении какого-либо задания или при возникновении какого-либо события. Оператор – это человек, ответственный за обслуживание одной или нескольких систем, на которых работает SQL Server. Вы уже знаете, как определять сообщение уведомления, которое будет отправляться оператору. Как уже говорилось, имеется три метода, используемых для связи с операторами: отправка сообщений электронной почты, отправка на пейджер и использование команды NET SEND (которая отправляет сетевое сообщение на компьютер оператора.) Чтобы можно было применять каждый из этих методов, ваша система должна отвечать определенным требованиям. Для связи через электронную почту и с пейджером вы должны инсталлировать на сервере совместимый с MAPI-1 клиент ("MAPI" означает "Messaging API" – интерфейс прикладного программирования для сообщений), такой как Microsoft Outlook или Microsoft Exchange Client, и должны создать почтовый профиль для службы SQLServerAgent. Для пейджинговой связи вам нужно также инсталлировать на почтовом сервере программное обеспечение сторонних фирм для связи электронной почты с пейджером, которое обрабатывает входные сообщения электронной почты и преобразует их в пейджинговые сообщения. Чтобы использовать NET SEND, у вас должна работать операционная система Windows NT или Windows 2000, поскольку NET SEND не поддерживается в Microsoft Windows 95/98.

Дополнительная информация. Информацию по созданию почтовых профилей см. в документации своего клиентского программного обеспечения для электронной почты. Для получения информации по программному обеспечению для связи пейджер-электронная почта обратитесь к своему провайдеру пейджинговых услуг или к документации вашего пейджера.

Вы должны определить каждого оператора в SQL Server. Вы можете создать несколько операторов для разделения между ними обязанностей, а также резервного оператора, который получит уведомление, когда недоступны другие операторы (например, когда не проходит сообщение на пейджер). Вы можете создать оператора с помощью Enterprise Manager, T-SQL или SQL-DMO. Мы рассмотрим в этом разделе использование Enterprise Manager и T-SQL; метод SQL-DMO выходит за рамки материала этой книги.

Использование Enterprise Manager для создания оператора

Чтобы создать оператора с помощью Enterprise Manager, выполните следующие шаги.

  1. В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Operators и выберите из контекстного меню пункт New Operator, чтобы появилось окно New Operator Properties (Свойства нового оператора) (рис. 31.22). Во вкладке General введите имя нового оператора и затем заполните все или некоторые из следующих данных: адрес электронной почты этого оператора, адрес пейджера и адрес для команды NET SEND.

    Вкладка General окна New Operator Properties (Свойства нового оператора)


    Рис. 31.22.  Вкладка General окна New Operator Properties (Свойства нового оператора)

    Если вы ввели адрес пейджера, то можете задать в секции Pager on duty schedule (Расписание дежурства на пейджере) дни и периоды времени, когда можно отправлять сообщения этому оператору. Например, если у вас несколько операторов, то вы можете разделять между ними время работы, когда один оператор получает сообщения на пейджер в понедельник, среду и пятницу, а второй – во вторник, четверг и субботу.
  2. Щелкните на вкладке Notifications. Если щелкнуть на кнопке выбора Alerts (в верхнем правом углу), то появится список существующих оповещений (рис. 31.23). Устанавливая флажки в соответствующих колонках, вы можете задавать, по каким оповещениям нужно уведомлять этого оператора и какой метод связи будет для этого использоваться.

     Вкладка Notifications окна New Operator Properties со списком оповещений


    Рис. 31.23.  Вкладка Notifications окна New Operator Properties со списком оповещений

  3. При создании нового оператора кнопка выбора Jobs для вас недоступна, так как нет таких заданий, которые бы уведомляли нового оператора, поскольку новый оператор еще не создан. Чтобы новый оператор не получал уведомлений, сбросьте флажок Operator is available to receive notifications (Оператор доступен для получения уведомлений). Отключение этой возможности позволяет вам временно приостанавливать отправку уведомлений оператору, например, когда данный оператор в отпуске. Вы можете затем снова активизировать отправку уведомлений, повторно установив этот флажок, когда оператор вернется к работе.
  4. Щелкните на кнопке Send E-mail (Отправить электронную почту), чтобы создать тестовое сообщение для отправки оператору, представленному во вкладке General. (Вы получите сообщение об ошибке, если не указали адрес электронной почты во вкладке General.) Затем вы можете отправить сообщение электронной почты, в котором описываются типы уведомлений, заданные для этого оператора. Внизу вкладки Notifications вы увидите информацию о последних попытках уведомлений этому оператору по типам используемых средств отправки.
Использование T-SQL для создания оператора

Команды T-SQL, используемые для создания оператора, модифицирования информации об операторе, просмотра информации об операторе и удаления оператора, – это соответствующие хранимые процедуры, находящиеся в базе данных msdb: sp_add_operator, sp_update_operator, sp_help_operator и sp_delete_operator. И здесь вы увидите, что вам легче использовать Enterprise Manager. Вы можете генерировать сценарии T-SQL после того, как создали оператора с помощью Enterprise Manager:

Ниже представлен синтаксис sp_add_operator:

sp_add_operator [@name =] 'name' 
[, [@enabled =] enabled] 
[, [@email_address =] 'email_address'] 
[, [@pager_address =] 'pager_address'] 
[, [@weekday_pager_start_time =] weekday_pager_start_time] 
[, [@weekday_pager_end_time =] weekday_pager_end_time] 
[, [@saturday_pager_start_time =] saturday_pager_start_time] 
[, [@saturday_pager_end_time =] saturday_pager_end_time] 
[, [@sunday_pager_start_time =] sunday_pager_start_time] 
[, [@sunday_pager_end_time =] sunday_pager_end_time] 
[, [@pager_days =] pager_days] 
[, [@netsend_address =] 'netsend_address'] 
[, [@category_name =] 'category']
Дополнительная информация. Чтобы получить подробное описание параметров хранимых процедур, перечисленных в этом разделе, найдите имя соответствующей хранимой процедуры в индексе Books Online.

Журнал ошибок службы SQLServerAgent

Служба SQLServerAgent имеет собственный журнал ошибок, в который записываются запуск и отключение SQLServerAgent и любые предупреждения, ошибки и информационные сообщения, связанные с заданием или оповещением SQLServerAgent. Чтобы использовать журнал ошибок SQLServerAgent, выполните следующие шаги.

  1. В Enterprise Manager раскройте папку сервера и раскройте папку Management. Щелкните правой кнопкой мыши на SQL Server Agent и выберите из контекстного меню пункт Display Error Log (Показать журнал ошибок). Появится журнал ошибок (рис. 31.24).

     Диалоговое окно SQL Server Agent Error Log


    Рис. 31.24.  Диалоговое окно SQL Server Agent Error Log

  2. В раскрывающемся списке Type (Тип) вы может выбирать просмотр сообщений об ошибках, предупреждающих сообщений, информационных сообщений или все трех типов (All Types). На рис. 31.25 показано, как выглядит журнал ошибок непосредственно после запуска службы SQLServerAgent. (Отметим, что в раскрывающемся списке Type выбран вариант All Types.)

    Диалоговое окно SQL Server Agent Error Log, где показаны все типы сообщений


    Рис. 31.25.  Диалоговое окно SQL Server Agent Error Log, где показаны все типы сообщений

  3. Каждый раз, как вы запускаете SQLServerAgent, происходит повторный запуск журнала ошибок с перезаписью всех существующих сообщений этого журнала. Вы можете искать сообщение, содержащее определенную строку, набрав эту строку в текстовом поле Containing Text (Содержит текст) и нажав затем клавишу Enter или щелкнув на кнопке Apply Filter (Применить фильтр). На рис. 31.26 показан журнал ошибок после поиска строки "CPU".

    Результаты поиска определенной строки в сообщениях журнала ошибок


    Рис. 31.26.  Результаты поиска определенной строки в сообщениях журнала ошибок

  4. Дважды щелкните на самом сообщении, чтобы появилось диалоговое окно SQL Server Agent Error Log Message (Сообщение журнала ошибок SQL Server Agent) (рис. 31.27). Если в результате поиска будет показано несколько сообщений, то вы можете использовать для перехода между сообщениями кнопки Next (Следующее) и Previous (Предыдущее). Эти кнопки недоступны, если найдено только одно сообщение.

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

    Диалоговое окно SQL Server Agent Error Log Message


    Рис. 31.27.  Диалоговое окно SQL Server Agent Error Log Message

Заключение

В этой лекции вы узнали, как использовать службу SQLServerAgent для автоматизации некоторых административных задач путем определения заданий и операторов, создания уведомлений для операторов, а также создания оповещений по событиям и состояниям производительности. Вы узнали о том, насколько важно использовать уровни серьезности ошибок при создании оповещений и как изменять статус протоколирования сообщения об ошибке, чтобы оно записывалось в журнал событий Windows NT или Windows 2000. И вы узнали, как просматривать файл журнала ошибок службы SQLServerAgent, в который записывается информация о SQLServerAgent, а также любые сообщения об ошибках и предупреждения, возникшие во время оповещений и заданий. В лекции 32 мы рассмотрим резервное копирование баз данных SQL Server.

Лекция 32. Резервное копирование Microsoft SQL Server

Резервное копирование – важнейшая задача системного администратора баз данных. Резервное копирование и восстановление – две неразрывно связанные задачи. Лекция научит вас грамотно составлять планы резервного копирования, правильно определять интервал времени, через который нужно производить резервное копирование, познакомит с видами отказов системы, зная которые вы сможете заранее предугадывать поведение аппаратного и программного обеспечений и заблаговременно быть готовым к отказам. Журнальное протоколирование – важный этап на пути понимания сочетания операций резервного копирования и восстановления с воспроизведением базы данных. Одним из наиболее важных параметров, помогающих в управлении этими процессами, является создание расписаний резервного копирования. Обо всем этом и многом другом вы узнаете, прочитав данный материал.

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

В силу особой важности тем резервного копирования, восстановления и воспроизведения базы данных им посвящены две лекции. В этой лекции вы узнаете о журнале транзакций Microsoft SQL Server и различных методах резервного копирования базы данных. В лекции 33 вы узнаете, как восстанавливать базу данных из резервной копии, как действует процесс воспроизведения SQL Server и как создавать и реализовать план восстановления после аварии.

Терминология резервного копирования

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

Резервное копирование и восстановление

Операции резервного копирования (backup) и восстановления (restore) связаны друг с другом и предполагают сохранение информации базы данных для использования в будущем – аналогично операциям резервного копирования и восстановления, которые могут выполняться операционной системой. При резервном копировании данные копируются из базы данных и сохраняются в другом месте. Резервное копирование операционной системы и резервное копирование базы данных отличаются в том, что в первом случае происходит сохранение отдельных файлов, а во втором – сохранение всей базы данных. Обычно база данных совместно используется многими пользователями, в то время как многие файлы операционной системы принадлежат отдельным пользователям. Тем самым при резервном копировании базы данных создается резервная копия данных сразу всех пользователей. Поскольку SQL Server предназначен для максимально возможной непрерывной эксплуатации, процесс резервного копирования может выполняться во время работы базы данных и даже в то время, как пользователи осуществляют доступ к базе данных.

При восстановлении данных из резервной копии они копируются назад в базу данных. Не путайте восстановление (restore) с воспроизведением (регенерацией) (recovery): это две различные операции.

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

В отличие от процесса резервного копирования процесс восстановления не может выполняться во время работы SQL Server. Кроме того, таблицу нельзя восстановить отдельно. Если один пользователь теряет часть данных в базе данных, потерянные данные восстановить непросто, поскольку операция восстановления восстанавливает всю базу данных или какую-то ее часть. Выделение данных отдельного пользователя из всех данных базы данных может оказаться затруднительным.

Воспроизведение

Воспроизведение (регенерация) (recovery) – это способность системы управления реляционной базой данных (СУРБД – RDBMS) уцелеть после аварии системы и воспроизвести выполненные транзакции. SQL Server не выполняет запись на диск после каждого изменения, вносимого в базу данных. Если бы это было так, то большая система (например, банковская) работала бы намного медленнее, поскольку в каждой транзакции приходилось бы ждать, пока не закончится очередная запись, создающая задержку в системе.

Именно задержки при записи изменений на диск приводят к тому, что база данных после отказа системы может остаться в запорченном состоянии из-за того, что некоторые изменения, внесенные в базу данных, могли быть не записаны на диск, а изменения, записанные на диск, могли быть не зафиксированы. Для поддержки целостности базы данных SQL Server протоколирует все изменения в журнале транзакций. (Журнал транзакций подробно описывается в разделе "Журнал транзакций" ниже в этой лекции.) При запуске SQL Server после отказа системы журнал транзакций используется для повторного исполнения (воспроизведения) транзакций, которые были фиксированы, но не записаны на диск, и отката (отмены результатов) транзакций, которые не были фиксированы на момент аварии системы. Такой подход гарантирует точность данных.

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

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

Примечание. Поскольку журнал транзакций является определяющим компонентом для воспроизведения транзакций в случае аварии, он должен всегда располагаться на томе RAID 1 (зеркальном томе). (О RAID [дисковые матрицы] см. лекцию 5.)

В случае отказа системы, после которого требуется восстановление базы данных из файлов резервной копии (например, в случае потери диска), используются журнал транзакций и резервные копии журнала транзакций – для восстановления базы данных к состоянию, в котором она находилась на момент отказа. Таким образом, операции восстановления и воспроизведения обычно используются совместно друг с другом. В случае отказа источника питания, возможно, потребуется только воспроизведение.

Примечание. Транзакция, откат которой выполняет SQL Server, идентична транзакции, которая заканчивается командой ROLLBACK. Эта транзакция аннулируется, и все соответствующие данные восстанавливаются к их исходному состоянию.

При повторном исполнении транзакции происходит воспроизведение изменений, внесенных в базу данных, но не записанных на диск, чтобы вернуть файлы данных к состоянию, в котором они находились на момент отказа. Иными словами, повторное исполнение фиксированных транзакций приводит базу данных к состоянию, в котором она находилась на момент отказа (за вычетом всех нефиксированных транзакций).

Отказы системы

У вас могут возникнуть сомнения в необходимости резервного копирования, если вы используете такие технологии, как службы кластеризации Microsoft Cluster Services и отказоустойчивые дисковые подсистемы RAID. Тем не менее резервное копирование необходимо. Возможны различные случаи отказов вашей системы, а упомянутые системы поддержки отказоустойчивости и восстановления в случае отказов позволяют продолжить нормальную работу вашей системы не для всех случаев отказов. В этом разделе мы рассмотрим некоторые из потенциальных причин отказов и способы восстановления после этих отказов.

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

Отказы оборудования

Отказы оборудования – это, видимо, наиболее распространенный тип отказов, с которыми вы будете сталкиваться. Хотя эти отказы возникают менее часто по мере роста надежности компьютерного оборудования, но компоненты компьютеров все равно со временем становятся подвержены износу. Вот следующие типичные отказы оборудования.

Отказы программного обеспечения

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

Примечание. Компании часто проводят опробование бета-версий SQL Server. Бета-версии программного обеспечения предназначены только для оценки и тестирования и не должны использоваться в условиях промышленной эксплуатации. Иногда бета-версии содержат ошибки и средства, которые не были проверены в полной мере. Вам следует использовать эксплуатационную версию Microsoft SQL Server 2000, прошедшую полное тестирование и готовую к промышленной эксплуатации.
Человеческие ошибки

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

Журнальное протоколирование в SQL Server

Чтобы понять, как сочетаются операции резервного копирования и восстановления с воспроизведением базы данных, вам нужно сначала узнать, как происходит журнальное протоколирование в SQL Server. В этом разделе дается обзор возможностей журнального протоколирования и создания контрольных точек в SQL Server, а также описывается резервное копирование журнала транзакций.

Журнал транзакций

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

Примечание. Если какой-либо файл данных поврежден и должен быть восстановлен с резервной копии, то для возврата базы данных к состоянию, в котором она находилась непосредственно перед отказом, необходимо воспроизвести транзакции, выполненные с этим файлом данных. А поскольку журнал транзакций является определяющим компонентом для этого процесса и занимает ограниченное дисковое пространство, то необходимо создавать резервные копии этого журнала. Для воспроизведения базы данных у вас должны быть сохранены все данные журнала транзакций, созданные с момента последнего резервного копирования. Если вас интересует только восстановление с последней резервной копии базы данных, то вы можете не выполнять резервное копирование журнала транзакций, но с помощью текущего журнала транзакций вы не сможете воспроизвести транзакции, выполненные с момента создания резервной копии базы данных.
Поток откладываемой записи (Lazywriter Thread)

Изменения, вносимые в базу данных, сначала вносятся в данные, которые находятся в кэше SQL Server. То, что изменения вносятся сначала в кэш, требуется в первую очередь для повышения производительности, поскольку ожидание при операциях ввода-вывода занимает много времени. Эти изменения записываются в конечном итоге на диск, но этот процесс выполняется в фоновом режиме и не виден пользователю. Поскольку модифицированные страницы хранятся в кэше, то может пройти существенный период времени, прежде чем эти страницы (их еще называют ожидающими, черновыми страницами – dirty pages) будут записаны соответствующим потоком (подпроцессом) SQL Server. Этот поток называют потоком откладываемой записи ("ленивым" потоком Этот поток использует LRU-список записи страниц, где первой в очереди записи на диск находится наиболее давно обрабатывавшаяся страница и последней является только что обрабатывавшаяся страница. Страница, которая постоянно модифицируется (и, тем самым, все время перемещается в конец этого списка), вообще может быть не записана этим потоком на диск. Подобные вещи могут увеличивать время воспроизведения, поскольку для применения изменений к таким данным потребуется прочитать много журнальных записей. Например, в большой системе с объемом RAM-памяти более 1 Гб и большим числом изменений в базе данных воспроизведение может занять несколько часов. – lazywriter thread).

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

Последовательная запись в журнал

Журнал транзакций содержит "историю транзакций", поэтому операции ввода-вывода для журнала транзакций – это в основном операции записи, которые обычно выполняются последовательно. В случае отката транзакций происходит чтение журнала транзакций, что приводит к нарушению последовательного характера операций ввода-вывода. Поскольку откаты происходят довольно редко (так как аварии системы случаются редко и пользователи не слишком часто отменяют транзакции), ввод-вывод для журнала транзакций имеет достаточно устойчивый характер. Вы можете существенно повысить производительность операций ввода-вывода, поместив журнал транзакций на его собственный диск или матрицу RAID (см. лекции 4 и 5). В силу исключительной важности журнала транзакций для воспроизведения базы данных вам следует защитить его с помощью дисковой матрицы RAID.

Размер журнала транзакций

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

Примечание. Вы можете усекать журнал транзакций без его резервного копирования, задав для параметра trunc. log on chkpt (усечение при создании контрольной точки) значение TRUE в используемой базе данных. Но после этого вы не сможете получать резервную копию журнала транзакций. В результате вы лишитесь возможности воспроизведения базы данных и поэтому данная установка не рекомендуется.
Воспроизведение с помощью журнала транзакций

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

Свойства журнала транзакций

Журнал транзакций значительно изменился после версии Microsoft SQL Server 6.5. Журнал транзакций SQL Server 2000 имеет те же характеристики, что и в Microsoft SQL Server 7. Это следующие характеристики.

Непротоколируемые операции

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

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

Ниже в этом разделе мы рассмотрим чуть подробнее операции этого списка.

Чтобы активизировать непротоколируемые массовые операции с определенной базой данных, вы должны задать для работы этой базы данных режим воспроизведения BULK_LOGGED. Кроме этого режима, можно также задавать режимы воспроизведения FULL и SIMPLE. Эти режимы задаются с помощью команды ALTER DATABASE, как это показано здесь для базы данных Northwind:

ALTER DATABASE Northwind
SET RECOVERY BULK_LOGGED

ALTER DATABASE Northwind
SET RECOVERY FULL

ALTER DATABASE Northwind
SET RECOVERY SIMPLE

При использовании режима BULK_LOGGED массовые операции, описанные в следующих разделах (за некоторыми исключениями, которые тоже описываются в следующих разделах), не протоколируются в журнале, а все остальные операции протоколируются. Если выбран режим воспроизведения FULL, то протоколируются все операции. А в случае режима SIMPLE данные можно восстанавливать только из последней резервной копии.

Примечание. Поскольку режим воспроизведения определяет уровень отказоустойчивости вашей системы, режим BULK_LOGGED следует использовать с осторожностью. Используя этот режим, вы повышаете производительность массовых операций, но в случае отказа время воспроизведения возрастает.
SELECT INTO

Оператор SELECT INTO используется для создания новой таблицы в базе данных. Поскольку оператор SELECT INTO нельзя использовать для выборки данных в существующий объект, его можно использовать только для создания данных, но не для обновления данных. Этот процесс создания можно легко повторить; поэтому операции SELECT INTO вполне подходят для выполнения как непротоколируемые операции.

BULK COPY и программа BCP

Чтобы операции BULK COPY и BCP можно было выполнять как непротоколируемые операции, они должны отвечать следующим требованиям.

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

CREATE INDEX

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

Текстовые операции

К текстовым операциям, которые можно выполнять как непротоколируемые операции, относятся WRITETEXT и UPDATETEXT. Чтобы активизировать выполнение этих операций без протоколирования, вам нужно просто использовать описанный выше режим BULK_LOGGED.

Контрольные точки

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

Контрольные точки создаются в результате запуска оператора CHECKPOINT, при отключении SQL Server с помощью оператора SHUTDOWN или с помощью Service Control Manager, а также при автоматическом запуске операции контрольной точки из SQL Server.

Операции контрольной точки

В процессе создания контрольной точки выполняется ряд следующих операций.

Конфигурирование интервала между контрольными точками

Интервал между контрольными точками определяется параметром конфигурирования SQL Server recovery interval. Этот параметр задается для всей системы SQL Server, а не для каждой базы данных, но контрольные точки создаются по отдельным базам данных. Этот параметр указывает, сколько минут потребует SQL Server для воспроизведения каждой базы данных в случае отказа системы. Значение 0 указывает, что интервал будет определять SQL Server (обычно он меньше 1 минуты). Для систем с большим объемом памяти, где выполняется очень много операций вставки и обновления, это принятое по умолчанию значение может приводить к созданию излишнего числа контрольных точек. В этом случае вы можете задать для этого параметра более высокое значение. Если ваши пользователи готовы ждать достаточно долго в случае отказа системы (например, 30 минут), производительность транзакций вашей системы будет выше. Значение этого параметра зависит от допустимости простоев в вашей компании и возможной частоты отказов системы.

Интервал между контрольными точками определяется также количеством записей в журнале транзакций. Он не зависит от системного времени или размера журнала. Чем больше записей в журнале транзакций, тем короче интервал между контрольными точками. Чем больше сделано изменений, тем больше записей будет помещено в журнал транзакций, поэтому SQL Server определит интервал между контрольными точками для более частой записи этих изменений на диск. При малом числе изменений, вносимых в базу данных, журнал транзакций будет содержать лишь несколько записей, и интервал между контрольными точками будет больше.

Вы можете изменять значения параметра recovery interval двумя способами: используя Enterprise Manager или с помощью Transact-SQL (T-SQL). Чтобы задать параметр recovery interval из Enterprise Manager, в левой панели щелкните правой кнопкой мыши на имени сервера, для которого хотите задать этот параметр, и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно SQL Server Properties (Свойства SQL Server). Щелкните на вкладке Database Settings (Параметры базы данных) (рис. 32.1), и задайте нужный вам интервал (в минутах) в поле-счетчике Recovery Interval (Интервал воспроизведения).

Окно SQL Server Properties (Параметры базы данных)


Рис. 32.1.  Окно SQL Server Properties (Параметры базы данных)

Чтобы задать значение recovery interval с помощью T-SQL, используйте хранимую процедуру sp_configure, как это показано ниже:

sp_configure "recovery interval", 1
GO

Вы увидите следующее сообщение:

DBCC execution completed. If DBCC printed error messages,
contact your system administrator. 
Configuration option changed. Run the RECONFIGURE statement  
to install.
(Работа DBCC завершена. Если DBCC вывел сообщения об ошибках,
обратитесь к вашему системному администратору.
Параметр конфигурирования изменен. Для реализации выполните оператор RECONFIGURE.)

Изменение не будет реализовано, если вы не запустите команду RECONFIGURE. Если вы уверены в правильности изменения, введите следующий оператор T-SQL:

RECONFIGURE 
GO

Команда RECONFIGURE указывает SQL Server, что нужно реализовать изменения конфигурации. Чтобы измененное значение параметра recovery interval начало действовать, вам не нужно выполнять перезапуск SQL Server.

Чтобы убедиться, что внесенное вами значение действует, используйте следующий оператор T-SQL:

sp_configure "recovery interval" 
GO

Результаты будут выведены в следующей форме:

name                              	     minimum 	maximum 	config_value 	run_value
------------------------------------------------------------------------------------------------
 recovery interval (min)                	0         32767            1               1

Это показывает, что значение параметра recovery interval действительно было задано.

Внимание. Параметр recovery interval является дополнительным параметром, и вам следует изменять его только после тщательного планирования. Увеличение значения recovery interval приводит к увеличению времени, необходимого для воспроизведения базы данных.

Методы резервного копирования

Существуют различные методы резервного копирования базы данных: полное и разностное резервное копирование, резервное копирование журнала транзакций, группы файлов и файла данных. Каждый из них имеет свои режимы и возможности работы. Полное резервное копирование (full backup) предусматривает резервное копирование всех данных базы данных, группы файлов или файла данных. Разностное резервное копирование (differential backup) предусматривает резервное копирование только тех данных, которые изменились с момента последнего резервного копирования. Резервное копирование журнала транзакций используется для резервного копирования и усечения журнала транзакций. (Как уже говорилось, резервное копирование журнала транзакций является определяющей задачей для DBA, поскольку данные журнала транзакций используются в сочетании с резервными копиями базы данных.) Резервное копирование групп файлов и файла данных используется для создания резервной копии определенной группы файлов или файла данных в базе данных.

Все виды резервного копирования в SQL Server выполняются для определенной базы данных. Для полного резервного копирования вашей системы вы должны создать резервные копии всех баз данных вашей системы, а также их журналов транзакций. Не забывайте также выполнять резервное копирование базы данных master. И помните, что без хороших резервных копий вам, возможно, не удастся восстановить свои данные в случае отказа системы.

Полное резервное копирование

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

Разностное резервное копирование

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

Резервное копирование журнала транзакций

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

Резервное копирование группы файлов

Резервное копирование группы файлов предусматривает резервное копирование всех файлов данных, связанных с отдельным файлом в базе данных. Этот процесс похож на полное резервное копирование, поскольку копируются все данные файлов данных независимо от времени создания последней резервной копии этих файлов. Вы можете использовать этот тип резервного копирования для группы файлов, связанной с определенным отделом или рабочей группой, – в зависимости от конфигурации вашей системы. Если ваша система разбита на отделы, которые имеют доступ к своим группам файлов, то вы можете выполнять резервное копирование данных каждого отдела по различным расписаниям.

Резервное копирование файла данных

Резервное копирование файла данных позволяет вам получать резервную копию отдельного файла из группы файлов. Этот тип резервного копирования действует в сочетании с возможностью восстановления отдельного файла данных в SQL Server. Резервное копирование файла данных может оказаться полезным, если у вас недостаточно времени для ежесуточного резервного копирования всей группы файлов, поскольку вы можете использовать ротацию копируемых файлов данных. В случае отказа диска, сопряженного с потерей или порчей файла данных, вы сможете восстановить только этот файл данных. И чем больше период времени, прошедший с момента резервного копирования этого файла данных, тем больше времени займет процесс восстановления.

Выполнение резервного копирования

Вы можете выполнять резервное копирование с помощью Enterprise Manager, команд T-SQL или мастера создания резервной копии базы данных Create Database Backup Wizard. Во многих случаях проще всего использовать Create Database Backup Wizard, но Enterprise Manager также несложно использовать. С другой стороны, команды T-SQL можно помещать в сценарии SQL, которые можно многократно повторять. Вам следует использовать метод, наиболее отвечающий вашим требованиям.

Сами операции резервного копирования можно направлять на физическое устройство или логическое устройство. Физическое устройство – это компонент оборудования, такой как ленточное или дисковое устройство. Операционная система присваивает физическим устройствам имена, и для доступа к этим устройствам вы должны использовать эти имена. Поскольку эти заранее назначенные имена бывает трудно запомнить, вам может потребоваться создание для физического устройства алиаса (определенного пользователем альтернативного имени). Такой алиас называют логическим устройством. Это логическое устройство существует только в рамках SQL Server, и его можно использовать только для резервного копирования в SQL Server, чтобы ссылаться на него как на логическое устройство резервного копирования.Если вы хотите выполнять резервное копирование данных на логическое устройство, то должны создать это устройство заранее. Прежде чем перейти к методам выполнения резервного копирования, мы рассмотрим, как создается логическое устройство резервного копирования. Мы будем использовать для примеров этого раздела логическое устройство резервного копирования. (Для получения сведений о добавлении к системе физических устройств обратитесь к вашему системному администратору.)

Создание логических устройств резервного копирования

Вы можете создавать логические устройства резервного копирования, используя Enterprise Manager или T-SQL. В этом разделе мы рассмотрим оба метода. Использование нескольких устройств резервного копирования может повысить производительность. (Рекомендации по производительности резервного копирования см. в разделе "Улучшение характеристик резервного копирования" далее.)

Создание устройств резервного копирования с помощью Enterprise Manager

Чтобы создать устройство резервного копирования с помощью Enterprise Manager, выполните следующие шаги.

  1. В левой панели Enterprise Manager раскройте папку SQL Server Group, раскройте папку сервера и затем раскройте папку Management (Управление).
  2. Щелкните правой кнопкой мыши на Backup (Резервное копирование) и выберите из контекстного меню пункт New Backup Device (Создать устройство резервного копирования), чтобы появилось окно Backup Device Properties (Свойства устройства резервного копирования) (рис. 32.2).

    Окно Backup Device Properties (Свойства устройства резервного копирования)


    Рис. 32.2.  Окно Backup Device Properties (Свойства устройства резервного копирования)

  3. Введите описательное имя для устройства резервного копирования в текстовом поле Name. Текстовое поле File name (Имя файла) заполняется автоматически. Чтобы изменить путь доступа к файлу, введите новый путь доступа или щелкните на кнопке обзора Browse [...], чтобы открыть диалоговое окно Backup Device Location (Местоположение устройства резервного копирования). В данном примере имя устройства резервного копирования – backup_dev_1. Если вы добавляете ленточное устройство, щелкните на кнопке View Contents (Просмотр содержимого), чтобы увидеть все наборы резервного копирования, которые имеются в данный момент на данном ленточном устройстве.

По окончании этих шагов устройство готово к использованию. Вы узнаете, как использовать устройства резервного копирования, ниже в этой лекции, когда будете изучать создание резервной копии. Отметим, что если у вас нет ленточных устройств, подсоединенных к вашей системе, то кнопка выбора Tape Drive Name (Имя ленточного устройства) недоступна.

Создание устройств резервного копирования с помощью T-SQL

Для создания устройства резервного копирования с помощью T-SQL используйте хранимую процедуру sp_addumpdevice. Она имеет следующий синтаксис:

sp_addumpdevice тип_устройства, логическое_имя, физическое_имя

Значением параметра тип_устройства может быть disk для дискового устройства, tape для ленточного устройства или pipe для подсоединения программного обеспечения сторонних форм к системе резервного копирования. Параметр логическое_имя – это имя, которое вы присваиваете данному устройству; это имя используется для ссылки на устройство в операторах BACKUP и RESTORE. Параметр физическое_имя – это имя, присвоенное системой устройству или файлу.

Например, чтобы создать логическое устройство с именем Backup_dev_2 для файла на диске, используйте следующий синтаксис:

sp_addumpdevice 'disk', 'Backup_dev_2',  
'C:\MSSQL2K\BACKUP\Backup_dev_2.BAK'
Создание удаленного устройства резервного копирования

Чтобы создать резервную копию вашей базы данных на удаленной системе, вы должны сначала создать устройство резервного копирования с помощью системной хранимой процедуры sp_addumpdevice. Вы не можете создать устройство резервного копирования на удаленном сервере с помощью Enterprise Manager. Чтобы задать удаленную систему, вы должны указать в качестве физического имени полное UNC-имя, как это показано в следующем примере:

sp_addumpdevice 'disk', 'netbackup1',
'\\ptc4\c$\backup\netbackup1.bck'

Создав это устройство резервного копирования, вы можете копировать на него данные с помощью Enterprise Manager или команд T-SQL.

Примечание. Для резервного копирования данных на удаленную систему у вас должен быть инсталлирован SQL Server, использующий учетную запись, отличную от "LocalSystem." Учетная запись "LocalSystem" не имеет привилегий доступа к удаленным системам, и резервное копирование не будет выполнено.
Резервное копирование данных через несколько сетей

Вы можете также выполнять резервное копирование через несколько сетевых интерфейсных плат. Выполняя резервное копирование данных на несколько устройств через несколько сегментов локальной сети, вы можете обходить проблемы пропускной способности сети, которые могут ограничивать производительность. В случае резервного копирования данных на несколько компьютерных систем просто укажите имена этих систем. В случае резервного копирования данных на одну систему через два сегмента локальной сети вы можете указать IP-адрес в UNC-адресе, как это показано ниже:

sp_addumpdevice 'disk', 'netbackup1',
'\\100.100.100.1\c$\backup\netbackup1.bck'
sp_addumpdevice 'disk', 'netbackup2',
'\\100.100.200.1\c$\backup\netbackup2.bck'

Создав эти устройства резервного копирования, вы можете копировать на них данные с помощью Enterprise Manager или операторов T-SQL.

Резервное копирование с помощью Enterprise Manager

Создав одно или несколько устройств резервного копирования, вы можете выполнять резервное копирование. Сначала мы рассмотрим использование Enterprise Manager. Чтобы избежать повторений, методы резервного копирования журнала транзакций и базы данных описываются по возможности вместе; при этом указываются конкретные параметры для каждого метода и отличия между ними.

Выполнение резервного копирования

Для выполнения резервного копирования с помощью Enterprise Manager выполните следующие шаги.

  1. Вызовите утилиту SQL Server Backup с помощью одного из следующих методов.
    • Раскройте папку сервера в левой панели Enterprise Manager и затем раскройте папку Management. Щелкните правой кнопкой мыши на Backup и выберите из контекстного меню пункт Backup A Database (Резервное копирование базы данных).
    • Раскройте папку сервера в левой панели Enterprise Manager, щелкните правой кнопкой мыши на Database, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Backup Database.
    • Раскройте папку сервера в левой панели Enterprise Manager и затем щелкните на папке Databases. В правой панели щелкните правой кнопкой мыши на базе данных, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Backup Database.

      Появится диалоговое окно SQL Server Backup (рис. 32.3).

      Вкладка General диалогового окна SQL Server Backup


      Рис. 32.3.  Вкладка General диалогового окна SQL Server Backup

  2. В раскрывающемся списке Database верхней секции этого диалогового окна выберите базу данных, для которой хотите выполнить резервное копирование. (Если вы использовали третий метод на шаге 1, то имя соответствующей базы данных уже будет выбрано.) Имя резервной копии автоматически формируется на основе имени базы данных, хотя вы можете переопределить это автоматическое имя путем ввода имени резервной копии в текстовом поле Name. Вы можете также ввести описание резервной копии в текстовом поле Description. Это описание может оказаться важным для вас при восстановлении базы данных. Например, если вы создаете эту резервную копию непосредственно перед удалением какой-либо таблицы, имеет смысл включить этот факт в описание. Если резервное копирование выполняется перед загрузкой новых данных, включите эту информацию в ваше описание.
  3. В секции Backup (Резервное копирование) этого диалогового окна вы должны указать тип резервного копирования. Доступные кнопки выбора будут варьироваться в зависимости от выбранной вами базы данных. Например, по умолчанию для базы данных Northwind установлен параметр Truncate log on checkpoint. (Усечение журнала транзакций при создании контрольной точки). В этом случае кнопки выбора Transaction Log и File and Filegroup недоступны для программы резервного копирования. Секция Backup содержит следующие кнопки выбора.
    • Database – Complete (База данных – Полное). Полное резервное копирование базы данных, т.е. всех данных соответствующей базы данных.
    • Database – Differential (База данных – Разностное).Разностное резервное копирование базы данных, т.е. всех данных, которые изменились с момента предыдущего резервного копирования.
    • Transaction Log (Журнал транзакций). Резервное копирование журнала транзакций; при этом также происходит усечение журнала транзакций.
    • File And Filegroup (Файл и группа файлов). Резервное копирование одного файла или группы файлов; вы должны указать этот файл или группу файлов.
    Вы можете выбрать только один из этих типов резервного копирования. Чтобы выполнить полное резервное копирование базы данных и резервное копирование журнала транзакций, вы должны запустить эту программу резервного копирования дважды.
  4. В секции Destination (Местоположение резервной копии) вы должны выбрать тип устройства для резервной копии – Tape (Лента) или Disk (Диск). Щелкнув на кнопке Add, вы можете добавлять логические или физические устройства резервного копирования. Появится диалоговое окно Select Backup Destination (Выбор местоположения резервной копии) (рис. 32.4). В этом диалоговом окне вы можете указать имя файла или выбрать устройство резервного копирования из раскрывающегося списка Backup device. Щелкните на кнопке OK, чтобы вернуться во вкладку General диалогового окна SQL Server Backup. В примере на рис. 32.3 в списке Backup to представлены два устройства. Чтобы удалить какое-либо устройство, выделите это устройство и щелкните на кнопке Remove (Удалить). Для просмотра содержимого устройства щелкните на кнопке Contents (Содержимое).

    Если определенное устройство резервного копирования уже использовалось раньше, появится следующая информация о резервной копии.

    • Name (Имя). Имя, выбранное тем, кто запускал резервное копирование.
    • Server (Сервер). Имя сервера, на котором выполнялось резервное копирование.
    • Database (База данных). Имя базы данных, для которой было выполнено резервное копирование.
    • Type (Тип). Тип резервного копирования (Complete, Differential, Transaction Log, Filegroup, File)

      Диалоговое окно Select Backup Destination


      Рис. 32.4.  Диалоговое окно Select Backup Destination

    • Date (Дата).Дата и время резервного копирования.
    • Expiration (Срок окончания действия).Срок окончания действия, указанный для резервной копии.
    • Size (Размер). Общий размер набора резервного копирования.
    • Description (Описание).Описание, заданное для резервной копии.
    Напомним, что на одном устройстве резервного копирования можно создавать несколько резервных копий (что часто используется на практике).
  5. В секции Overwrite (Перезапись) диалогового окна SQL Server Backup вы можете выбирать между перезаписью носителя (кнопка выбора Overwrite ...), такого как лента или диск, и добавлением к предыдущим данным (кнопка выбора Append...). Но если вы используете ленты и чередуете их, то вам нужно удалять предыдущую информацию. Хотя вы можете перезаписывать эту информацию, щелкнув на кнопке выбора Overwrite existing media в этом диалоговом окне, вам следует вместо этого принять за правило стирать информацию перед резервным копированием. Тем самым вы гарантируете себя от случайной перезаписи ленточного или дискового устройства.
  6. В секции Schedule (Расписание) вы можете задать расписание для запуска резервного копирования в определенное время. Создание резервных копий по расписанию особенно полезно для резервного копирования журнала транзакций, которое может выполняться регулярным образом, чтобы избежать переполнения журнала транзакций. Чтобы задать расписание резервного копирования, установите флажок Schedule и затем щелкните на кнопке обзора (...), чтобы появилось диалоговое окно Edit Schedule (Редактировать расписание) (рис. 32.5).

    Диалоговое окно Edit Schedule (Редактировать расписание)


    Рис. 32.5.  Диалоговое окно Edit Schedule (Редактировать расписание)

  7. Введите имя расписания в текстовом поле Name. Имена расписаний позволяют вам создавать несколько расписаний, например, отдельное расписание для каждого резервного копирования.

    В секции Schedule type (Тип расписания) вы можете выбрать один из следующих типов расписания (в порядке кнопок выбора): автоматически при запуске SQL Server Agent, когда не будет занят ЦП, запускать резервное копирование один раз или повторять его. Если у вас выбран однократный запуск резервного копирования, то вы используете всплывающий календарь On date (Дата) для выбора даты резервного копирования и поле-счетчик At time (Время) для выбора времени.

    Чтобы задать расписание для периодически повторяющегося резервного копирования, щелкните на кнопке выбора Recurring (Периодически) и щелкните на кнопке Change (Изменить).

    Появится диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) (рис. 32.6). Это диалоговое окно предоставляет вам разнообразные гибкие возможности по созданию расписания. Используя вариант Daily (Ежедневно), Weekly (Еженедельно) или Monthly (Ежемесячно), вы можете указывать частоту и срок действия соответствующего задания.

    Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий)


    Рис. 32.6.  Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий)

  8. Щелкните на кнопке OK, чтобы вернуться в диалоговое окно Edit Schedule, щелкните еще раз на кнопке OK, чтобы вернуться в диалоговое окно SQL Server Backup, и затем щелкните на вкладке Options (рис. 32.7). В этой вкладке вы можете указывать, нужно ли проверять носитель резервной копии по завершении резервного копирования, а также указывать необходимость и способ задания метки (заголовка) носителя резервной копии. Ниже описываются параметры этой вкладки.
    • Verify backup upon completion (Проверять резервную копию по завершении). Вызывает проверку носителя резервной копии на читаемость. Проверяется только целостность копии; этот процесс не проверяет, что резервная копия содержит соответствующие данные.
    • Eject tape after backup (Извлечь ленту из устройства после резервного копирования – только для ленточных устройств).Извлечение ленты из устройства по завершении резервного копирования. Этот флажок полезно использовать, если несколько приложений или пользователей осуществляют доступ к ленточным устройствам. Это позволяет сохранить вашу ленту от перезаписи другим пользователем.
    • Remove inactive entries from transaction log (Удалить неактивные записи из журнала транзакций – только для резервного копирования журнала транзакций).Усечение журнала транзакций после резервного копирования.
    • Check media set name and backup set expiration (Проверять имя набора носителей и дату окончания срока хранения набора резервного копирования).Указывает, что данный носитель нужно проверять и не перезаписывать, если не наступила дата окончания срока хранения.
    • Backup set will expire (Срок хранения набора резервного копирования истекает – только для ленточных устройств). Позволяет вам задавать дату окончания срока хранения данного носителя.
    • Initialize and label media (Инициализировать и пометить носитель – только для ленточных устройств). Позволяет вам задавать метку для данного носителя.

    Вкладка Options диалогового окна SQL Server Backup


    Рис. 32.7.  Вкладка Options диалогового окна SQL Server Backup

  9. По окончании установки параметров щелкните на кнопке OK, чтобы перейти к выполнению сконфигурированного резервного копирования.
Управление резервным копированием

Для просмотра, удаления и модифицирования запланированных вами заданий резервного копирования выполните следующие шаги:

  1. В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management, раскройте папку SQL Server Agent и щелкните на Jobs (Задания). Запланированные задания будут представлены в списке правой панели Enterprise Manager (рис. 32.8).
  2. Чтобы удалить задание, щелкните правой кнопкой мыши на имени этого задания и выберите из контекстного меню пункт Delete (Удалить).

    Задания, представленные в окне Enterprise Manager


    увеличить изображение

    Рис. 32.8.  Задания, представленные в окне Enterprise Manager

  3. Для просмотра или модифицирования задания щелкните правой кнопкой мыши на имени этого задания и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно свойств задания Properties. Внесите свои изменения, щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK.
Резервное копирование с помощью операторов T-SQL

Использование операторов T-SQL для резервного копирования базы данных может оказаться поначалу чуть сложнее, чем использование Enterprise Manager. Но если вы относитесь к тем администраторам, которые предпочитают автоматизировать операции с помощью сценариев, этот метод будет для вас удобнее. Кроме того, оператор T-SQL BACKUP дает несколько больше возможностей, чем программа резервного копирования в Enterprise Manager. В этом разделе мы рассмотрим синтаксис и параметры оператора BACKUP. На самом деле существуют два оператора резервного копирования; выбор используемого оператора зависит от типа резервного копирования, которое вам нужно выполнить. Это следующие операторы:

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

Выполнение резервного копирования

Оператор BACKUP для полного резервного копирования базы данных имеет следующий синтаксис:

BACKUP DATABASE имя_базы_данных
TO устройство_резервного_копирования
[ WITH необязательные параметры ]

Для этого оператора обязательными параметрами являются только имя базы данных и имя устройства резервного копирования. (Примеры операторов BACKUP можно найти во врезке "Использование оператора BACKUP" далее.)

Оператор для резервного копирования файла или группы файлов имеет следующий синтаксис:

BACKUP DATABASE имя_базы_данных
имя_файла или имя_группы_файлов [,...n]
TO устройство_резервного_копирования
[ WITH необязательные параметры ]

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

Оператор для резервного копирования журнала транзакций имеет следующий синтаксис:

BACKUP LOG имя_базы_данных
{
[ WITH \ NO_LOG | TRUNCATE_ONLY )]
}
|
{
TO устройство_резервного_копирования
}
[ WITH необязательные параметры ]

Для этого оператора обязательными параметрами являются только имя базы данных и параметр WITH NO_LOG или WITH TRUNCATE_ONLY либо имя устройства резервного копирования. Вы можете затем добавлять любые нужные вам параметры. Параметры NO_LOG и TRUNCATE ONLY является синонимами; оба указывают усечение журнала без создания его резервной копии.

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

Во всех трех указанных командах резервного копирования имя_базы_данных представляет базу данных, для которой будет создана резервная копия. Устройство_ резервного_копирования – это имя логического устройства резервного копирования или имя физического устройства. Если указано физическое устройство, то имени устройства должен предшествовать текст DISK =, TAPE = или PIPE = (в зависимости от типа устройства). Вы можете задать одно устройство или набор разделенных запятыми устройств, как это показано в следующих двух примерах:

Backup_dev_1, Backup_dev_2, Backup_dev_3

TAPE = '\\.\Tape0', TAPE = '\\.\Tape1', TAPE = '\\.\Tape2'
Необязательные параметры

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

Таблица 32.1. Необязательные параметры оператора BACKUP
ПараметрОписание
BLOCKSIZEЭтот параметр указывает размер физического блока в байтах
DESCRIPTIONЭтот параметр указывает текстовое описание набора резервного копирования. Его полезно использовать для поиска нужной резервной копии, с которой будет выполняться восстановление
DIFFERENTIALЭтот параметр указывает разностное резервное копирование. Его можно использовать только при наличии полной резервной копии базы данных
EXPIREDATE = дата RETAINDAYS = дниПараметр EXPIREDATE указывает дату, когда истекает срок действия данного набора резервного копирования (и когда его можно перезаписывать).
RETAINDAYS указывает количество дней, соответствующих сроку действия данного набора резервного копирования
PASSWORD = парольПараметр PASSWORD позволяет вам задавать пароль для резервной копии, что повышает безопасность самой резервной копии
FORMAT | NOFORMATПараметр FORMAT указывает, что заголовок носителя должен быть перезаписан, делая тем самым недействительными первоначальные данные на этом носителе. Параметр NOFORMAT указывает, что заголовок носителя не должен перезаписываться
INIT | NOINITПараметр INIT указывает, что набор резервной копии должен находиться в первом файле на данном носителе, причем заголовок носителя остается без изменений, но все данные на этом носителе перезаписываются; иными словами, INIT указывает перезапись всего, чт.е. на ленте. Параметр NOINIT указывает, что данный набор резервной копии добавляется к содержимому носителя. Если вы повторно используете ленты, то вам нужно использовать этот параметр
MEDIADESCRIPTION = текстЭто текстовое поле задает описание набора носителей
MEDIANAME= имя_носителяУказывает имя носителя
MEDIAPASSWORD = парольС помощью этого параметра вы можете указывать пароль для набора носителей
NAME= имя_набора_резервной_копииЭтот параметр позволяет вам задавать имя набора резервной копии
NOSKIP | SKIPПараметр NOSKIP указывает, что прежде чем перезаписывать наборы резервных копий на данном носителе, будут проверяться даты истечения срока действия соответствующих наборов резервных копий. Параметр SKIP отключает проверку этой даты
NO_TRUNCATEЭтот параметр запрещает усечение журнала транзакций после создания резервной копии. Используется только для резервного копирования журнала транзакций
NOUNLOAD | UNLOADПараметр NOUNLOAD указывает, что после завершения резервного копирования носитель не будет выгружаться из устройства (например, не будет извлекаться лента). Параметр UNLOAD указывает, что по окончании резервного копирования носитель будет выгружен
RESTARTЭтот параметр указывает SQL Server необходимость перезапуска резервного копирования, которое было прервано
STATS [ = процент ]Этот параметр указывает вывод сообщения после выполнения определенного процента резервного копирования. Его полезно использовать, если вы любите следить за ходом выполнения операций

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

Практические советы.
Использование оператора BACKUP

В этом разделе мы рассмотрим пару примеров использования оператора T-SQL BACKUP. Следующий оператор используется для резервного копирования файлов данных базы данных Example:

BACKUP DATABASE Example 
TO Backup_Dev_1, Backup_Dev_2 
WITH 
DESCRIPTION = "DB backup of example", 
STATS = 5 
GO

Здесь устройства резервного копирования – это Backup_Dev_1 и Backup_Dev_2, а сообщение о состоянии будет выводиться после выполнения очередных 5 процентов резервного копирования. Отметим, что в этом примере задано описание резервной копии.

Если вы будете проверять этот пример на небольшой базе данных, такой как Northwind, то вы не увидите сообщений с приращением по 5 процентов. Это будут приращения, например, в 7 процентов, 16 процентов и т.д. Дело в том, что программа резервного копирования читает и записывает за один раз более 5 процентов от объема всех данных такой базы данных. Для наборов данных большего размера за один раз будет записываться меньше 5 процентов данных и поэтому сообщения будут появляться ожидаемым образом.

Следующий оператор используется для резервного копирования журнала транзакций базы данных Example:

BACKUP LOG Example 
TO Backup_Dev_3, Backup_Dev_4 
WITH 
DESCRIPTION = "DB backup of example", 
STATS = 25 
GO

Здесь устройства резервного копирования – это Backup_Dev_3 и Backup_Dev_4, а сообщения о состоянии будут выводиться с интервалом в 25 процентов. В результирующем наборе будет представлен процент выполненных операций, а также результаты резервного копирования. Будет указано количество скопированных страниц, сколько времени длится резервное копирование и какова скорость (Мб/с).

Управление резервным копированием

Поскольку оператор T-SQL BACKUP не выполняется под управлением Enterprise Manager и, тем самым, не выполняется под управлением SQL Server Agent, вы не можете задать расписание этого задания в операторе BACKUP . Но вы можете задать расписание для оператора T-SQL BACKUP с помощью средств планирования заданий в SQL Server. После того как составлено расписание для задания, им можно управлять точно так же, как и заданиями резервного копирования в Enterprise Manager.

Резервное копирование с помощью мастера Create Database Backup Wizard

Теперь обратимся к третьему методу выполнения резервного копирования: использование мастера Create Database Backup Wizard.

Выполнение резервного копирования

Для резервного копирования с помощью мастера Create Database Backup Wizard выполните следующие шаги.

  1. В окне Enterprise Manager щелкните на базе данных, для которой хотите создать резервную копию, и затем выберите из меню Tools пункт Wizards (Мастера), чтобы появилось диалоговое окно Select Wizard (Выбор мастера). В диалоговом окне Select Wizard раскройте папку Management, выберите Backup Wizard (Мастер резервного копирования) и затем щелкните на кнопке OK. Появится начальное окно мастера Create Database Backup Wizard (рис. 32.9).

    Начальное окно мастера Create Database Backup Wizard


    Рис. 32.9.  Начальное окно мастера Create Database Backup Wizard

  2. Щелкните на кнопке Next, чтобы появилось окно Select Database to Backup (Выбор баз данных для резервного копирования) (рис. 32.10). В этом окне вы указываете базу данных для резервного копирования (на рис. 32.10 выбрана база данных Northwind).

    Окно Select Database to Backup (Выбор баз данных для резервного копирования)


    Рис. 32.10.  Окно Select Database to Backup (Выбор баз данных для резервного копирования)

     Окно Type Name and Description for Backup (Ввод имени и описания для резервной копии)


    Рис. 32.11.  Окно Type Name and Description for Backup (Ввод имени и описания для резервной копии)

  3. Щелкните на кнопке Next, чтобы появилось окно Type Name and Description for Backup (Ввод имени и описания для резервной копии) (рис. 32.11). Здесь вы задаете имя и описание для набора резервной копии путем ввода нужного имени в текстовом поле Name и описания в текстовом поле Description. Хорошее описание поможет вам в будущем, когда у вас будет много резервных копий.
  4. Щелкните на кнопке Next, чтобы появилось окно Select Type of Backup (Выбор типа резервного копирования) (рис. 32.12). Здесь вы можете выбрать тип резервного копирования (в порядке кнопок выбора): полная резервная копия, разностная резервная копия или резервная копия журнала транзакций. На рис. 32.12 выбрано полное резервное копирование.

    Окно Select Type of Backup


    Рис. 32.12.  Окно Select Type of Backup

  5. Щелкните на кнопке Next, чтобы появилось окно Select Backup Destination and Action (Выбор местоположения резервной копии и действия) (рис. 32.13). В секции Select backup device (Выбор устройства резервного копирования) выберите тип устройства: ленту (кнопка выбора Tape), файл (File) или определенное устройство резервного копирования (Backup device), и при необходимости укажите в соответствующем поле имя файла или имя устройства. В секции Properties выберите, как будет происходить запись на носитель резервной копии: путем добавления (первая кнопка выбора) или перезаписи (вторая кнопка выбора). Укажите, нужно ли извлекать ленту после резервного копирования (флажок Eject tape after backup), если вы используете ленту, и нужно ли проверять целостность резервной копии (флажок Read and verify ...). Проверка целостности имеет смысл, поскольку некачественная лента может сделать ненужной всю резервную копию. SQL Server проверяет целостность ленты, читая эту ленту и проверяя читаемость всех данных.

    Окно Select Backup Destination and Action (Выбор местоположения резервной копии и действия)


    Рис. 32.13.  Окно Select Backup Destination and Action (Выбор местоположения резервной копии и действия)

    Примечание. К сожалению, мастер Create Database Backup Wizard позволяет вам выбрать только одно устройство резервного копирования, что может резко повлиять на производительность резервного копирования. (Cм. раздел "Улучшение характеристик резервного копирования" далее.) По этой причине использование Enterprise Manager может оказаться предпочтительнее мастера Create Database Backup Wizard.
  6. Щелкните на кнопке Next, чтобы появилось окно Backup Verification аnd Scheduling (Проверка резервной копии и создание расписания) (рис. 32.14). Здесь вы можете задать проверку меток носителей и дат окончания срока действия. (См. раздел "Резервное копирование с помощью Enterprise Manager".) Вы можете также запланировать резервное копирование на определенные моменты в будущем с помощью диалогового окна Edit Schedule, как это описано выше в этой лекции.
  7. Щелкните на кнопке Next, чтобы появилось окно Completing the Create Database Backup Wizard (Завершение работы мастера создания резервной копии базы данных) (рис. 32.15). Проверьте информацию в текстовом поле и щелкните на кнопке Finish, чтобы запустить резервное копирование.

Окно Backup Verification and Scheduling (Проверка резервной копии и создание расписания)


Рис. 32.14.  Окно Backup Verification and Scheduling (Проверка резервной копии и создание расписания)

Окно Completing the Create Database Backup Wizard (Завершение работы мастера создания резервной копии базы данных)


Рис. 32.15.  Окно Completing the Create Database Backup Wizard (Завершение работы мастера создания резервной копии базы данных)

Управление резервным копированием

С помощью мастера Create Database Backup Wizard вы можете только выполнять резервное копирование или создавать задание на резервное копирование (которое запускается по расписанию). Создав задание, вы должны использовать для управления этим заданием Enterprise Manager или оператора T-SQL. (Об управлении заданиями см. раздел "Резервное копирование с помощью Enterprise Manager" выше в этой лекции.)

Слежение за резервным копированием

При выполнении резервного копирования (с помощью Enterprise Manager, T-SQL или мастера Create Database Backup Wizard) сохраняется запись об этом резервном копировании. Эта запись сохраняется в виде строки в таблице backupfile базы данных msdb. Во время восстановления данная информация используется, чтобы определить, когда было выполнено последнее резервное копирование для базы данных. Кроме того, сохраняется такая информация, как идентификатор набора резервной копии и имена файлов, сохраненных при резервном копировании. Поэтому важно выполнять периодическое резервное копирование системных баз данных, чтобы можно было при необходимости восстановить эту информацию.

Составление расписаний резервного копирования

Составление расписаний резервного копирования является весьма субъективной задачей. При разработке расписания требуется учитывать многочисленные факторы. Поскольку во время резервного копирования падает производительность системы, оно должно выполняться только в нерабочее время. Возможно, у вас будет лишь небольшое временное "окно", когда вы можете выполнять резервное копирование. В этом разделе мы предложим несколько советов, которые могут помочь вам в составлении расписания резервного копирования. Не забывайте, что хотя резервное копирование влияет на производительность системы, это критически важная операция, которая должна выполняться для защиты вашей системы от потери данных.

Рекомендации по составлению расписания

Следующие рекомендации могут помочь вам в составлении "идеального" расписания резервного копирования для вашей системы.

Практические советы.
Планирование операций резервного копирования

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

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

Улучшение характеристик резервного копирования

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

Повышение производительности резервного копирования

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

Дополнительные рекомендации

Следующие рекомендации по выполнению резервного копирования, возможно, применимы, а возможно, неприменимы к вашим условиям.

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

Заключение

В этой лекции вы узнали, как происходит журнальное протоколирование в SQL Server и как использовать контрольные точки, чтобы сократить время, необходимое для восстановления базы данных. Вы ознакомились с основами резервного копирования в SQL Server и с отличиями между полным и разностным резервным копированием и между резервным копированием базы данных и журнала транзакций. Вы также узнали, как составлять расписание резервного копирования и улучшать характеристики резервного копирования. В лекции 33 мы продолжим изучение резервного копирования, восстановления и воспроизведения базы данных. Вы узнаете, как восстанавливать базу данных и как планировать восстановление после аварии.

Лекция 33. Восстановление и воспроизведение базы данных

В прошлой лекции вы познакомились с методами резервного копирования базы данных. Теперь пришло время рассказать о восстановлении данных до состояния нормальной работы системы. Рассматривается восстановление из полной резервной копии, разностной резервной копии, резервных копий журналов транзакций, режиме воспроизведения BULK_LOGGED. Уделено внимание операторам RESTORE DATABASE и RESTORE LOG. Описание параметров этих операторов, примеры использования. Эти две лекции помогут эффективно выполнять резервное копирование и восстановление системы и понять как выполняется воспроизведение в SQL Server.

В лекции 32 вы узнали о том, насколько важно выполнять резервное копирование вашей системы и как создавать резервные копии. В этой лекции мы продолжим тему защиты базы данных, исходя из материала предыдущей лекции. Вы узнаете, как восстанавливать базу данных, как планировать восстановление на случай аварии; мы рассмотрим более подробно, как происходит воспроизведение базы данных. Как вы увидите, тип выполненного резервного копирования влияет на то, как выполняется восстановление. Кроме изучения методов восстановления и воспроизведения базы данных, вы ознакомитесь с понятием доставки журнала транзакций (log shipping). Это новое средство, введенное в Microsoft SQL Server 2000, позволяющее создавать резервную копию вашей базы данных на другом сервере путем использования журнала транзакций исходного сервера.

Примечание. Некоторые администраторы баз данных (DBA) называют процесс восстановления (restoring) и последующее воспроизведение (recovering) базы данных просто "воспроизведением базы данных". Однако это совершенно различные процедуры. В лекции 32 разъясняются отличия между восстановлением базы данных из резервной копии и процессом воспроизведения SQL Server. В любом случае главной целью выполнения операций резервного копирования, восстановления и воспроизведения является возврат базы данных к состоянию, в котором она находилась на момент отказа системы.

Методы восстановления

Как уже говорилось, тип выполненного резервного копирования влияет на характер операции восстановления. В этом разделе вы узнаете, как выполнять восстановление из полной резервной копии, из разностной резервной копии, а также из резервных копий журнала транзакций.

Восстановление из полной резервной копии

Восстановление из полной резервной копии – это довольно простой процесс: вы просто восстанавливаете файлы резервной копии с помощью SQL Server Enterprise Manager или операторов Transact-SQL (T-SQL). Инструкции по восстановлению данных с помощью этих двух методов приводятся далее в данной лекции. Если вы планируете восстановление из разностных резервных копий после восстановления из полной резервной копии, то не забывайте создавать резервную копию текущего журнала транзакций (см. раздел "Восстановление из резервных копий журнала транзакций" далее в этой лекции), и задавать параметр NORECOVERY, когда выполняете восстановление.

Примечание. Важной особенностью операции восстановления является использование параметра RECOVERY. Параметр RECOVERY указывает SQL Server, что после окончания операции восстановления нужно попытаться воспроизвести базу данных с помощью оперативного журнала транзакций. Если вы планируете использовать файлы разностных резервных копий или файлы резервных копий журнала транзакций, то не забудьте указать параметр NORECOVERY.
Восстановление из разностной резервной копии

Для восстановления из разностной резервной копии вы должны сначала выполнить восстановление из полной резервной копии и затем – из всех разностных резервных копий, созданных вслед за последней полной резервной копией. Напомним, что разностная резервная копия используется для резервного копирования информации, которая изменилась с момента последнего полного или разностного резервного копирования. Не забудьте использовать параметр NORECOVERY (за исключением случая восстановления самого последнего файла резервной копии, для которого вы будете использовать параметр RECOVERY ). Если у вас выполняется восстановление из резервных копий журналов транзакций в дополнение к разностной резервной копии, то вы должны также выполнить резервное копирование текущего журнала и применять все измененные файлы журнала, как это описано в следующем разделе.

Восстановление из резервных копий журнала транзакций

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

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

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

  1. Выполните резервное копирование текущего активного журнала транзакций, используя параметр NO_TRUNCATE.
  2. Восстановите последнюю полную резервную копию.
  3. Восстановите все разностные резервные копии для возврата базы данных к состоянию, в котором она находилась при создании последней резервной копии.
  4. Восстановите все резервные копии журнала транзакций, созданные после записи последней разностной резервной копии, для воспроизведения всех транзакций, выполненных с момента создания этой последней резервной копии.
  5. Восстановите резервную копию журнала транзакций, которую вы создали на шаге 1, чтобы вернуть базу данных к состоянию, в котором она находилась непосредственно перед отказом системы.
Восстановление базы данных в режиме воспроизведения BULK_LOGGED

Если ваша база данных работает в режиме воспроизведения BULK_LOGGED, то вы должны повторно выполнить любые минимально протоколированные в журнале операции, если это восстановление необходимо. К этим операциям относятся SELECT...INTO, BULK COPY, BCP и некоторые операции CREATE INDEX, а также текстовые операции, о которых говорилось в предыдущей лекции. Если это налагает на вас непосильную нагрузку, не задавайте для вашей базы данных режим BULK_LOGGED.

Выполнение операции восстановления базы данных

Как уже говорилось, вы можете выполнять операцию восстановления с помощью Enterprise Manager или операторов T-SQL – оба метода дают одинаковые результаты. В отличие от операций резервного копирования, в SQL Server нет мастера для операций восстановления.

Использование Enterprise Manager для операции восстановления

Для операции восстановления с помощью Enterprise Manager выполните следующие шаги.

  1. В окне Enterprise Manager щелкните правой кнопкой мыши на имени базы данных, которую хотите восстановить, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Restore database (Восстановить базу данных), чтобы появилось диалоговое окно Restore database (рис. 33.1).

    Вкладка General диалогового окна Restore database (Восстановление базы данных)


    Рис. 33.1.  Вкладка General диалогового окна Restore database (Восстановление базы данных)

  2. Вверху вкладки General (Общие) находится раскрывающийся список Restore as database (Восстановить как базу данных), где вы можете указать, в какой базе данных будет восстановлена резервная копия. На рис. 33.1 показано, что выбрана база данных Example.

    От вас не требуется непосредственное восстановление какой-либо базы данных; на самом деле, когда вам действительно потребуется восстанавливать базу данных, вы будете использовать другое имя базы данных. Например, предположим, что пользователь случайно удалил таблицу. Если бы вы восстанавливали всю базу данных, то вам пришлось бы заменить все данные более ранними данными. Вместо этого вы можете восстановить эти данные в базе данных под другим именем, извлечь из нее соответствующую таблицу и воспроизвести эту таблицу в реальную базу данных.

  3. Далее укажите тип операции восстановления: Database (База данных), Filegroups or files (Группа файлов или файл) или From device (Из устройства). Вариант Database позволяет задать базу данных для восстановления. Вариант Filegroups or files позволяет задать для восстановления группы файлов или файлы. Параметр From device позволяет указать устройство, с которого будет выполняться восстановление, а тип восстановления будет определяться содержимым этого устройства. На рис. 33.1 выбран вариант Database.
  4. В секции Parameters (Параметры) вы можете задать, нужно ли показывать резервные копии других баз данных (для восстановления с резервной копии другой базы данных), указать, какая резервная копия должна восстанавливаться первой (если имеется набор из нескольких резервных копий), и задать восстановление данных к состоянию, в котором они находились на определенный момент времени (флажок Point-in-time restore). Например, если вы случайно удалили таблицу в 12:01, то вам нужно использовать флажок Point-in-time restore для восстановления базы данных к состоянию, в котором она находилась на 12:00, т.е. непосредственно перед удалением таблицы. Поскольку у вас имеется список всех резервных копий, то вы можете выбрать для использования одну из них. От вас не требуется, чтобы вы выполняли восстановление только с последней резервной копии.

    В диалоговом окне Restore database вы можете также выделить набор резервного копирования и затем просмотреть его свойства, щелкнув на кнопке Properties (Свойства). Пример окна Backup Set Properties (Свойства набора резервного копирования) показан на рис. 33.2.

     Окно Backup Set Properties (Свойства набора резервного копирования)


    Рис. 33.2.  Окно Backup Set Properties (Свойства набора резервного копирования)

  5. Щелкните на кнопке OK, чтобы вернуться во вкладку General диалогового окна Restore database, и щелкните на кнопке выбора Filegroups or files, чтобы окно имело несколько иной вид (рис. 33.3). На рисунке представлены все резервные копии файлов и групп файлов базы данных Example. Для просмотра свойств резервной копии файла или группы файлов выделите эту резервную копию и щелкните на кнопке Properties.

    Вкладка General диалогового окна Restore database после щелчка на кнопке Filegroups or files


    Рис. 33.3.  Вкладка General диалогового окна Restore database после щелчка на кнопке Filegroups or files

  6. Теперь щелкните на кнопке From device (рис. 33.4). Как уже говорилось, этот вариант используется, чтобы выбрать определенное устройство резервного копирования, с которого будет выполняться восстановление. Выбрав этот вариант, вы должны вручную выбрать набор резервного копирования и затем указать, что будет восстанавливаться: полная копия (Database – complete), разностная копия (Database – differential), журнал транзакций (Transaction log) или файл или группа файлов (File or filegroup). Вы можете также указать, чтобы SQL Server прочитал информацию набора резервного копирования и сохранил ее вместе с другой информацией журнала резервного копирования в базе данных msdb. Затем вы сможете использовать информацию об этой резервной копии, если захотите выполнить восстановление базы данных.
  7. Щелкните на вкладке Options (Параметры) диалогового окна Restore database (рис. 33.5). Вверху этой вкладки вы увидите три флажка. Установка флажка Eject tapes after restoring each backup (Извлекать ленты после восстановления каждой резервной копии) гарантирует, что лента не останется в ленточном устройстве и не будет перезаписана. Установка флажка Prompt before restoring each backup (Запрос перед восстановлением каждой резервной копии) позволяет вам отменить свое решение о восстановлении из резервной копии. И установка флажка Force restore over existing database (Принудительное восстановление в существующую базу данных) позволяет вам перезаписать существующую базу данных восстановленной базой данных. В этой вкладке вы можете также восстановить базу данных под другим именем, что может оказаться полезным, если вы хотите сохранить исходную базу данных.

    Вкладка General диалогового окна Restore database после щелчка на кнопке выбора From device


    Рис. 33.4.  Вкладка General диалогового окна Restore database после щелчка на кнопке выбора From device

    Вкладка Options диалогового окна Restore database


    Рис. 33.5.  Вкладка Options диалогового окна Restore database

    Остальные параметры (кнопки выбора) позволяют вам указывать, в каком состоянии следует оставить базу данных по завершении восстановления.
    • Leave database operational. No additional transaction logs can be restored (Оставить базу данных в рабочем состоянии. Восстановление дополнительных журналов транзакций невозможно). Этот вариант не допускает никакого дополнительного восстановления с разностных резервных копий или резервных копий журнала транзакций. При этом для восстановления фактически устанавливается флаг RECOVERY. При выборе этого варианта вы не можете восстанавливать резервные копии журнала транзакций.
    • Leave database nonoperational but able to restore additional transaction logs (Оставить базу данных в нерабочем состоянии, но с возможностью восстановления дополнительных журналов транзакций). При этом варианте для восстановления устанавливается флаг NORECOVERY. При установке этого флага вы можете запускать дальнейшее восстановление с разностных резервных копий или резервных копий журнала транзакций. База данных находится в нерабочем состоянии, а это означает, что пользователи не имеют доступа к этой базе данных, пока вы не закончите все восстановление.
    • Leave database read-only and able to restore additional transaction logs (Оставить базу данных доступной только по чтению и с возможностью восстановления дополнительных журналов транзакций). Этот вариант также указывает установку флага NORECOVERY для восстановления, и вы можете выполнять восстановление с разностных резервных копий или резервных копий журнала транзакций. В отличие от предыдущего варианта эта кнопка выбора позволяет пользователям осуществлять доступ к базе данных по чтению с одновременным выполнением операции восстановления.
  8. По окончании установки этих параметров щелкните на кнопке OK, чтобы начать операцию восстановления. Вы будете получать информацию о ходе операции восстановления в окне сообщения, содержащем строку состояния (рис. 33.6). По окончании этой операции вы увидите статусное окно, информирующее вас о результате восстановления (успешное или неуспешное).

     Окно с информацией о ходе восстановления Restore Progress


    Рис. 33.6.  Окно с информацией о ходе восстановления Restore Progress

Использование T-SQL для выполнения операции восстановления

Оператор T-SQL RESTORE действует аналогично оператору BACKUP (см.лекцию 32). Подобно оператору BACKUP, сначала оператор RESTORE относительно труден для использования, но некоторые DBA предпочитают включать свои административные процедуры в сценарии SQL для многократного запуска. И, подобно оператору BACKUP, оператор RESTORE предоставляет несколько больше возможностей, чем использование Enterprise Manager.

В этом разделе мы рассмотрим синтаксис оператора RESTORE и различные параметры этого оператора. Оператор RESTORE имеет две следующие формы.

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

Оператор RESTORE

Оператор RESTORE для полного восстановления базы данных имеет следующий синтаксис:

RESTORE DATABASE имя_базы_данных
[ FROM устройство_резервного_копирования ]
[ WITH необязательные параметры ]

Для этого оператора обязательными параметрами являются только имя базы данных и местоположение резервной копии.

Оператор восстановления файла или группы файлов имеет следующий синтаксис:

RESTORE DATABASE имя_базы_данных
[FILE = имя_файла ]
[FILEGROUP = имя_группы_файлов ]
[ FROM устройство_резервного_копирования ]
[ WITH необязательные параметры ]

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

Оператор RESTORE для восстановления журнала транзакций имеет следующий синтаксис:

RESTORE LOG имя_базы_данных
[ FROM устройство_резервного_копирования ]
[ WITH необязательные параметры ]

Во всех этих операторах имя_базы_данных представляет базу данных, для которой будет выполнено восстановление. Устройство_резервного_копирования – это имя логического устройства резервного копирования или имя физического устройства. Если указано физическое устройство, то имени устройства должен предшествовать тип устройства, т.е. DISK =, TAPE = или PIPE =. Вы можете задать одно или несколько устройств. (Имена нескольких устройств разделяются запятыми.)

Примечание. Если вы не указываете предложение FROM, то восстановление не происходит, но все же происходит воспроизведение (если не задан параметр NORECOVERY ). Этот метод можно использовать для установки базы данных в режим воспроизведения без восстановления каких-либо дополнительных данных. Например, вы можете выполнить несколько операций восстановления из разностных резервных копий и затем запустить операцию RESTORE без предложения FROM, чтобы задать для базы данных режим воспроизведения, запустив тем самым процесс воспроизведения.
Необязательные параметры

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

Таблица 33.1. Необязательные параметры оператора RESTORE
ПараметрОписание
RESTRICTED_USERЗадает ограничение доступа к вновь восстановленной базе данных, чтобы разрешать доступ только ролям db_owner, dbcreater и sysadmin
FILE = номер_файлаУказывает используемый набор резервной копии, если носитель содержит более одного набора. Например, если задать значение 2, то будет использоваться второй набор резервной копии на данном носителе
PASSWORD = парольУказывает пароль для набора сохранения
MEDIANAME = имя_носителяУказывает имя носителя
MEDIAPASSWORD = парольУказывает пароль, который был присвоен этому набору носителей
MOVE 'имя_логического_файла' TO 'имя_файла_ОС'Изменяет местоположение восстанавливаемого файла, например: MOVE 'Northwind' TO 'D:\data\Northwind.mdf'. Вы можете использовать этот параметр, если выполняете восстановление на новом диске, поскольку старый диск непригоден
NORECOVERY | RECOVERY |STANDBY = файл_откатаПараметр NORECOVERY указывает, что воспроизведение транзакций (откат или повторное исполнение) не будет выполняться после восстановления. Использование этого параметра необходимо, если вы будете продолжать восстановление с других резервных копий (разностных или журнала транзакций). Используемый по умолчанию параметр RECOVERY указывает, что будет выполнена операция воспроизведения, причем будет выполнен откат всех нефиксированных изменений. Параметр STANDBY указывает, что на случай отмены операции воспроизведения будет создан файл отката
KEEP_REPLICATIONУказывает, что будут сохранены параметры репликации, если база данных восстанавливается на издателе
NOUNLOAD | UNLOADПараметр NOUNLOAD указывает, что после операции восстановления носитель не будет выгружаться из устройства (например, лента с резервной копией не будет перемотана в начало или извлечена). Параметр UNLOAD (принятый по умолчанию) указывает, что по окончании операции восстановления носитель будет выгружен
REPLACEУказывает, что SQL Server будет восстанавливать файлы данных, даже если эти файлы уже существуют. Существующие файлы данных будут удалены и записаны снова. Если вы не задали параметр REPLACE, то SQL Server проверяет, существует ли уже база данных, которую вы указали. Если она существует, то операция восстановления не выполняется. Эта мера предосторожности помогает избежать непреднамеренного восстановления поверх существующей базы данных
RESTARTУказывает, что SQL Server должен перезапускать операцию восстановления, если она была прервана
STATS [ = процент ]Указывает вывод сообщения после выполнения определенного процента операции восстановления. Его полезно использовать, если вы хотите следить за ходом выполнения операций
PARTIALУказывает, что нужно выполнить частичное восстановление
STOPAT = дата_времяУказывает, что базу данных следует восстановить (только восстановление журнала к состоянию, в котором она находилась на дату, транзакций) указанную значением дата_время
STOPATMARK = 'метка'Указывает, что операция восстановления выполняется, пока не встретится указанная метка
STOPBEFOREMARK = 'метка'Указывает, что операция восстановления заканчивается непосредственно перед указанной меткой
Примечание. Именованные транзакции – новая возможность SQL Server 2000. Эти именованные транзакции, создаваемые с помощью оператора BEGIN TRANSACTION ... WITH MARK имя_метки, позволяют вам использовать параметры STOPATMARK и STOPBEFOREMARK оператора RESTORE.
Практические советы.
Использование оператора RESTORE

В этой врезке мы рассмотрим несколько примеров использования оператора T-SQL RESTORE.

Следующий оператор восстанавливает файлы данных для базы данных Example:

RESTORE DATABASE Example
FROM Backup_Dev_1, Backup_Dev_2 
WITH 
NORECOVERY, 
STATS = 5 
GO

Следующий оператор восстанавливает журнал транзакций для базы данных Example:

RESTORE LOG Example
FROM Backup_Dev_3, Backup_Dev_4
WITH
NORECOVERY,
STATS = 5,
UNLOAD
GO

На экран будет выводиться процент выполнения операции, а также результаты восстановления. Будет указано количество восстановленных страниц, сколько времени длится восстановление и какова скорость (Мб/с).

Вы можете также восстановить эту базу данных с помощью следующего оператора:

RESTORE LOG Example
WITH RECOVERY 
GO

Вы снова увидите статистику, относящуюся к операции восстановления.

Планирование воспроизведения на случай аварии

Для увеличения времени работоспособности вашей системы недостаточно использовать кластеризацию ваших серверов (см. лекцию 12) или использовать RAID (см. лекцию 5) – вы должны также планировать воспроизведение на случай аварии до того, как она наступила. Вам необходимо знать, как выполняется качественное резервное копирование и восстановление, когда они требуются, но вы должны быть также готовы к воссозданию вашей системы с самого начала, если возникнет такая необходимость. Эта подготовка означает документирование и планирование. Кроме того, возможно, вам потребуется для обеспечения достаточного уровня восстанавливаемости использовать новое средство SQL Server 2000, которое называется доставкой журнала транзакций (log shipping). Это средство позволяет применять журналы транзакций основной системы к резервным системам.

Как DBA вы должны разработать план обеспечения максимального времени работоспособности вашей системы. Этот план должен включать следующие составляющие.

Все эти шаги предусматривают планирование и/или создание документации. Часто бывает так, что план воспроизведения не документируется, и только разработчик плана способен выполнить его, что может иметь катастрофические последствия, если этот человек отсутствует.

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

Если шаги создания вашей текущей конфигурации недостаточно документированы, то возможны проблемы, когда требуется перестроение вашей системы или даже когда к системе добавляется новое оборудование.

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

Создание отказоустойчивой среды

Как вы уже видели в лекции 5, использование отказоустойчивых томов RAID-матриц значительно снижает вероятность отказа системы. Диски являются механическими компонентами и, как таковые, подвержены износу. Использование отказоустойчивого тома, возможно, избавит вас от необходимости реинсталляции операционной системы и SQL Server и восстановления системы с резервных копий, что может оказаться дорогостоящим процессом, отнимающим много времени (дорогостоящим в смысле трудозатрат, а также потерь дохода, связанных с выходом системы из строя).

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

Подготовка к немедленному восстановлению

Будьте готовы к немедленному восстановлению базы данных. Резервные копии следует хранить вне рабочего места, чтобы сохранить их от катастроф, таких как пожар или затопление, но вы должны также держать под рукой дубликаты последних резервных копий, поскольку вам не всегда удастся быстро получить резервные копии, хранящиеся вне рабочего места. Использование промежуточной секции резервного копирования является распространенным способом хранения последних резервных копий по месту, а также повышения производительности резервного копирования и восстановления. Промежуточная секция резервного копирования находится в вашей сети и состоит из дисков, на которых сохраняются последние резервные копии баз данных и журналов транзакций. При необходимости восстановления вам не нужно использовать ленты, доставляя их из хранилища, находящегося вне рабочего места, – вы можете немедленно начать восстановление. Этот метод полезно использовать, если вам требуется немедленное восстановление, но он может оказаться достаточно дорогостоящим, поскольку вы должны выделять дополнительные ресурсы оборудования для хранения резервных копий. Вы должны оценить ваш бюджет и ваши потребности, чтобы определить, насколько осуществимо использование промежуточной секции резервного копирования в ваших условиях.

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

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

Доставка журнала (Log Shipping)

Средство доставки журнала (Log Shipping) SQL Server 2000 позволяет создать резервную систему и поддерживать ее на уровне текущего состояния базы данных путем применения журналов транзакций к этой резервной системе. Резервная система поддерживается в постоянном режиме воспроизведения с непрерывным применением журналов транзакций к этой системе. Хотя эта система находится в режиме воспроизведения, запросы по чтению все же допускаются, что позволяет вам использовать резервную базу данных для задач отчетности.

В случае катастрофического отказа на основном сервере резервный сервер можно быстро и легко преобразовать в новый основной сервер. Это средство уже использовалось многими при работе с SQL Server 7, но теперь оно официально поддерживается фирмой Microsoft с добавлением средств упрощения работы. К этим средствам относятся создание и поддержка резервных систем с помощью мастера плана обслуживания базы данных Database Maintenance Plan Wizard и агента SQL Server Agent.

Заключение

На этом мы заканчиваем рассмотрение операций резервного копирования, восстановления и воспроизведения баз данных. Вы узнали, как эффективно выполнять резервное копирование и восстановление системы и как выполняется воспроизведение в SQL Server. Вы видели, как выполнять эти операции с помощью Enterprise Manager и операторов T-SQL. В этой лекции описаны операции восстановления, а также подготовка критически важного плана восстановления на случай аварии. Помните, что защита системы является одной из главных обязанностей DBA.

Лекция 34. Управление пользователями и системой безопасности

Безопасность – главная составляющая успеха базы данных. Ограничение прав пользователей создает безопасность данных. Вы сможете управлять пользовательскими учетными записями подключения к SQL Server, понять принципы работы режимов аутентификации. Существует два режима аутентификации: режим аутентификации Windows и режим смешанной аутентификации. Каждый из них обладает рядом особенностей, с которыми вы познакомитесь в процессе изучения лекции. Особое внимание уделено T-SQL и его эффективному использованию. Системные хранимые процедуры sp_addlogin и sp_grantlogin помогут создавать пользовательские login-записи. Вы также рассмотрите улучшенное средство безопасности, включенное в SQL Server 2000, которое позволяет передавать защищенным образом учетные записи безопасности между серверами в среде Windows 2000.

В этой лекции вы узнаете, как управлять пользователями и системой безопасности в среде Microsoft SQL Server 2000. Вместе с планированием резервного копирования и восстановления, определением состава системы и управлением дисковым пространством управление системой безопасности является одной из наиболее характерных задач для администратора баз данных (DBA). Это также одна из наиболее важных задач, которые должен выполнять DBA. Если пренебречь вопросами безопасности системы, это может привести к потере или порче данных.

Эта лекция охватывает ряд тем, относящихся к управлению пользователями и системой безопасности. Вы узнаете о том, как создавать пользовательские login-записи* (пользовательские учетные записи подключения к SQL Server) и управлять ими, а также о режимах аутентификации; кроме того, вы узнаете об идентификаторах пользователей. Пользовательская login-запись (user login) используется для аутентификации доступа к SQL Server. Она может аутентифицироваться через систему Microsoft Windows NT, Windows 2000 или SQL Server. Идентификатор пользователя (user ID) используется, чтобы присваивать пользовательские полномочия для доступа к определенным объектам в отдельных базах данных. Идентификаторы пользователей связаны с пользовательскими учетными записями и могут содержать (или не содержать) одно и то же имя, как вы увидите далее. Вы также узнаете о типах полномочий, которые могут быть присвоены в SQL Server, а также об их использовании. Кроме того, вы узнаете, как использовать роли для более простого управления пользователями. И, наконец, вы узнаете о важном средстве в SQL Server 2000, которое называется делегированием учетной записи безопасности. К концу этой лекции вы получите знания, необходимые для управления пользовательскими login-записями и системой безопасности.

Создание и администрирование пользовательских login-записей

Начнем изучение средств управления пользователями и системой безопасности с рассмотрения пользовательских login-записей. В этом разделе мы опишем сначала, почему так важны login-записи, и рассмотрим методы аутентификации, которые можно использовать для поддержки login-записей. Затем мы рассмотрим три метода создания login-записей: использование SQL Server Enterprise Manager, использование Transact-SQL (T-SQL) и использование мастера создания учетных записей Create Login Wizard. И, наконец, мы увидим, как использовать Enterprise Manager и T-SQL для создания новых пользовательских login-записей.

Зачем нужно создавать пользовательские login-записи?

Пользовательские login-записи позволяют вам защищать свои данные от преднамеренного или непреднамеренного модифицирования несанкционированными (неавторизованными) пользователями. С помощью пользовательских login-записей SQL Server может аутентифицировать отдельных авторизованных пользователей. Каждой пользовательской login-записи присваивается уникальное имя и пароль. Каждому пользователю присваивается его собственная учетная login-запись для входа в SQL Server. Без пользовательских login-записей для всех соединений с SQL Server использовался бы один и тот же идентификатор, а это означает, что вы не могли бы создавать различные уровни безопасности для тех, кто осуществляет доступ к базе данных.

Вы можете создавать различные уровни безопасности, предоставляя различным учетным login-записям различные полномочия для доступа к объектам и выполнения функций. Вы можете также шифровать определенные объекты базы данных, такие как хранимые процедуры и представления, чтобы скрывать их определения от неавторизованных пользователей. Кроме того, используя пользовательские login-записи, вы можете разрешать вставку и обновление информации в определенных таблицах базы данных только некоторым пользователям и предоставлять доступ к этим таблицам по чтению основной массе пользователей.

Чтобы увидеть, как осуществляется ограничение доступа к данным с помощью пользовательских login-записей, вернемся к примеру, впервые представленному в лекции 18, где показано использование представлений для ограничения доступа к критически важным данным. Предположим, что у нас имеется таблица Employee, содержащая информацию о сотрудниках, включая имя каждого сотрудника, номер телефона, номер офиса), должность, заработную плату, надбавку и т.д. Чтобы воспрепятствовать доступу определенных пользователей к конфиденциальным данным этой таблицы, сначала нужно создать представление, содержащее только общедоступные данные, такие как имена сотрудников, номера телефонов и номера офисов. Затем, реализуя пользовательские login-записи, вы можете ограничить доступ к исходной таблице, разрешив при этом доступ всех пользователей к представлению. Но если не использовать возможности пользовательских login-записей, то любой пользователь будет иметь доступ и к представлению, и к таблице, что лишает смысла использование этого представления.

Режимы аутентификации

Для доступа к SQL Server можно использовать два режима аутентификации: режим аутентификации Windows (Windows Authentication) и режим смешанной аутентификации (Mixed Mode Authentication). В первом случае аутентификация пользователя осуществляется операционной системой Windows. Затем SQL Server использует аутентификацию этой операционной системы, чтобы определить, какие пользовательские полномочия можно применять в каждом случае. В смешанном режиме аутентификацию пользователя осуществляют как Windows NT/2000, так и SQL Server. Для доступа к SQL Server вы должны в любом случае сначала осуществить вход по учетной записи Windows NT/2000, поэтому при выборе режима аутентификации вы должны решить, нужно ли вам использовать аутентификацию SQL Server в дополнение к аутентификации Windows. Рассмотрим каждый из этих режимов аутентификации более подробно. Ниже в этом разделе вы узнаете, как реализовать оба этих режима.

Аутентификация в Windows

Как уже говорилось, при аутентификации с помощью Windows обеспечение безопасности для SQL Server осуществляет с помощью учетных записей система Windows NT/2000. При подсоединении пользователя к Windows NT/2000 эта система проверяет подлинность пользователя по его учетной записи. SQL Server "убеждается" в том, что пользователь был проверен системой Windows NT/2000, и разрешает доступ, основываясь на этой аутентификации. Для этого используется интеграция процесса проверки login-записей SQL Server с процессом проверки учетных записей в Windows. Атрибуты безопасности на уровне сети проверяются с помощью сложного процесса шифрования, обеспечиваемого в Windows NT/2000. После аутентификации операционной системой в этом режиме дальнейшая аутентификация для доступа к SQL Server уже не требуется. Для доступа к SQL Server вы должны только указать свой пароль доступа к Windows NT/2000.

Режим аутентификации Windows считается более надежным методом, чем режим смешанной аутентификации, за счет использования дополнительных средств безопасности. Это защищенная проверка и шифрование паролей, аудит, поддержка сроков действия паролей, минимальная длина паролей и автоматическое блокирование учетных записей после определенного количества безуспешных попыток входа.

Режим смешанной аутентификации

В режиме смешанной аутентификации пользователи могут осуществлять доступ к SQL Server с помощью аутентификации в Windows или аутентификации в SQL Server. При соединении, осуществляемом в этом режиме из незащищенной системы, SQL Server аутентифицирует данные входа, проверяя, имеется ли учетная login-запись для пользователя, запрашивающего вход. SQL Server осуществляет аутентификацию по этой учетной login-записи путем сравнения имени и пароля пользователя, подсоединяющегося к SQL Server, с информацией учетной login-записи, хранящейся в базе данных. Если для этого пользователя не создана учетная login-запись или пользователь неверно указал имя или пароль, то SQL Server не разрешает доступ.

Режим аутентификации Windows недоступен, если SQL Server работает под управлением Windows 95/98, поэтому вы должны применять на этих платформах аутентификацию SQL Server (указывая режим смешанной аутентификации). Кроме того аутентификация SQL Server требуется для Web-приложений (с помощью Microsoft Internet Information Server), поскольку пользователи этих приложений, скорее всего, находятся не в том же домене, где сервер, и поэтому для них нельзя использовать систему безопасности Windows. Для других приложений также может потребоваться аутентификация SQL Server: некоторые разработчики предпочитают использовать для своих приложений систему безопасности SQL Server, поскольку это упрощает обеспечение безопасности их приложений. Если приложения используют систему безопасности SQL Server (в доверенной сети), то разработчики этих приложений не обязаны обеспечивать аутентификацию внутри самих приложений, что упрощает их работу.

Задание режима аутентификации

Чтобы задать режим аутентификации, выполните следующие шаги.

  1. Откройте окно Enterprise Manager. В левой панели щелкните правой кнопкой мыши на имени сервера, содержащего базу данных, для которой вы хотите задать режим аутентификации, и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно SQL Server Properties. Щелкните на вкладке Security (Безопасность) (рис. 34.1).
  2. В этой вкладке вы можете выбрать как режим аутентификации, так и служебную учетную запись для запуска SQL Server. В секции Security выберите режим аутентификации: кнопка выбора SQL Server and Windows NT/2000 (смешанный режим) или Windows NT/2000 only (только Windows). Вы можете также задать уровень аудита входов по учетным записям. Соответствующая кнопка выбора определяет, какой тип аудита будет выполняться для входов (если вообще будет выполняться). Имеется четыре следующих уровня:
    • None (Нет). Аудит входов не выполняется. Это вариант, принятый по умолчанию.
    • Success (Успешный вход).Регистрируются все успешные попытки входа.
    • Failure (Безуспешный вход).Регистрируются все безуспешные попытки входа.
    • All (Все).Регистрируются все попытки входа.

    Вкладка Security (Безопасность) окна SQL Server Properties


    Рис. 34.1.  Вкладка Security (Безопасность) окна SQL Server Properties

    Примечание. Уровень аудита – это свойство базы данных. Определенный уровень аудита будет применяться ко всем входам.
  3. В секции Startup service account (Служебная учетная запись для запуска SQL Server) нужно указать, какую учетную запись Windows NT следует использовать при запуске службы SQL Server. Вы можете использовать встроенную учетную запись локальной системы (System account) или указать определенную учетную запись, такую как Administrator, и пароль. Щелкните на кнопке OK для подтверждения своих установок.
Login-записи и пользователи

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

Как уже говорилось, пользовательская учетная запись Windows NT/2000 может потребоваться для подсоединения к базе данных. Независимо от используемого режима аутентификации (аутентификация Windows NT/2000 или режим смешанной аутентификации) учетная запись, которую вы используете для подсоединения к SQL Server, называется login-записью SQL Server (учетной записью подключения к SQL Server). Кроме этой учетной записи, каждая база данных имеет набор пользовательских учетных псевдозаписей, присвоенных этой базе данных. Эти учетные псевдозаписи являются алиасами (альтернативными именами) для учетных login-записей SQL Server. Например, в базе данных у вас может быть пользователь с именем manager, связанный с login-записью guest, а база данных pubs может иметь пользователя с именем manager, связанного с login-записью sa. По умолчанию учетная login-запись SQL Server не имеет связанного с ней идентификатора пользователя (user ID); тем самым она не содержит никаких полномочий доступа.

Создание login-записей SQL Server

Вы можете выполнять большинство административных задач SQL Server, используя один из нескольких методов, и задача создания пользовательских login-записей не является исключением из этого правила. Как уже говорилось, вы можете создать login-запись, используя один из трех методов: с помощью Enterprise Manager, с помощью T-SQL или с помощью мастера создания login-записей Create Login Wizard. В этом разделе вы узнаете, как создавать login для SQL Server с помощью каждого их этих методов.

Использование Enterprise Manager для создания login-записей SQL Server

Чтобы создать login-запись для SQL Server с помощью Enterprise Manager, выполните следующие шаги.

  1. В левой панели Enterprise Manager раскройте группу серверов, раскройте сервер и затем раскройте папку Security. Щелкните правой кнопкой мыши на Logins и выберите из контекстного меню New Login (Создать login-запись), чтобы появилось окно свойств login-записи SQL Server Login Properties (рис. 34.2). В текстовом поле Name вкладки General введите имя login-записи. Если вы используете аутентификацию Windows, то это должно быть допустимое имя учетной записи Windows NT или Windows 2000. При этом в текстовом поле Domain (Домен) нужно указать домен Windows NT или Windows 2000. В секции Default (По умолчанию) укажите принятую по умолчанию базу данных и язык, который будет использоваться пользователем. В секции Authentication (Аутентификация) укажите, какая аутентификация будет использоваться: по учетной записи Windows NT или Windows 2000 (кнопка выбора Windows NT Authentication) или аутентификация в SQL Server (кнопка выбора SQL Server Authentication). Во втором случае будет использоваться смешанный режим аутентификации.
  2. Щелкните на вкладке Server Roles (Роли сервера) (рис. 34.3). В этой вкладке вы можете указать, какие роли на сервере сможет выбирать новая login-запись; для этого вы должны выбрать эти роли из списка ролей, доступных для данного пользователя. Щелкая на кнопке Properties, вы можете просматривать и модифицировать выбранную вами роль. (Роли описываются в разделе "Администрирование ролей баз данных" далее.)

     Вкладка General окна SQL Server Login Properties


    Рис. 34.2.  Вкладка General окна SQL Server Login Properties

    Вкладка Server Roles (Роли сервера) окна SQL Server Login Properties


    Рис. 34.3.  Вкладка Server Roles (Роли сервера) окна SQL Server Login Properties

  3. Щелкните на вкладке Database Access (Доступ к базе данных) (рис. 34.4). В этой вкладке вы можете указывать, к каким базам данных получит полномочия доступа данный пользователь. (О полномочиях доступа см. раздел "Администрирование полномочий доступа к базам данных" далее.) Вы можете выбрать несколько баз данных и ролей, имеющих доступ к этим базам данных.) Щелкнув на кнопке Properties, вы можете просматривать свойства ролей для баз данных и управлять ими.

    Вкладка Database Access (Доступ к базе данных) окна SQL Server Login Properties


    Рис. 34.4.  Вкладка Database Access (Доступ к базе данных) окна SQL Server Login Properties

  4. По окончании установки параметров сохраните login-запись, щелкнув на кнопке OK. Чтобы увидеть эту login-запись в списке других login-записей, щелкните на вкладке Logins в Enterprise Manager. Login-записи появятся в правой панели.
Использование T-SQL для создания login-записей

Для создания login-записи с помощью T-SQL используется хранимая процедура sp_addlogin или хранимая процедура sp_grantlogin. Хранимая процедура sp_addlogin позволяет только добавлять аутентифицированного в SQL Server пользователя к базе данных SQL Server. Хранимая процедура sp_grantlogin позволяет добавлять пользователя, аутентифицированного в системе Windows NT/2000.

Хранимая процедура sp_addlogin имеет следующий синтаксис:

sp_addlogin  [ @loginame = ] 'имя_login-записи'
         [  ,  [ @passwd = ] 'пароль' ]
         [  ,  [ @defdb = ] 'база данных' ]
         [  ,  [ @deflanguage = ] 'язык' ]
         [  ,  [ @sid = ] 'sid' ]
         [  ,  [ @encryptopt = ] 'параметр_шифрования' ]

Используются следующие необязательные параметры.

Ниже приводится простой пример добавления login-записи:

EXEC sp_addlogin 'PatB'

Не забудьте использовать ключевое слово EXEC перед именем хранимой процедуры.

Ниже приводится более сложный пример добавления login-записи:

sp_addlogin 'SharonR', 'mypassword', 'Northwind', 'us_english'

Эта команда создает пользователя с именем SharonR и паролем "mypassword." По умолчанию будет использоваться база данных Northwind, и язык по умолчанию – U.S. English. В обычном случае вы должны предоставить создание идентификатора безопасности (SID) SQL Server вместо самостоятельного создания этого идентификатора.

Хранимая процедура sp_grantlogin имеет следующий синтаксис:

sp_grantlogin 'имя_login-записи'

Ниже показан пример использования хранимой процедуры sp_grantlogin:

EXEC sp_grantlogin 'MOUNTAIN_DEW\DickB'

"DickB" – имя учетной записи Windows NT или Windows 2000, "MOUNTAIN_DEW" – имя системы.

Добавив эти login-записи, вы можете просматривать их в Enterprise Manager. Для этого щелкните на папке Logins в левой панели.

Использование мастера Create Login Wizard

Чтобы создать login-запись для SQL Server с помощью мастера Create Login Wizard, выполните следующие шаги.

  1. В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера. В меню Tools выберите пункт Wizards (Мастера). В появившемся диалоговом окне Select Wizard (Выбор мастера) раскройте папку Database, щелкните на Create Login Wizard (рис. 34.5) и затем щелкните на кнопке OK. Появится начальное окно мастера Create Login Wizard (рис. 34.6).
  2. Щелкните на кнопке Next (Далее), чтобы появилось окно Select Authentication Mode for This Login (Выбор режима аутентификации для данной login-записи) (рис. 34.7). В этом окне вы указываете, какой режим аутентификации будет использоваться, – аутентификация Windows (первая кнопка выбора) или аутентификация в SQL Server (Смешанный режим).

    Окно Select Wizard


    Рис. 34.5.  Окно Select Wizard

    Начальное окно мастера Create Login Wizard


    Рис. 34.6.  Начальное окно мастера Create Login Wizard

  3. Щелкните на кнопке Next, чтобы появилось окно Authentication with Windows NT (Аутентификация с помощью Windows) или Authentication With SQL Server (Аутентификация с помощью SQL Server), – в зависимости от режима аутентификации, выбранного вами на шаге 2. На рис. 34.8 показан второй вариант. В этом окне вы задаете Login ID (идентификатор login-записи) и пароль. Если у вас выбран вариант Windows NT Authentication, то вам нужно ввести имя в домене и имя пользовательской учетной записи для аутентификации.

     Окно Select Authentication Mode for This Login (Выбор режима аутентификации для данной login-записи)


    Рис. 34.7.  Окно Select Authentication Mode for This Login (Выбор режима аутентификации для данной login-записи)

    Окно Authentication with SQL Server (Аутентификация с помощью Windows)


    Рис. 34.8.  Окно Authentication with SQL Server (Аутентификация с помощью Windows)

  4. Щелкните на кнопке Next, чтобы появилось окно Grant Access to Security Roles (Предоставление доступа ролям безопасности) (рис. 34.9). В этом окне вы можете выбрать роли базы данных, которые будут присвоены данной login-записи.
  5. Щелкните на кнопке Next, чтобы появилось окно Grant Access to Databases (Предоставление доступа к базам данных) (рис. 34.10). В этом окне вы можете выбрать базы данных, к которым будет иметь доступ эта login-запись.
  6. Щелкните на кнопке Next, чтобы появилось окно Completing the Create Login Wizard (Завершение работы мастера) (рис. 34.11), где вы можете увидеть в текстовом поле сводку информации. Для внесения каких-либо изменений щелкните на кнопке Back (Назад) или щелкните на кнопке Finish (Готово), чтобы создать login-запись.

     Окно Grant Access to Security Roles (Предоставление доступа ролям безопасности)


    Рис. 34.9.  Окно Grant Access to Security Roles (Предоставление доступа ролям безопасности)

    Окно Grant Access to Databases (Предоставление доступа к базам данных)


    Рис. 34.10.  Окно Grant Access to Databases (Предоставление доступа к базам данных)

    Окно Completing the Create Login Wizard (Завершение работы мастера)


    Рис. 34.11.  Окно Completing the Create Login Wizard (Завершение работы мастера)

Создание пользователей SQL Server

Вы можете создавать пользователей SQL Server с помощью Enterprise Manager или T-SQL. (В SQL Server нет мастера, с помощью которого можно выполнять этот процесс.) В этом разделе вы узнаете, как использовать оба этих метода для создания пользователей SQL Server. Напомним, что пользователь SQL Server определяется для определенной базы данных, а полномочия доступа к этой базе данных присваиваются определенной пользовательской login-записи. Идентификатор пользователя (user ID) SQL Server можно рассматривать как аналог login-записи SQL Server, но они не обязательно имеют одинаковые имена.

Примечание. Чтобы создать пользователя SQL Server, у вас уже должна быть создана login-запись SQL Server, поскольку имя пользователя является ссылкой на login-запись SQL Server.
Использование Enterprise Manager для создания пользователей

В отличие от login-записей SQL Server, которые создаются из папки Security в Enterprise Manager, пользователи SQL Server создаются из папки определенной базы данных в левой панели Enterprise Manager. Для создания пользователей с помощью Enterprise Manager выполните следующие шаги.

  1. Щелкните правой кнопкой мыши на базе данных, в которой должен быть создан пользователь, укажите в контекстном меню команду New (Создать) и затем выберите пункт Database User (Пользователь базы данных), чтобы появилось окно свойств Database User Properties (рис. 34.12).

    Окно Database User Properties (Свойства пользователя базы данных)


    Рис. 34.12.  Окно Database User Properties (Свойства пользователя базы данных)

    В раскрывающемся списке Login name введите допустимое имя login-записи SQL Server и в текстовом поле User name введите имя нового пользователя. Затем укажите роли для базы данных, членом которых будет новый пользователь; для этого установите соответствующие флажки в списке Database role membership (Участие в ролях базы данных). Как будет показано ниже в этой лекции, присваивая полномочия этим ролям, вы можете применять эти полномочия к данному пользователю.
  2. Щелкните на кнопке Properties, чтобы появилось окно Database Role Properties (Свойства роли базы данных) (рис. 34.13). В этом окне вы можете модифицировать выбранную вами роль базы данных. Эта задача описывается в разделе "Администрирование ролей баз данных" далее.

    Окно Database Role Properties (Свойства роли базы данных)


    Рис. 34.13.  Окно Database Role Properties (Свойства роли базы данных)

  3. По окончании два раза щелкните на кнопке OK, чтобы создать пользователя базы данных.
Использование T-SQL для создания пользователей

Чтобы использовать T-SQL для создания пользователей базы данных, нужно выполнить хранимую процедуру sp_adduser. Эту хранимую процедуру можно запустить из ISQL или OSQL с использованием следующего синтаксиса:

sp_adduser	[ @loginame = ] 'имя_login-записи'
       [  ,  [ @name_in_db = ] 'пользователь' ]
       [  ,  [ @grpname = ] 'группа' ]

Имя_login-записи – это имя учетной login-записи SQL Server, которое является обязательным параметром. Переменная пользователь – это имя нового пользователя, и группа – это группа или роль, к которой будет принадлежать новый пользователь. Если значение параметра пользователь не указано, то оно совпадает со значением параметра имя_login-записи.

С помощью следующей команды создается новый пользователь базы данных с именем JackR и учетной записью Windows NT или Windows 2000 FORT_WORTH\ DB_User:

sp_adduser 'FORT_WORTH\DB_User', 'JackR'

"FORT_WORTH" – имя системы или домена. "DB_User" – имя учетной записи Windows NT или Windows 2000.

Администрирование полномочий доступа к базам данных

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

Полномочия на уровне сервера

Как уже говорилось, полномочия на уровне сервера присваиваются DBA и позволяют им выполнять задачи администрирования. Эти полномочия определяются по фиксированным ролям сервера. Пользовательским login-записям могут быть присвоены фиксированные роли на сервере, но эти роли нельзя модифицировать. (Роли на сервере описываются в разделе "Использование фиксированных ролей на сервере" далее.) К полномочиям на сервере относятся полномочия SHUTDOWN, CREATE DATABASE, BACKUP DATABASE и CHECKPOINT. Полномочия на сервере используются только для авторизации DBA, чтобы они могли выполнять административные задачи; их не нужно модифицировать или предоставлять отдельным пользователям.

Полномочия на уровне объектов базы данных

Полномочия на уровне объектов базы данных – это класс полномочий, которые предоставляются для доступа к объектам базы данных. Полномочия доступа к объектам необходимы для доступа к таблице или представлению с помощью таких операторов, как SELECT, INSERT, UPDATE и DELETE. Полномочия доступа к объектам также требуются для использования оператора EXECUTE, который применяется для запуска хранимых процедур. Для присваивания полномочий доступа к объектам используются Enterprise Manager и операторы T-SQL.

Использование Enterprise Manager для присваивания полномочий доступа к объектам

Чтобы использовать Enterprise Manager для предоставления полномочий доступа к объектам базы данных, выполните следующие шаги.

  1. Раскройте группу серверов, раскройте сервер, раскройте базу данных, для которой хотите присвоить полномочия, и щелкните на папке Users (Пользователи). В правой панели появится список пользователей. Щелкните правой кнопкой мыши на имени пользователя и выберите из контекстного меню пункт Properties, чтобы появилось диалоговое окно Database User Properties (рис. 34.14).

    Окно Database User Properties


    Рис. 34.14.  Окно Database User Properties

  2. Щелкните на кнопке Permissions (Полномочия), чтобы появилось окно Database User Properties (рис. 34.15).

    Вкладка Permissions окна Database User Properties


    Рис. 34.15.  Вкладка Permissions окна Database User Properties

    Для вызова этой вкладки вы можете также щелкнуть правой кнопкой мыши на имени данного пользователя, указать в контекстном меню пункт All Tasks (Все задачи) и выбрать пункт Manage Permissions (Управление полномочиями). В этой вкладке вы можете управлять полномочиями, присваиваемыми данному пользователю. Чтобы присвоить этому пользователю полномочия доступа к объектам внутри базы данных, установите нужные флажки в колонках SELECT, INSERT, UPDATE, DELETE, EXEC и DRI окна списка. ("DRI" – сокращение от "declarative referential integrity" – описательная целостность на уровне ссылок.) В колонке Object (Объект) содержится список объектов. Вы можете использовать кнопки выбора вверху этого окна, чтобы включить в список все объекты (первая кнопка выбора) или только те объекты, к которым уже имеет полномочия доступа данный пользователь.
Использование T-SQL для присваивания полномочий доступа к объектам

Чтобы использовать T-SQL для присваивания какому-либо пользователю полномочий доступа к объектам, вы должны выполнить оператор GRANT. Этот оператор имеет следующий синтаксис:

GRANT  { ALL | полномочия }
       	[ колонка ON {таблица | представление} ] |
       	[ ON таблица(колонка) ] |
       	[ ON представление(колонка) ] |
       	[ ON { хранимая_процедура | расширенная_процедура } ]
TO учетная_запись_безопасности
       	[ WITH GRANT OPTION ]
       	[ AS { группа | роль } ]

Параметр учетная_запись_безопасности может быть представлен одним из следующих типов учетных записей:

Использование ключевого слова GRANT OPTION позволяет пользователю или пользователям, указанным в данном операторе, предоставлять указанный тип полномочий другим пользователям. Это может оказаться полезным, если вы предоставляете полномочия другим DBA. Однако GRANT OPTION следует использовать с осторожностью.

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

Ниже приводится пример использования оператора GRANT:

GRANT  SELECT, INSERT, UPDATE
ON     	Customers 
TO     	MaryW 
WITH   GRANT OPTION 
AS     	Accounting

Параметр AS Accounting используется потому, что роль Accounting имеет полномочия на предоставление полномочий по таблице Customers. Ключевое слово GRANT OPTION позволяет пользователю MaryW предоставлять указанные полномочия другим пользователям.

Дополнительная информация. Для просмотра списка полномочий, которые можно указывать в операторе GRANT, найдите текст "GRANT, described (GRANT)" в индексе Books Online.
Использование T-SQL для отзыва полномочий по объектам

Для отзыва полномочий какого-либо пользователя по объектам вы можете использовать оператор T-SQL REVOKE. Оператор REVOKE имеет следующий синтаксис:

REVOKE  [ GRANT OPTION FOR ] 
        	{ ALL  [ PRIVILEGES ] | полномочия }
              			[ колонка ON {таблица | представление} ] |
              			[ ON таблица(колонка) ] |
              			[ ON представление(колонка) ] |
              			[ ON { хранимая_процедура | расширенная_процедура } ]
        	{ TO     | FROM } учетная_запись_безопасности
              			[ CASCADE ]
              			[ AS { группа | роль } ]

Параметр учетная_запись_безопасности может быть представлен одним из следующих типов учетных записей:

  1. Пользователь SQL Server.
  2. Роль SQL Server.
  3. Пользователь Windows NT или Windows 2000.
  4. Группа Windows NT или Windows 2000.

Ключевое слово GRANT OPTION FOR позволяет вам отзывать полномочия, которые вы предоставили с помощью ключевого слова GRANT OPTION, а также отзывать указанные здесь полномочия. Необязательный параметр AS указывает, кто имеет право на выполнение этого оператора REVOKE.

Ниже приводится пример использования оператора REVOKE:

REVOKE  	ALL
ON      		Customers 
FROM    	MaryW

Оператор REVOKE ALL выполнит отзыв всех полномочий, которые имеет пользователь MaryW по таблице Customers.

Дополнительная информация. Для просмотра списка полномочий, которые можно указывать в операторе REVOKE, найдите текст "REVOKE, described (REVOKE)" в индексе Books Online.
Полномочия на использование операторов для баз данных

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

Вы можете предоставлять полномочия на использование операторов с помощью Enterprise Manager или T-SQL.

Использование Enterprise Manager для предоставления полномочий на использование операторов

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

  1. Раскройте группу серверов, раскройте сервер и затем раскройте папку Databases. Щелкните правой кнопкой мыши на имени базы данных, для которой хотите присвоить полномочия, и выберите из контекстного меню пункт Properties, чтобы появилось окно Properties для этой базы данных (рис. 34.16).

    Окно Properties для базы данных


    Рис. 34.16.  Окно Properties для базы данных

  2. Щелкните на вкладке Permissions (рис. 34.17). Здесь вы можете присваивать полномочия на использование операторов пользователям и ролям, имеющим доступ к этой базе данных. Флажки в колонках определяют соответствующие полномочия на использование операторов и список колонки User/Role (Пользователь/Роль) содержит пользователей и роли, которые имеют доступ к этой базе данных.

    Вкладка Permissions окна Properties базы данных


    Рис. 34.17.  Вкладка Permissions окна Properties базы данных

Использование T-SQL для предоставления полномочий на использование операторов

Для предоставления полномочий на использование операторов какому-либо пользователю с помощью T-SQL применяется оператор GRANT. Этот оператор имеет следующий синтаксис:

GRANT  { ALL | оператор }
TO     	учетная_запись_безопасности

Пользователю могут быть предоставлены полномочия на использование операторов CREATE DATABASE, CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, BACKUP DATABASE и BACKUP LOG, описанных выше в этой лекции. Например, чтобы предоставить полномочия на использование операторов CREATE DATABASE и CREATE TABLE пользовательской учетной записи JackR, используйте следующий оператор:

GRANT  CREATE DATABASE, CREATE TABLE 
TO     	'JackR'

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

Использование T-SQL для отзыва полномочий на использование операторов

Вы можете использовать оператор T-SQL REVOKE для удаления из пользовательской учетной записи полномочий на использование операторов. Этот оператор имеет следующий синтаксис:

REVOKE  { ALL | оператор }
FROM     учетная_запись_безопасности

Например, для удаления из учетной записи пользователя JackR только полномочий на использование оператора CREATE DATABASE используйте следующий оператор:

REVOKE  	CREATE DATABASE 
FROM    	'JackR'

Как видите, удаление полномочий на использование операторов из пользовательской учетной записи не представляет каких-либо сложностей.

Администрирование ролей баз данных

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

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

Создание и модифицирование ролей

Для выполнения задач создания и модифицирования ролей баз данных используются те же средства, что и для выполнения большинства задач, относящихся к администрированию баз данных: Enterprise Manager или операторы T-SQL. (В SQL Server нет мастера для этих задач.) Используя любое из этих средств, вы должны выполнить следующие задачи при реализации роли.

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

Использование Enterprise Manager для администрирования ролей

Для создания ролей базы данных с помощью Enterprise Manager выполните следующие шаги.

  1. Раскройте группу серверов, раскройте сервер и затем раскройте папку Databases. Щелкните правой кнопкой мыши на имени базы данных, в которой хотите создать роль (мы будем использовать для данного примера Northwind), укажите в контекстном меню команду New и затем выберите пункт Database Role (Роль базы данных). Альтернативный способ – раскрыть базу данных, щелкнуть правой кнопкой мыши на Roles (Роли) и выбрать из контекстного меню пункт New Database Role (Создать роль базы данных). При любом способе появится окно Database Role Properties (Свойства роли базы данных) (рис. 34.18).

    Окно Database Role Properties (Свойства роли базы данных)


    Рис. 34.18.  Окно Database Role Properties (Свойства роли базы данных)

  2. Задайте описательное имя для роли в текстовом поле Name – выберите имя, которое поможет вам вспомнить назначение этой роли. На рис. 34.18 показано имя Accounts Payable (Счета кредиторов), выбранное для этой роли.
  3. Чтобы назначить пользователей для этой роли, щелкните на кнопке Add (Добавить). Появится список пользовательских учетных записей, имеющих доступ к соответствующей базе данных (рис. 34.19). Выберите пользователей, которых хотите назначить для этой роли. Для отмены выбора просто щелкните еще раз на имени соответствующего пользователя. По окончании выбора членов роли щелкните на кнопке OK, после чего произойдет создание данной роли. Произойдет возврат в окно Enterprise Manager.

    Диалоговое окно Add Role Members (Добавление членов роли)


    Рис. 34.19.  Диалоговое окно Add Role Members (Добавление членов роли)

  4. Чтобы задать полномочия для данной роли, откройте окно Database Role Properties. Для этого раскройте папку Roles, щелкните правой кнопкой мыши на имени роли и выберите из контекстного меню пункт Properties. Затем щелкните на кнопке Permissions, чтобы появилось окно Database Role Properties – Northwind (рис. 34.20).

    Окно Database Role Properties – Northwind


    Рис. 34.20.  Окно Database Role Properties – Northwind

В этом окне вы можете присваивать данной роли различные полномочия доступа к объектам базы данных, содержащей эту роль. Для этого установите нужные флажки в окне списка. Объекты базы данных приводятся в списке колонки Object. Вы можете использовать кнопки выбора вверху этого окна, чтобы включить в список все объекты (первая кнопка выбора) или только те объекты, к которым уже имеет полномочия доступа данная роль. Назначив данную роль какому-либо пользователю, вы предоставляете этому пользователю все полномочия, присвоенные данной роли.

После создания роли вы можете модифицировать ее в окне Database Role Properties. Чтобы модифицировать роль, выполните шаги, используемые для добавления полномочий к роли. Вы можете добавлять или удалять пользователей и полномочия в окне Database Role Properties.

Использование T-SQL для администрирования ролей

Вы можете также создавать роли с помощью хранимой процедуры sp_addrole. Эта хранимая процедура имеет следующий синтаксис:

sp_addrole  [ @rolename = ] ''роль'
        [  ,  [ @ownername = ] 'владелец' ]

Например, добавить роль с именем readonly к базе данных Northwind, используйте следующий оператор T-SQL:

USE Northwind 
GO
sp_addrole 'readonly' , 'dbo'
GO

Оператор USE Northwind указывает Northwind как текущую базу данных. Если не указать базу данных, то роль будет создана в базе данных, принятой у вас по умолчанию.

Эта хранимая процедура только создает роль. Чтобы добавить полномочия к этой роли, используйте описанный выше оператор GRANT. Для удаления полномочий из роли используйте оператор REVOKE, также описанный выше в этой лекции.

Например, чтобы добавить в роль readonly полномочия типа SELECT по таблицам Employees, Customers и Orders, используйте следующий оператор GRANT:

USE Northwind
GO 
GRANT  SELECT 
ON     	Employees 
TO     	readonly 
GO 
GRANT  SELECT 
ON     	Customers 
TO     	readonly 
GO

Чтобы добавить пользователей к этой роли, используйте хранимую процедуру sp_addrolemember. Хранимая процедура sp_addrolemember имеет следующий синтаксис:

sp_addrolemember 'роль', 'учетная_запись_безопасности'

Следующий оператор добавляет пользователя к роли readonly:

USE Northwind
GO
sp_addrolemember 'readonly' , 'Guest'
GO
Использование фиксированных ролей на сервере

Во время инсталляции SQL Server создается ряд заранее определенных ролей, которые применяются на уровне сервера. Эти фиксированные роли на сервере используются для предоставления полномочий DBA; они могут содержать как полномочия на уровне сервера, так и полномочия доступа к объектам и операторам. Ниже приводится список этих ролей.

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

  1. В окне Enterprise Manager раскройте группу серверов, раскройте сервер, раскройте папку Security и затем щелкните на Server Roles (Роли на сервере). Щелкните правой кнопкой мыши на фиксированной роли, к которой хотите добавить пользователя, и выберите из контекстного меню пункт Properties. Появится окно Server Role Properties (Свойства роли на сервере) (рис. 34.21).

     Окно Server Role Properties (Свойства роли на сервере)


    Рис. 34.21.  Окно Server Role Properties (Свойства роли на сервере)

  2. Чтобы добавить к этой роли пользовательскую учетную запись, сначала щелкните на кнопке Add. Появится диалоговое окно Add Members (рис. 34.22), где вы можете выбрать новых участников роли.

     Диалоговое окно Add Members


    Рис. 34.22.  Диалоговое окно Add Members

  3. Выбрав пользователей, которых хотите добавить к данной фиксированной роли, щелкните на кнопке OK. Произойдет возврат в окно Server Role Properties. Щелкните на кнопке OK, чтобы добавить пользователя к данной роли.

Делегирование учетной записи безопасности

SQL Server 2000 использует средства безопасности Windows 2000 с помощью модели безопасности Kerberos. (Информацию о модели безопасности Kerberos см. в лекции 2.) SQL Server 2000 использует протокол Kerberos для поддержки взаимной аутентификации между клиентом и сервером. Это позволяет передавать "верительные данные" клиента между компьютерами, чтобы этот клиент мог подсоединяться к нескольким серверам; при доступе к новому серверу этот сервер может продолжать работу с помощью верительных данных клиента. Это совместное использование верительных данных называется делегированием учетной записи безопасности.

Рассмотрим пример делегирования учетной записи безопасности. Предположим, что клиент подсоединяется к серверу ServerA как NTDOMAIN\AlexR, а ServerA подсоединяется к серверу ServerB. Тем самым ServerB "знает", что подсоединение осуществляется с помощью учетной записи системы безопасности NTDOMAIN\AlexR. Это позволяет клиенту обойтись без регистрации на сервере ServerB.

Если вы хотите использовать делегирование учетной записи безопасности, то все серверы, к которым вы подсоединяетесь, должны работать под управлением Windows 2000 с активизированной поддержкой Kerberos, а вы должны использовать службы Active Directory. Для делегирования работы в службах Active Directory должны быть установлены следующие параметры.

Конфигурирование SQL Server

Прежде чем использовать делегирование учетных записей безопасности, вы должны сконфигурировать SQL Server, чтобы он допускал делегирование. Делегирование вызывает взаимную аутентификацию. Чтобы можно было использовать делегирование учетных записей безопасности, SQL Server 2000 должен иметь SPN-имя (Service Principal Name), назначенное администратором учетных записей домена Windows 2000. SPN-имя должно быть присвоено служебной учетной записи сервера SQL Server на данном компьютере. SPN-имя необходимо для проверки того, что SQL Server верифицирован на определенном сервере и по определенному адресу порта (socket) администратором учетных записей домена Windows 2000. Администратор вашего домена может задать SPN-имя для SQL Server с помощью утилиты Setspn, входящей в комплект Windows 2000 Resource Kit. Чтобы создать SPN-имя для SQL Server, запустите следующий оператор:

setspn -A MSSQLSvc/Host:port serviceaccount

Вот пример использования этого оператора:

setspn -A MSSQLSvc/MyServer.MyDomain.MyCompany.com sqlaccount
Дополнительная информация. Более подробную информацию по утилите Setspn см. в документации Windows 2000.

Чтобы использовать делегирование учетных записей безопасности, вы должны также использовать TCP/IP. Вы не можете использовать именованные каналы (named pipes), поскольку SPN-имя указывает определенный порт (socket) TCP/IP. Если вы используете несколько портов, то должны иметь SPN для каждого порта.

Вы можете активизировать делегирование с помощью учетной записи LocalSystem. SQL Server выполнит саморегистрацию при запуске службы и автоматически зарегистрирует SPN-имя. Этот вариант проще, чем активизация с помощью пользовательской учетной записи в домене. Однако при закрытии SQL Server SPN-имена будут лишены регистрации для учетной записи LocalSystem. Чтобы активизировать делегирование под учетной записью LocalSystem, выполните следующий оператор в утилите Setspn:

setspn -A MSSQLSvc/Host:port serviceaccount
Примечание. Изменяя служебную учетную запись в SQL Server 2000, вы должны удалить все определенные SPN-имена и создать новые.

Заключение

В этой лекции вы узнали об управлении пользователями и системой безопасности SQL Server. Вы узнали, как используются учетные записи подключения (login-записи) и учетные записи пользователей базы данных, чтобы осуществлять доступ к базе данных, как создавать login-записи и пользователей баз данных, а также управлять ими. Вы также узнали, как упростить управление пользователями с помощью ролей базы данных, полномочия которых можно присваивать группе пользователей и модифицировать их из одной точки. Вы также узнали о специальной группе ролей, которые называются фиксированными ролями на сервере и используются для предоставления административных полномочий пользователям и DBA. И, наконец, мы рассмотрели улучшенное средство безопасности, включенное в SQL Server 2000, которое позволяет передавать защищенным образом учетные записи безопасности между серверами в среде Windows 2000. В лекции 35 вы узнаете о хранимых процедурах SQL Server и оптимизации ваших запросов.

Лекция 35. Использование SQL Query Аnalyzer и SQL Profiler

Эффективность операторов T-SQL определяется с помощью SQL Query Аnalyzer и SQL Profiler. Вы сможете улучшить производительность своих запросов. Query Аnalyzer представляет собой графический пользовательский интерфейс SQL. Для лекции характерно большое количество примеров, описывающих использование программ. Приводятся комментарии по ходу выполнения практических заданий, чтобы не допустить ошибок. Описываются методы оптимизации запросов и планов исполнения.

В этой лекции мы продолжим изучение хранимых процедур, которое начали в лекции 21. Вы узнаете, как анализировать хранимые процедуры и другие операторы T-SQL с помощью анализатора запросов Microsoft SQL Server Query Analyzer и профайлера SQL Server Profiler. Из этого анализа вы сможете определять, насколько эффективны операторы T-SQL. Эффективный запрос SQL Server использует подходящую последовательность операций и подходящие индексы для снижения количества обрабатываемых строк и минимизации количества операций ввода-вывода.

Используя Query Analyzer, вы можете видеть план исполнения, выбранный для оператора T-SQL оптимизатором запросов SQL Server. Оптимизатор запросов – это внутренний модуль, который ищет наилучший план исполнения для каждого оператора T-SQL. Оптимизатор запросов анализирует каждый оператор T-SQL, просматривает ряд возможных планов исполнения и выполняет оценку "стоимости" каждого плана с точки зрения требуемых ресурсов и времени обработки. Выбирается план с наименьшей стоимостью. Стоимость каждого плана определяется на основе имеющейся статистики, которая собрана системой и может оказаться устаревшей. Поскольку вы можете знать больше о вашей базе данных и ваших данных, чем оптимизатор запросов, то, возможно, вам удастся создать план, который окажется лучше, чем у оптимизатора запросов. Используя информацию, которую выдает Query Analyzer, вы можете определить, будет ли эффективным план оптимизатора запросов для определенного оператора, и если нет, то вы можете попытаться оптимизировать данный оператор, модифицируя его или используя подсказку SQL. В этой лекции вы узнаете, как оптимизировать операторы T-SQL, что будет дополнением к изучению использования Query Analyzer.

Используя Profiler, вы можете анализировать операции внутри вашей системы SQL Server, чтобы определять, какие операторы SQL и хранимые процедуры используют излишние системные ресурсы. Обладая этой информацией, вы можете сосредоточить свои усилия по настройке в первую очередь на этих операторах и хранимых процедурах. Кроме описания того, как использовать Profiler, в этой лекции также показано, как наиболее эффективно использовать информацию, получаемую с помощью Profiler.

Использование SQL Query Аnalyzer

Утилита Query Analyzer поставляется вместе с Microsoft SQL Server 2000 взамен Interactive SQL for Windows (ISQL/W) как графический пользовательский интерфейс (GUI) SQL, но вы, возможно, обратили внимание, что утилита Query Analyzer представлена как isqlw.exe в диспетчере задач. Вы можете использовать Query Analyzer для обработки операторов T-SQL и просмотра результатов этих операторов. Query Analyzer можно также использовать как средство отладки для оценки плана исполнения, который генерируется оптимизатором запросов для вашего оператора T-SQL.

Выполнение операторов T-SQL

Выполнение операторов T-SQL и вывод результатов этих операторов являются основными возможностями Query Analyzer. Чтобы использовать Query Analyzer для выполнения оператора T-SQL, выполните следующие шаги.

  1. Щелкните на кнопке Start (Пуск), укажите Programs, укажите Microsoft SQL Server и затем выберите Query Analyzer. Появится диалоговое окно Connect to SQL Server (Подсоединение к SQL Server) (рис. 35.1). Это диалоговое окно используется для соединения с системой SQL Server.

    Диалоговое окно Connect to SQL Server (Подсоединение к SQL Server)


    Рис. 35.1.  Диалоговое окно Connect to SQL Server (Подсоединение к SQL Server)

  2. Введите имя сервера в комбинированном поле с раскрывающимся списком. Это может быть имя локального сервера или удаленного сервера. На рис. 35.1 в этом поле введена точка (.). Ввод точки указывает, что вы хотите подсоединиться к локальному серверу. Установка флажка непосредственно под полем SQL Server указывает, что вы хотите запустить SQL Server, если он еще не запущен. В секции Connect using (Подсоединяться с использованием) выберите метод аутентификации, который хотите использовать для подсоединения к SQL Server. Если выбрать вариант Windows NT authentication (Аутентификация Windows), то вам не нужно указывать имя пользователя или пароль, поскольку для аутентификации доступа к SQL Server будет использоваться учетная запись Microsoft Windows 2000. Если выбрать вариант SQL Server authentication (Аутентификация в SQL Server), то для доступа к SQL Server нужно указать имя пользователя SQL Server (Login name) и пароль (Password).
  3. Щелкните на кнопке OK для подсоединения к указанному серверу SQL и для запуска Query Analyzer. При первоначальном появлении окна Query Analyzer видны только панель Query и панели навигации, но этот вид изменяется, как только вы начинаете запускать операторы T-SQL. Разверните панель Query для заполнения всей правой стороны окна Query Analyzer (рис. 35.2). В раскрывающемся списке панели инструментов выберите базу данных, в которой хотите запускать запросы. На рис. 35.2 выбрана база данных master. Для нашего примера щелкните на направленной вниз стрелке и выберите Northwind.
  4. После выбора базы данных введите в правой панели оператор T-SQL – в данном случае – SELECT * FROM Customers. Теперь у вас появляется несколько возможностей. Вы можете проверить синтаксис данного оператора T-SQL, щелкнув на кнопке Parse Query (Синтаксическая проверка запроса) в панели инструментов (синяя пометка ["галочка"]), или можете запустить оператор, щелкнув на кнопке Execute Query (Выполнить запрос) (зеленый треугольник, указывающий вправо). Вы можете остановить выполнение запроса, щелкнув на кнопке Cancel Executing Query (Отменить выполнение запроса) (квадрат). На рис. 35.3 показан выполненный запрос по таблице Customers базы данных Northwind.

    После запуска оператора T-SQL утилита Query Analyzer создает панель с возможностью вертикальной и горизонтальной прокрутки для просмотра результатов, как это показано на рис. 35.3. Query Analyzer можно также использовать как средство, помогающее вам в настройке ваших операторов T-SQL, как мы увидим в разделе "Оптимизация операторов T-SQL" ниже в этой лекции.

Окно Query Analyzer


увеличить изображение

Рис. 35.2.  Окно Query Analyzer

Выполненный запрос в панели Query Analyzer


увеличить изображение

Рис. 35.3.  Выполненный запрос в панели Query Analyzer

Просмотр планов исполнения и модифицирование операторов T-SQL

Как уже говорилось, вы можете также использовать Query Analyzer для просмотра плана исполнения, выбранного оптимизатором запросов для оператора T-SQL. Это средство позволяет определить, насколько эффективен ваш оператор T-SQL и какие пути выбраны для исполнения и доступа к данным. Вы можете затем внести изменения в этот оператор T-SQL и схему базы данных и затем определить, как это влияет на производительность. Чтобы использовать Query Analyzer для просмотра оценочного плана исполнения, выполните следующие шаги.

  1. В окне Query Analyzer введите оператор T-SQL, чтобы выполнить его оценку с помощью Query Analyzer, как это описано выше, и затем щелкните на кнопке Display Estimated Execution Plan (Отобразить оценочный план исполнения) (кнопка справа от раскрывающегося списка выбора базы данных) или нажмите клавиши Ctrl+L. Появится панель Estimated Execution Plan (рис. 35.4). В этой панели запрос представлен в графическом виде; показана также "стоимость" каждой операции. Здесь также показан метод доступа к данным. В панели (рис. 35.4), появляется имя индекса Customers.PK_Customers, а это означает, что для доступа к данным используется кластеризованный индекс Customers.PK_Customers.

    Панель Estimated Execution Plan


    увеличить изображение

    Рис. 35.4.  Панель Estimated Execution Plan

  2. Панель Estimated Execution Plan предоставляет доступ к дополнительным данным об операциях, показанных в этой панели. Чтобы увидеть эти дополнительные данные для любой операции, задержите указатель мыши на значке этой операции. Появится всплывающее окно, содержащее дополнительные данные (рис. 35.5).

    Просмотр дополнительных данных об операции


    увеличить изображение

    Рис. 35.5.  Просмотр дополнительных данных об операции

    Это всплывающее окно содержит следующую информацию:
    • Physical operation/Logical operation (Физическая операция/Логическая операция). Операции, выполняемые данным запросом, такие как индексное сканирование, связывание (join), агрегирование и т.д. Если физический оператор представлен красным цветом, это означает, что оптимизатор запросов выдал предупреждение и вы должны внести исправления в ваш оператор T-SQL.
    • Estimated row count (Оценка количества строк). Количество строк, которое (по оценке Query Optimizer) будет выбрано данной операцией.
    • Estimated Row Size (Оценка размера строк). Оценка размера считываемых строк в байтах.
    • Estimated I/O cost/Estimated CPU cost (Оценка стоимости ввода-вывода/Оценка стоимости ЦП). Оценка ресурсов ввода-вывода и времени процессора, которые будут использоваться этой операцией. Меньшее значение соответствует большей эффективности оператора T-SQL
    • Estimated number of executes (Оценка количества выполнений).Приблизительное количество выполнений данной операции во время выполнения данного оператора T-SQL.
    • Estimated cost (Оценка стоимости). Стоимость операции по оценке оптимизатора запросов. Эта стоимость показана в процентах от полной стоимости данного оператора T-SQL.
    • Estimated subtree Cost (Оценка стоимости поддеревьев). Оценка стоимости выполнения предыдущих частей и данной части оператора T-SQL. Если имеется несколько поддеревьев, то это средство позволяет просматривать стоимость выполнения каждого поддерева.
    • Argument (Параметры). Параметры, используемые данным оператором T-SQL.
Примечание. План исполнения описывает, как оптимизатор запросов будет исполнять оператор T-SQL. Этот план показывает типы операций, которые будут использоваться, и порядок, в котором они будут выполняться. Метод доступа к данным описывает, как будет осуществляться доступ к объектам базы данных (таблицам, индексам и т.д.). План и метод доступа связаны друг с другом: метод доступа к данным иногда рассматривается как часть плана исполнения, но его можно также рассматривать отдельно.

Далее мы рассмотрим некоторые более сложные примеры использования Query Analyzer. Эти примеры также показывают влияние неэффективных операторов T-SQL на снижение производительности за счет увеличения времени отклика и использования системных ресурсов, которые могли бы использоваться другими процессами. Сначала мы рассмотрим пример использования Query Analyzer для просмотра и модифицирования плана исполнения оператора T-SQL. Как уже говорилось, за счет модифицирования ваших операторов T-SQL вам, возможно, удастся получить для них более высокую производительность. Во многих случаях вы можете создать более эффективный и при этом функционально эквивалентный оператор T-SQL. Затем мы будем рассматривать все более сложные оценочные планы исполнения для нескольких типов операторов T-SQL.

В примерах остальной части этого раздела используется таблица Orders базы данных Northwind. Посмотрим, как организована эта таблица. Когда мы будем рассматривать примеры, эта информация поможет нам определить, насколько приемлемым является план исполнения, выбранный оптимизатором запросов. Таблица Orders имеет кластеризованный индекс с именем PK_Orders по колонке OrderID и восемь других индексов, что показано в диалоговом окне Manage Indexes (Управление индексами) (рис. 35.6).

Диалоговое окно Manage Indexes (Управление индексами)


Рис. 35.6.  Диалоговое окно Manage Indexes (Управление индексами)

Для доступа к этому окну с помощью Enterprise Manager раскройте группу серверов, раскройте сервер, раскройте папку Databases, раскройте базу данных Northwind и щелкните на папке Tables. Щелкните правой кнопкой мыши на таблице Orders в правой панели, укажите в контекстном меню All Tasks (Все задачи) и затем выберите Manage Indexes. Или просто выберите пункт Manage Indexes из меню Tools окна Query Analyzer и затем выберите из раскрывающегося меню таблицу Orders.

Просмотр плана для оператора SELECT и модифицирование этого оператора

В этом разделе мы рассмотрим запрос информации по заказам (orders), помещенным сотрудником (employee), идентификационный номер которого (employee ID) равен 4. Вот этот запрос:

SELECT OrderID, CustomerID, EmployeeID, OrderDate 
FROM Orders
WHERE EmployeeID = 4

В данной организации каждый сотрудник обрабатывает небольшую часть от всех заказов, поэтому вы, вероятно, предполагаете, что SQL Server будет использовать при обработке этого запроса индекс EmployeeID. Вместо этого Query Analyzer информирует вас, что SQL Server будет использовать доступ с помощью кластеризованного индекса PK_Orders (рис. 35.7).

Панель Estimated Execution Plan, где показано, что будет использоваться кластеризованный индекс PK_Orders


увеличить изображение

Рис. 35.7.  Панель Estimated Execution Plan, где показано, что будет использоваться кластеризованный индекс PK_Orders

Чтобы оптимизатор запросов использовал вместо этого индекс EmployeeID, вы можете использовать подсказку в операторе SELECT, как показано в следующем операторе. (См. раздел "Использование подсказок" далее.)

SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM Orders WITH (INDEX(EmployeeID))
WHERE EmployeeID = 5
Примечание. В Microsoft SQL Server 7 предпочтительной подсказкой по индексам было INDEX=имя_индекса. С появлением SQL Server 2000 предпочтительной подсказкой по индексам стало INDEX(имя_индекса).

Включая в команду эту дополнительную информацию, вы указываете оптимизатору запросов, что нужно использовать нужный вам план исполнения, а не тот, что был выбран для вас оптимизатором. На рис. 35.8 показана панель Estimated Execution Plan с измененным планом. Как видно из представленного в панели метода доступа, индекс EmployeeID будет использоваться в качестве входного параметра для процесса поиска по закладкам (bookmark lookup), который выполнит затем выборку данных из базы данных. (Процесс поиска по закладкам ищет внутренний идентификатор для строки данных.)

Панель Estimated Execution Plan с измененным планом


увеличить изображение

Рис. 35.8.  Панель Estimated Execution Plan с измененным планом

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

Внимание. Используя подсказку, переопределяющую план оптимизатора запросов, вы делаете это на свой страх и риск. Хотя здесь нет или почти нет опасности потери или порчи данных, вы можете ухудшить производительность системы.
Просмотр плана для операции связывания

Выполнение какой-либо операции связывания (join) включает в себя намного больше процессов, чем будет показано в панели Estimated Execution Plan ниже в этой лекции. Операция связывания выполняет доступ к нескольким таблицам, сопровождаемый связыванием (объединением) считываемых данных. (Операции связывания рассматриваются в лекции 14.) Вот пример оператора с операцией связывания:

SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName, 
	LastName, OrderDate
FROM Orders JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID

Сюда включен оператор SQL-92 JOIN. Использование этого оператора является рекомендованным способом связывания в SQL Server 2000. В следующем операторе используется более традиционный синтаксис связывания, который по-прежнему поддерживается в SQL Server:

SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,  
    	LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID

Любой из этих операторов T-SQL связывает таблицы Orders и Employees по колонке EmployeeID. Результирующий оценочный план исполнения показан на рис. 35.9.

 Операция связывания, показанная в панели Estimated Execution Plan


увеличить изображение

Рис. 35.9.  Операция связывания, показанная в панели Estimated Execution Plan

В этой панели видно, какое из двух поддеревьев имеет более высокую стоимость. Вы также видите тип планируемой операции связывания. SQL Server поддерживает несколько операций связывания, включая хеш-связывание, связывание вложенных цепочек и связывание слиянием. При использовании комплексной операции связывания план исполнения может оказаться очень сложным. (Query Analyzer регулирует размер панели Estimated Execution Plan, чтобы вместить нужно количество ветвей.) Поскольку нашей целью является сокращение времени ЦП и количества операций ввода-вывода, вам нужно попытаться определить, можно ли выбрать лучший план исполнения. В некоторых случаях вы можете применить подсказку, указывающую использование определенного индекса, сокращая тем самым время использования ЦП и интенсивность операций ввода-вывода. Вы можете также использовать подсказки в операциях связывания таблиц. Для запроса (рис. 35.9), возможно, выбран наилучший план исполнения, поскольку в предложении FROM связывание является единственной операцией.

Просмотр плана для операции агрегирования

Показанный здесь оператор T-SQL выполняет не только операцию связывания, но также операцию агрегирования:

SET QUOTED_ IDENTIFIER ON 
GO 
SELECT CustomerID, SUM("Order Details".UnitPrice)
FROM Orders JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID
GROUP BY CustomerID

Панель Estimated Execution Plan для этой комплексной операции показана на рис. 35.10.

Операция агрегирования, представленная в панели Estimated Execution Plan


увеличить изображение

Рис. 35.10.  Операция агрегирования, представленная в панели Estimated Execution Plan

Примечание. Поскольку имя таблицы Order Details содержит ключевое слово и пробел, здесь должен использоваться параметр SET QUOTED_IDENTIFIER ON. Это позволяет указывать имя таблицы Order Details в кавычках. Для получения более подробной информации по этому параметру найдите "SET QUOTED_IDENTIFIER" Books Online.
Просмотр плана для хранимой процедуры

Для просмотра плана исполнения хранимой процедуры нужно просто вызвать эту хранимую процедуру из окна Query Analyzer. В панели Query Analyzer будет выведен оценочный план вызванной вами хранимой процедуры. На рис. 35.11 показан план для процедуры sp_who. (Отметим, что план исполнения этой широко используемой хранимой процедуры очень сложен.) Вы можете просматривать план исполнения хранимой процедуры, не зная, какие операторы T-SQL образуют эту процедуру.

План исполнения хранимой процедуры, показанный в панели Estimated Execution Plan


увеличить изображение

Рис. 35.11.  План исполнения хранимой процедуры, показанный в панели Estimated Execution Plan

Использование браузера объектов

Браузер объектов (Object Browser) – это расширение в Query Analyzer, включенное в SQL Server 2000. Запустив Query Analyzer, вы увидите браузер объектов в левой части этого окна. Браузер объектов разбит на две секции: секция объектов баз данных и секция общих объектов (Common objects). В секции объектов баз данных вы можете выполнять перемещение по объектам, таким как таблицы и представления. В секции общих объектов обеспечивается удобный доступ к системным объектам и функциям. Вам нужно выполнить просмотр в браузере объектов, чтобы выяснить, какую информацию он содержит, и затем определить, что вы можете использовать.

Объекты базы данных

Верхняя секция браузера объектов содержит объекты баз данных. Вы сразу видите базы данных по умолчанию и любые созданные вами базы данных под обозначением системы SQL Server, которой они принадлежат. Чтобы увидеть информацию, которая содержится в браузере объектов, нужно просто раскрыть объекты. Раскроем базу данных Northwind и затем раскроем папку User Tables (Пользовательские таблицы). Вы увидите таблицы базы данных Northwind (рис. 35.12).

Просмотр таблиц в браузере объектов


увеличить изображение

Рис. 35.12.  Просмотр таблиц в браузере объектов

Затем вы можете раскрывать определенные пользователем таблицы и затем раскрывать папки, содержащие информацию о колонках, индексах, ограничениях, зависимостях и триггерах. На рис. 35.13 раскрыта таблица Orders. Вы можете также раскрывать соответствующие папки для просмотра информации о системных таблицах, представлениях, хранимых процедурах, функциях и определенных пользователем типах данных.

Доступ к информации базы данных внутри Query Analyzer – очень удобное средство, поскольку это позволяет создавать операторы SQL и хранимые процедуры без необходимости поиска информации об объектах вне Query Analyzer. Вы можете не только просматривать информацию в браузере объектов, но также редактировать объекты, перемещать объекты методом "drag and drop" и даже формировать сценарии создания и модифицирования объектов. Это еще более расширяет функциональные возможности Query Analyzer.

Секция Common Objects

Нижняя часть браузера объектов – это папка с именем Common Objects (Общие объекты) (рис. 35.14).

Раскрытие таблицы в браузере объектов


увеличить изображение

Рис. 35.13.  Раскрытие таблицы в браузере объектов

Раскрытие папки в секции Common objects (Общие объекты)  браузера объектов


увеличить изображение

Рис. 35.14.  Раскрытие папки в секции Common objects (Общие объекты) браузера объектов

Внутри этой папки находятся папки, содержащие информацию о таких объектах, как функции конфигурирования, функции курсоров, функции даты и времени, а также математические функции. Тем самым вы получаете простой доступ к функциям без необходимости поиска их синтаксиса.

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

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

Просмотр параметров в браузере объектов


увеличить изображение

Рис. 35.15.  Просмотр параметров в браузере объектов

Использование SQL Profiler

В дополнение к использованию Query Analyzer для поиска неэффективных операторов T-SQL вы можете также использовать утилиту SQL Server Profiler. Profiler позволяет наблюдать за всеми операторами T-SQL, которые выполняются в системе, с графическим отображением информации об этих операторах. Profiler также предоставляет возможности сортировки и фильтрации, которые можно использовать для выявления операторов T-SQL, использующих основную часть ресурсов ЦП и ввода-вывода. Обладая этой информацией, вы можете определять, каким операторам T-SQL уделить основное внимание для их настройки. Операторы T-SQL, которые вызываются из приложения, можно просматривать в Profiler; при этом вам не требуется доступ исходному коду самого приложения.

Утилита Profiler в SQL Server 2000 действует аналогично утилите Profiler в SQL Server 7, но она содержит некоторые улучшения. Одним из полезных дополнений является шаблон трассировки (trace template), который можно использовать для создания файлов трассировки. (Трассировку нужно по-прежнему создавать до того, как вы сможете использовать ее для мониторинга операций SQL Server.) В SQL Server трассировки должны были создаваться вручную.

Для вызова утилиты Profiler и запуска трассировки выполните следующие шаги.

  1. Щелкните на кнопке Start, укажите пункт Programs, укажите Microsoft SQL Server и затем выберите Profiler. При первоначальном открытии окна Profiler оно будет пустым. Не будет открыто ни одной панели, и не будет выполняться никакого профилирования в SQL Server.
  2. Чтобы начать создание профилирование, вы должны выбрать для выполнения существующий шаблон трассировки или создать новый шаблон трассировки для выполнения. (Процесс запуска описан на шаге 4.) SQL Server 2000 Profiler предоставляет для выбора целый ряд шаблонов трассировки. Использование этих шаблонов трассировки может сэкономить вам много времен, поскольку вам не нужно создавать трассировку с самого начала. Чтобы увидеть список шаблонов трассировки, щелкните на меню File (Файл), укажите команду Open (Открыть) и выберите пункт Trace Templates (Шаблоны трассировки), чтобы появилось диалоговое окно Open (рис. 35.16).

    Диалоговое окно Open со списком шаблонов трассировки


    Рис. 35.16.  Диалоговое окно Open со списком шаблонов трассировки

    Имеются следующие шаблоны трассировки, поставляемые вместе с SQL Server.
    • SQLServerProfilerSP_Counts.tdf. Подсчитывает количество запущенных хранимых процедур. Результаты группируются по именам хранимых процедур и содержат количество запусков соответствующей процедуры.
    • SQLServerProfilerStandard.tdf. Собирает общую информацию о соединениях, выполненных хранимых процедурах и пакетах SQL в порядке их выполнения.
    • SQLServerProfilerTSQL.tdf. Собирает информацию обо всех операторах T-SQL в порядке их поступления в SQL Server от пользователей. Эта трассировка содержит просто операторы T-SQL и моменты времени их запуска.
    • SQLServerProfilerTSQL_Duration.tdf. Выводит запущенные операторы T-SQL, а также время (в миллисекундах), которое потребовалось для выполнения этих операторов.
    • SQLServerProfilerTSQL_Grouped.tdf. Собирает данные, аналогичные тому, что собирает SQLServerProfilerTSQL, но группирует операторы по пользователям, запустившим эти операторы.
    • SQLServerProfilerTSQL_Replay.tdf. Предоставляет подробную информацию о запускавшихся операторах T-SQL. Эта трассировка содержит данные, которые можно использовать для воспроизведения операторов T-SQL в Query Analyzer.
    • SQLServerProfilerTSQL_SPs.tdf . Выводит указанные хранимые процедуры, а также команды T-SQL внутри этих процедур. Результаты выводятся в порядке выполнения.
    • SQLServerProfilerTuning.tdf. Собирает данные о хранимой процедуре и выполнении пакета SQL.
    Эти шаблоны трассировки могут оказаться очень полезными. Например, шаблон трассировки SQLServerProfilerTSQL_Duration может помочь вам в определении операторов T-SQL, на выполнение которых требуется больше всего времени. Эта информация может послужить отправной точкой для оптимизации запроса. Оператор может занимать много времени, потому что он выполняет много работы или, может быть, потому, что он действует неэффективно. Как вы увидите на следующем шаге, для любой трассировки у вас должен использоваться заранее определенный шаблон.
  3. Для запуска трассировки щелкните на File, укажите команду New (Создать) и затем выберите пункт Trace (Трассировка). Появится диалоговое окно Connect to SQL Server (рис. 35.17). В этом диалоговом окне выберите систему SQL Server для трассировки и затем щелкните на кнопке OK.

    Диалоговое окно Connect to SQL Server


    Рис. 35.17.  Диалоговое окно Connect to SQL Server

  4. Появится окно Trace Properties (Свойства трассировки) (рис. 35.18). Во вкладке General (Общие) вы можете ввести имя трассировки (поле Trace name) и выбрать шаблон трассировки (trace template), чтобы использовать его как отправную точку. Для данного примера выберите шаблон SQLServerProfilerTSQLDuration. В нижней части вкладки вы можете указать, где хотите сохранять трассировку – в файле (Save in file) и/или в таблице SQL Server (Save in table). Если не установлен ни один из этих флажков, то результаты трассировки будут выводиться только на экран. Кроме того, вы можете задать время окончания трассировки (флажок и поле Enable trace stop time). Это может оказаться очень полезным для долговременных трассировок.

    Вкладка General окна Trace Properties (Свойства трассировки)


    Рис. 35.18.  Вкладка General окна Trace Properties (Свойства трассировки)

  5. Далее щелкните на вкладке Events (События) (рис. 35.19).

     Вкладка Events (События) окна Trace Properties


    Рис. 35.19.  Вкладка Events (События) окна Trace Properties

    В этой вкладке вы можете выбрать одно или несколько событий, которые будут отслеживаться в данной трассировке. Можно отслеживать целый ряд классов (категорий) событий и конкретных событий. В окне списка Available event classes (Имеющиеся классы событий) содержатся такие классы событий, как Cursors (Курсоры), Errors and Warnings (Ошибки и предупреждения), Locks (Блокировки), Objects (Объекты), Scans (Сканирования), SQL Operators (Операторы SQL), Stored Procedures (Хранимые процедуры), Transactions (Транзакции) и TSQL.
  6. После выбора событий, трассировку которых вы хотите выполнять, щелкните на вкладке Data Columns (Колонки данных) (рис. 35.20). В этой вкладке укажите, сбор каких данных будет выполняться во время данной трассировки. В эти данные можно включать время окончания, идентификатор объекта и т.д.

      Вкладка Data Columns (Колонки данных) окна Trace Properties


    Рис. 35.20.  Вкладка Data Columns (Колонки данных) окна Trace Properties

  7. Щелкните на вкладке Filters (Фильтры) (рис. 35.21). В этой вкладке вы можете указывать, нужно ли, чтобы утилита Profiler включала или исключала определенные события. Например, вам следует исключить трассировку самой утилиты Profiler. (Это установка по умолчанию.) Исключая процессы SQL Server, вы делаете окно Profiler менее насыщенным и более удобным для чтения.
  8. По окончании установки параметров щелкните на кнопке Run для запуска данной трассировки. Если вы внесли какие-либо изменения в шаблон трассировки, то рекомендуется сохранить этот модифицированный шаблон трассировки под другим именем с помощью команды Save As меню File. После запуска трассировки в окне Profiler будут выводиться события по мере их возникновения. В соответствии с шаблоном трассировки, выбранным в этом примере, события будут сортироваться по длительности (в миллисекундах). На рис. 35.22 показано окно Profiler с результатами трассировки.
Внимание. Profiler может использовать значительную часть системных ресурсов в условиях большой загруженности системы. Чем больше событий отслеживается в трассировке, тем выше дополнительная нагрузка на систему.

 Вкладка Filters (Фильтры) окна Trace Properties


Рис. 35.21.  Вкладка Filters (Фильтры) окна Trace Properties

Выполняемая трассировка


увеличить изображение

Рис. 35.22.  Выполняемая трассировка

Оптимизация операторов T-SQL

В предыдущих разделах вы изучали, как следить за выполнением операторов T-SQL с помощью утилиты Profiler и как определять план исполнения и метод доступа к данным с помощью Query Analyzer. Мы также рассматривали простой пример модифицирования оператора T-SQL для улучшения его производительности. Используя эти средства, вы можете теперь модифицировать многие типы операторов T-SQL, чтобы улучшить показатели их выполнения. В этом разделе мы рассмотрим несколько способов оптимизации операторов T-SQL, чтобы повысить их производительность или чтобы они использовали меньше системных ресурсов.

Оптимизация плана исполнения

Модифицирование плана исполнения может оказаться трудным делом, а создание лучшего плана исполнения, чем у оптимизатора запросов, может оказаться еще более трудным делом. Наиболее вероятны улучшения от внесения изменений в план исполнения операторов JOIN, GROUP BY, ORDER BY и UNION. Вы можете легко модифицировать эти операции, пробуя различные подсказки и просматривая результаты (см. раздел "Использование подсказок" далее). Изменяя подсказку и просматривая результаты в окне Query Analyzer, вы, возможно, найдете более эффективный вариант выполнения оператора.

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

Выбор метода доступа к базе данных

Как уже говорилось выше в этой лекции, методы доступа к данным – это, по сути, объекты, используемые системой SQL Server при выборке данных из базы данных. Анализируя свою базу данных и данные, которые она содержит, вам, возможно, удастся оптимизировать метод доступа к данным, когда целью оптимизации является снижение количества операций ввода-вывода.

Модификации метода доступа к данным, как и модификации плана исполнения, должны выполняться для каждого конкретного случая. Следующие рекомендации помогут вам в выборе более эффективного метода доступа к данным.

Использование подсказок

Вы можете изменять метод доступа к данным и план исполнения, модифицируя сам оператор T-SQL, но в случае ошибок этот метод может нарушить функциональные требования к данному оператору T-SQL. Более надежным методом оптимизации операторов T-SQL является использование подсказок. С помощью подсказок вы можете указывать оптимизатору запросов, какие операции он должен выполнять и какие объекты он должен использовать. В этом разделе вы узнаете о различных подсказках SQL Server и об их использовании.

Подсказки операций связывания

Подсказки операций связывания (join hints) используются, чтобы указывать оптимизатору запросов типы операций связывания, которые он должен выполнять. (Если в запросе не указано никакого типа, то оптимизатор запросов выбирает тип самостоятельно.) В SQL Server вы можете выполнять связывание вложенных цепочек, хеш-связывание, связывание слиянием и удаленное связывание. Вы указываете метод связывания с помощью следующих подсказок.

Рассмотрим пример использования подсказки для операции связывания. Мы используем пример из раздела "Просмотр плана для операции связывания" выше в этой лекции и укажем следующую хеш-подсказку:

SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
    	LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
OPTION (HASH JOIN)
Примечание. Подсказки для связывания являются взаимоисключающими – можно одновременно указывать только одну подсказку.

Если вы решили использовать для связывания синтаксис SQL-92, то можете задать тип связывания, также используя подсказку. Применяя синтаксис SQL-92, вы могли бы переписать предыдущий запрос следующим образом:

SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
    	LastName, OrderDate
FROM Orders INNER HASH JOIN Employees
ON (Orders.EmployeeID = Employees.EmployeeID)

Использование подсказок для связывания является достаточно сложной темой, и не существует никаких правил, указывающих, когда использовать подсказки для связывания. Существует много причин для выбора определенной операции связывания, таких как предикаты, размер каждой таблицы при связывании и количество таблиц, участвующих в операции связывания. Чтобы определить, нужно ли изменять операцию связывания, лучше всего опробовать каждый тип связывания в Query Analyzer и посмотреть, какой из них дает меньшую стоимость. Но обычно наилучший способ для операции связывания выбирает оптимизатор запросов.

Подсказки для запросов

Подсказки для запросов используются для указания того, как следует выполнять определенные операции запроса. Подсказки для запросов разбиты на три категории: GROUP BY, UNION и остальные.

Подсказки GROUP BY. Следующие подсказки указывают, как следует выполнять операции GROUP BY или COMPUTE.

Используя пример GROUP BY из раздела "Просмотр плана для операции агрегирования" выше в этой лекции, мы можем указать с помощью подсказки, как должна выполняться операция HASH GROUP BY:

SELECT CustomerID, SUM(OrderDetails.UnitPrice) 
    	FROM Orders, OrderDetails 
    	GROUP BY CustomerID 
    	OPTION (HASH GROUP)
Примечание. Подсказки типа GROUP BY являются взаимоисключающими – можно одновременно использовать только одну подсказку.

Подсказки UNION. Следующие подсказки используются для указания того, как следует выполнять операции UNION.

Вот пример использования подсказки CONCAT UNION:

SELECT OrderID, CustomerID, EmployeeID, OrderDate
    	FROM orders 
    	WHERE CustomerID = 'TOMSP' 
UNION 
SELECT OrderID, CustomerID, EmployeeID, OrderDate  
    	FROM orders 
    	WHERE EmployeeID = '4' 
OPTION (CONCAT UNION)
Примечание. Подсказки типа UNION являются взаимоисключающими.

К сожалению, не существует какой-либо "секретной формулы", которую можно использовать для определения наиболее подходящей операции UNION в вашей ситуации. И здесь лучше всего использовать Query Analyzer для опробования различных подсказок UNION, чтобы посмотреть, какая из них дает наилучшую стоимость. Обычно наилучшую стратегию для операций UNION определяет оптимизатор запросов SQL Server.

Остальные подсказки.Следующие подсказки можно использовать для выполнения различных запросных операций.

Подсказки для таблиц

Подсказки для таблиц используются, чтобы управлять способом доступа к таблицам.

Здесь описаны две подсказки для таблиц.

Квалификатор WITH не является обязательным.

Подсказка INDEX = EmployeeID указывает, что должен использоваться индекс EmployeeID. Если указана подсказка FAST 10, то SQL Server будет оптимизировать выборку первых 10 строк (если возможно) и затем будет возвращать остальные строки.

Заключение

В этой лекции вы узнали, как использовать Query Analyzer для определения плана исполнения и методов доступа к данным, наиболее подходящих для данного запроса. Кроме того, вы узнали, как использовать Profiler для просмотра операторов T-SQL, которые выполняются в вашей системе, и как запускать трассировки, чтобы определить наличие некоторых операторов T-SQL, возможно, вызывающих проблемы производительности. Вы также узнали, как оптимизировать план исполнения и методы доступа к данным, исходя из структуры вашей базы данных и ваших данных. И, наконец, вы узнали, как использовать подсказки для указания того, что должен использоваться определенный план исполнения или метод доступа к данным. В лекции 36 эта тема будет развита: вы узнаете о проблемах производительности и способах их разрешения.

Лекция 36. Разрешение наиболее распространенных проблем производительности

Работа любой системы не проходит гладко и связана с большим количеством проблем, главными из которых являются проблемы производительности. Что характерно, существуют наиболее распространенные проблемы производительности, решения которых требует достаточно больших временных затрат. Для определения какой-либо проблемы производительности следует использовать Windows 2000 System Monitor и SQL Server Enterprise Manager. Завершающая лекция по курсу "Администрирование в SQL Server 2000" помогает до конца разобраться во всех тонкостях управления вашей системой.

На протяжении всего этого курса вы узнавали о средствах, которые можете использовать, и параметрах, которые можете регулировать для поиска и разрешения определенных проблем производительности. Например, в предыдущей лекции вы узнали, как выявлять проблемы, связанные с вашими операторами T-SQL и хранимыми процедурами, и как настраивать эти операторы и процедуры для получения оптимальной производительности. Назначение этой лекции – помочь вам легко находить информацию, необходимую для разрешения различных типов проблем производительности. В ней дается обзор связанных с производительностью тем, которые были изложены в других лекциях, даются ссылки на предыдущие лекции, где рассматриваются процедуры производительности, и приводится некоторая дополнительная информация о мониторинге производительности и настройке системы

Мы начнем с краткого описания термина "узкое место". Затем мы рассмотрим, как использовать Microsoft Windows 2000 System Monitor (Performance Monitor в Microsoft Windows NT) и Microsoft SQL Server Enterprise Manager, чтобы определить наличие какой-либо проблемы производительности. Затем мы рассмотрим, как разрешать целый ряд проблем производительности, возникающих на различных уровнях, включая уровень приложений, уровень SQL Server, уровень операционной системы и уровень оборудования. В этой лекции дается обзор правил, используемых для планирования мощности системы (они описаны в лекции 6), поскольку вы можете использовать их для анализа существующей системы, чтобы определить необходимость в дополнительном оборудовании для повышения производительности. И, наконец, мы рассмотрим несколько параметров конфигурирования SQL Server, описанных в предыдущих лекциях, чтобы вы могли регулировать их для изменения способа работы системы.

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

Что такое узкое место?

Термин "узкое место" (bottleneck) обычно используется при рассмотрении вопросов производительности программного обеспечения и оборудования; он относится к ограничивающему производительность состоянию, вызванному каким-либо компонентом или набором компонентов. Например, подсистема ввода-вывода с недостаточной мощностью может создавать ощутимый эффект узкого места: она может замедлять работу всей системы. (См. раздел "Подсистема ввода-вывода" далее в этой лекции.)

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

Выявление проблемы

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

Еще одним способом выявления проблемы является периодическое тестирование и мониторинг системы. Для этого вы можете использовать разнообразные средства, включая Windows 2000 System Monitor и SQL Server Enterprise Manager. В данном разделе вы узнаете, как использовать эти два инструмента для обследования состояния вашей системы. Вы также ознакомитесь с хранимой процедурой sp_who которую можете использовать для мониторинга активных процессов SQL Server.

Примечание. Для получения инструкций по использованию утилит Profiler и Query Analyzer для обнаружения проблем, связанных с вашими операторами SQL (см.лекцию 35).
System Monitor

В состав Windows 2000 System Monitor включены не только счетчики Windows 2000, но также счетчики SQL Server. Эти счетчики следят за характеристиками системы, такими как процент использования ЦП или коэффициент попадания в кэш-память для SQL Server (счетчик Cache hit ratio), которые помогают определять, что происходит с вашей системой. (Информация о конкретных счетчиках производительности приводится на протяжении всей этой лекции.) Вы можете следить за результатами мониторинга в режиме реального времени или можете протоколировать данные в файле и просматривать их позже.

Чтобы использовать System Monitor для мониторинга вашей системы, выполните следующие шаги.

  1. Щелкните на кнопке Start (Пуск), укажите пункт Programs, укажите Administrative Tools (Администрирование) и затем выберите пункт Performance (Производительность), чтобы появилось окно System Monitor
  2. Укажите, щелкнув на соответствующей кнопке панели инструментов, в какой форме вы хотите просматривать данные: в виде графика, отчета, гистограммы или в файле журнала (для ранее сохраненных данных). На рис. 36.1 показано графическое окно в System Monitor. Если вы решите просматривать файл журнала, то появится диалоговое окно для выбора файла, который нужно открыть.
  3. Чтобы добавить какой-либо счетчик для просмотра в окне Performance, щелкните на знаке "плюс" в панели инструментов. Появится диалоговое окно Add Counters (Добавление счетчиков) (рис. 36.2). Щелкните на кнопке выбора Use local computer counters (Использовать счетчики локального компьютера), чтобы просматривать счетчики локальной системы, или щелкните на кнопке выбора Select counters from computer (Выбрать счетчики с компьютера) и выберите из раскрывающегося списка под этой кнопкой выбора имя удаленного компьютера для просмотра счетчиков этого компьютера.

    Окно Windows 2000 Performance


    Рис. 36.1.  Окно Windows 2000 Performance

    Диалоговое окно Add Counters (Добавление счетчиков)


    Рис. 36.2.  Диалоговое окно Add Counters (Добавление счетчиков)

  4. Выберите объект System Monitor из раскрывающегося списка Performance object (Объект производительности). Эти объекты представляют компоненты системы. Счетчики для выбранного вами объекта появляются затем в окне списка в нижнем левом углу диалогового окна. Если вы хотите просматривать все счетчики для выбранного объекта, щелкните на кнопке выбора All counters (Все счетчики). Если вы хотите следить только за определенными счетчиками, щелкните на кнопке выбора Select counters from list (Выбор счетчиков из списка) и выберите нужные счетчики из списка. Для определенных счетчиков существует несколько экземпляров; эти экземпляры представлены в окне списка в нижнем правом углу диалогового окна. Щелкните на кнопке выбора Select instances from list (Выбор экземпляров из списка), если хотите выбрать для просмотра определенные экземпляры, или щелкните на кнопке выбора All instances (Все экземпляры) для просмотра всех экземпляров.
  5. Щелкните на кнопке Add (Добавить). Счетчик или счетчики, которые у вас выбраны, будут добавлены в окно System Monitor. (Если выбрано несколько экземпляров какого-либо счетчика, то будут добавлены все выбранные экземпляры.) Затем вы можете продолжить добавление счетчиков. Щелкните на кнопке Close, когда будете готовы вернуться в окно Performance. Теперь вы сможете просматривать данные производительности, получаемые с помощью счетчиков. На рис. 36.3 показано графическое представление результатов, возвращаемых тремя счетчиками: Context Switches/sec (Переключение контекста/сек), Total Server Memory (KB) (Общая память сервера, Кб) и %Processor Time (Процент использования процессора).

    System Monitor в действии


    увеличить изображение

    Рис. 36.3.  System Monitor в действии

Для сохранения данных производительности в файле журнала выполните следующие шаги:

  1. Раскройте Performance Logs and Alerts (Журналы производительности и оповещения) в левой панели окна Performance. Щелкните правой кнопкой мыши на Counter Logs (Журналы счетчиков) и выберите из контекстного меню пункт New Log Settings (Новый набор параметров журнала). Появится диалоговое окно New Log Settings. Здесь нужно ввести имя вашего набора параметров журнала (рис. 36.4). Для продолжения щелкните на кнопке OK.

    Диалоговое окно New Log Settings (Новый набор параметров журнала)


    Рис. 36.4.  Диалоговое окно New Log Settings (Новый набор параметров журнала)

  2. Появится окно с именем вашего нового файла журнала. Во вкладке General (Общие) щелкните на кнопке Add. В появившемся диалоговом окне Add Counters выберите счетчики, которые хотите протоколировать в журнале, в соответствии с шагами 3-5 предыдущего описания того, как System Monitor используется для мониторинга вашей системы. Во вкладке General вы можете также изменять имя файла журнала и указывать, насколько часто нужно выполнять выборку данных производительности.
  3. Щелкните на вкладке Log Files (Файлы журналов), чтобы задать дополнительные свойства файла журнала. На рис. 36.5 показаны параметры для файла, у которого в конец имени будет добавляться дата и который будет создаваться как двоичный файл.

     Вкладка Log Files (Файлы журналов) окна нового файла журнала


    Рис. 36.5.  Вкладка Log Files (Файлы журналов) окна нового файла журнала

  4. Щелкните на вкладке Schedules (Расписание). В этой вкладке вы назначаете время начала и окончания для этого файла журнала. Вы можете также выбрать запуск нового журнала или запуск какой-либо команды после закрытия текущего файла журнала.
  5. Щелкните на кнопке OK, чтобы закрыть данное окно и сохранить информацию о вашем файле журнала. Если у вас выбран немедленный запуск журнала, он начнет заполняться, когда вы щелкнете на кнопке OK. Запись для этого файла журнала появится в окне Performance (рис. 36.6).

Для проверки состояния вашей системы вам следует регулярно использовать System Monitor. Удобно использовать мониторинг по ежедневному или еженедельному графику, поскольку это позволяет вам знать особенности системы и, тем самым, распознавать необычные события. Рекомендуется также сохранять данные производительности в файле журнала для последующего просмотра, поскольку данные файла журнала удобно использовать для сравнения данных производительности до и после внесения изменений в систему, чтобы определить влияние этих изменений. Вы можете также использовать журналы, чтобы определять, как изменяется активность пользователей и системы изо дня в день. Например, вы можете заметить, что в последние несколько дней месяца активность пользователей намного выше, чем в другие периоды. Вам нужно убедиться, что ваша система способна справляться с пиковой нагрузкой в эти дни.

Окно System Monitor, где показана запись для нового журнала счетчиков


увеличить изображение

Рис. 36.6.  Окно System Monitor, где показана запись для нового журнала счетчиков

Enterprise Manager

Кроме использования Enterprise Manager для автоматизации повседневных административных функций вы можете использовать его как средство, помогающее в мониторинге процессов и блокировок SQL Server. (О блокировках см. лекцию 19.) Например, вы можете собирать данные о том, какие процессы используют блокировки и какие объекты блокируются (объект в данном случае – это таблица, база данных или временная таблица). Для просмотра этой информации выполните следующие шаги.

  1. В окне Enterprise Manager раскройте Microsoft SQL Server, раскройте SQL Server Group, раскройте сервер, раскройте папку Management и раскройте папку Current Activity (рис. 36.7). Папка Current Activity (Текущие операции) содержит три папки: Process Info (Информация о процессах), Locks/Process ID (Блокировки/Идентификаторы процессов) и Locks/Object (Блокировки/Объекты).
  2. Щелкните на папке Process Info, чтобы увидеть следующую информацию: имена пользователей, подсоединенных в данный момент к SQL Server (колонка User); идентификатор процесса пользователя (Process ID); состояние процесса пользователя (running [выполняется], sleeping [неактивное состояние] или background [фоновый режим]); базу данных, к которой подсоединен каждый пользователь (Database); команды (Commands) и приложения (Application), выполняемые каждым пользователем; время ожидания (Wait time), то есть время, которое ждет пользователь, пока не получит доступ к какому-либо ресурсу; показатели использования ЦП, физического ввода-вывода и памяти каждым процессом; и состояние блокировки каждого процесса (блокирует ли данный процесс другие процессы или блокирован другими процессами). Чтобы увидеть всю эту информацию, вам придется выполнить прокрутку вправо. На рис. 36.8 показана часть этой информации.

    Раскрытая папка Current Activity (Текущие операции) в окне Enterprise Manager


    увеличить изображение

    Рис. 36.7.  Раскрытая папка Current Activity (Текущие операции) в окне Enterprise Manager

     Информация папки Process Info (Информация о процессах) в окне Enterprise Manager


    увеличить изображение

    Рис. 36.8.  Информация папки Process Info (Информация о процессах) в окне Enterprise Manager

  3. Щелкните на папке Locks / Process ID для просмотра в правой панели списка системных идентификационных номеров процессов (SPID) для текущих активных процессов (рис. 36.9). Дважды щелкните на каком-либо из SPID-номеров в правой панели, чтобы появилось диалоговое окно Process Details (Подробности процесса) (рис. 36.10). В этом диалоговом окне показан последний оператор T-SQL, выполненный выбранным процессом.

     SPID-номера, показанные в панели Locks / Process ID


    увеличить изображение

    Рис. 36.9.  SPID-номера, показанные в панели Locks / Process ID

     Диалоговое окно Process Details


    Рис. 36.10.  Диалоговое окно Process Details

  4. Раскройте папку Locks / Process ID для просмотра в левой панели SPID-номеров текущих процессов (рис. 36.11).
  5. Щелкните на каком-либо SPID-номере в левой панели, чтобы увидеть информацию о блокировках для этого процесса в правой панели (рис. 36.11). В эту информацию включен тип блокировки (Lock type), режим блокировки (Mode), состояние блокировки (Status) и владелец блокировки (Owner). Может быть указан один из следующих типов блокировки.
    • RID. Блокировка строк.
    • KEY.Блокировка строк внутри индекса.
    • PAG. Блокировка страницы данных или индекса.
    • EXT. Блокировка экстента.

       Раскрытая папка Locks / Process ID


      увеличить изображение

      Рис. 36.11.  Раскрытая папка Locks / Process ID

    • TAB. Блокировка таблицы, включая все страницы данных и индекса для этой таблицы.
    • DB. Блокировка базы данных.
    Может быть указан один из следующих режимов блокировки.
    • S. Разделяемая блокировка.
    • X. Монопольная блокировка.
    • U. Блокировка изменений.
    • BU. Блокировка массовых изменений.
    • IS. Разделяемая блокировка намерения.
    • IX. Монопольная блокировка намерения.
    • SIX. Монопольная разделяемая блокировка намерения.
    • Sch-S. Блокировка схемы для компилирования запросов.
    • Sch-M. Блокировка схемы для операций языка DDL.
    Может быть указано одно из следующих состояний блокировки.
    • GRANT. Означает, что данная блокировка была предоставлена выбранному процессу.
    • WAIT. Означает, что данный процесс блокирован другим процессом и ожидает получения блокировки.
    • CNVT. Означает, что данная блокировка преобразована в другой тип блокировки.
  6. Раскройте папку Locks / Object, чтобы увидеть список текущих блокированных объектов (рис. 36.12). Могут быть блокированы такие объекты, как таблицы, временные таблицы, базы данных и т.д.

     Раскрытая папка Locks / Object


    увеличить изображение

    Рис. 36.12.  Раскрытая папка Locks / Object

  7. Щелкните на имени блокированной базы данных или таблицы, чтобы увидеть в правой панели информацию о ее блокировке (рис. 36.13). Здесь показана та же информация, что и при щелчке на каком-либо SPID-номере в папке Locks / Process ID, только с другой "точки зрения".

    Просмотр информации о блокировке для объекта


    увеличить изображение

    Рис. 36.13.  Просмотр информации о блокировке для объекта

Хранимая процедура sp_who

Вы можете также просматривать информацию об активных процессах, запустив следующую команду в Query Analyzer или с помощью OSQL:

sp_who active
GO

Результаты выполнения этой команды в Query Analyzer показаны на рис. 36.14. Если какой-либо процесс блокирован, то в колонке "blk" показан SPID-номер процесса, который его блокирует.

Пример результатов запуска sp_who active


увеличить изображение

Рис. 36.14.  Пример результатов запуска sp_who active

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

Вам следует время от времени выполнять мониторинг блокировок, чтобы выявлять процессы, которые удерживают блокировку слишком долго, и процессы, которые бывают блокированы слишком часто (находятся в состоянии WAIT ) из-за монопольных блокировок или блокировок по таблицам, которые удерживаются другими процессами. Но обычно в случае проблемы блокировки ваши пользователи будут жаловаться на слишком большое время отклика. Если блокирование возникает слишком часто или длится слишком долго, то вам потребуется определить, какие процессы удерживают монопольные блокировки или блокировки по таблицам (что может быть причиной блокирования), и выполнить мониторинг операторов SQL Server, которые запускают эти процессы. Затем попытайтесь оптимизировать, если возможно, эти операторы, чтобы они быстрее освобождали эти блокировки и не захватывали монопольные блокировки по таблицам. Обычно для выполнения процесса требуется больше времени, если этому процессу приходится ждать освобождения какой-либо блокировки. Поэтому снижение конкуренции блокировок может способствовать сокращению времени отклика.

Дополнительная информация. Для получения более подробной информации по просмотру информации о блокировках найдите "displayinglocks" в Books Online и выберите "Displaying Locking Information" (Отображение информации о блокировках) в диалоговом окне Topics Found.

Наиболее характерные узкие места, снижающие производительность

Теперь, узнав, как использовать средства мониторинга производительности, такие как System Monitor, Enterprise Manager, Query Analyzer и Profiler, вы готовы к тому, чтобы справляться с проблемами узких мест, снижающих производительность. В этом разделе мы рассмотрим некоторые из наиболее характерных узких мест, снижающих производительность, и различные решения этих проблем. Многие из этих узких мест тесно связаны друг с другом, и одно узкое место может "маскироваться" под другое. Вы должны искать как аппаратные, так и программные узкие места, поскольку причиной многих проблем производительности являются комбинации узких мест. Причиной аппаратных узких мест могут становиться такие компоненты оборудования, как ЦП, память и подсистема ввода-вывода; причиной программных узких мест могут становиться приложения SQL Server и операторы SQL. Мы рассмотрим подробнее каждый из этих типов проблем в следующих разделах.

Центральный процессор (ЦП)

Одной из наиболее распространенных проблем производительности является просто недостаток мощности. Процессорная мощность системы определяется количеством, типом и скоростью центральных процессоров (ЦП) в этой системе. Если вашей системе недостает мощности ЦП, то она не может достаточно быстро обрабатывать транзакции, как это требуется пользователям. Чтобы использовать System Monitor для определения процента использования ЦП, проверяйте счетчик %Processor Time объекта Processor. (Выберите все экземпляры ЦП, если у вас многопроцессорная система.) Если ваши ЦП работают с загрузкой 75% или выше в течение длительных периодов времени (75 % – желательный максимум согласно правилам лекции 6), то в вашей системе, скорее всего, имеется проблема узкого места, связанного с ЦП. Если вы постоянно видите процент использования ЦП не ниже 60 %, то вам, видимо, поможет добавление более быстрых ЦП или увеличение количества ЦП.

Выполните мониторинг других характеристик системы, прежде чем увеличивать мощность ЦП. Например, если ваши операторы SQL сформированы неэффективно, то ваша система, видимо, выполняет намного больше операций обработки, чем это требуется, и оптимизация этих операторов, возможно, снизит степень использования ЦП. Или, предположим, что коэффициент попадания в кэш-память (счетчик Cache hit ratio) для кэша данных SQL Server ниже 90 %. Возможно, вы должны добавить память для кэша данных (увеличив значение параметра max server memory или добавив физическую память к системе). Это позволит увеличить количество данных, помещаемых в кэш, и, тем самым, снизить объем дисковых физических операций ввода-вывода, что приведет к снижению процента использования ЦП, поскольку на обработку запросов ввода-вывода будет уходить меньше времени. Вы можете иногда повышать производительность системы, просто за счет добавления процессоров, особенно в том случае, если вы начинаете работу с однопроцессорной системы. Однако не все приложения допускают масштабирование на многопроцессорные системы. SQL Server предусматривает масштабирование, но не все операторы SQL, которые могут у вас использоваться, допускают масштабирование. На одном ЦП будет одновременно выполняться только один процесс, и одного ЦП достаточно для одного оператора SQL Server. Чтобы повысить производительность за счет использования нескольких процессоров, ваша система SQL Server должна параллельно выполнять несколько операторов, которые могут одновременно обрабатываться на различных ЦП.

Обычно вы можете почти всегда повысить производительность за счет использования большего количества более быстрых ЦП. Однако в некоторых случаях при добавлении более быстрых ЦП вы должны увеличить память и мощность ввода-вывода, чтобы другие компоненты не стали причиной узкого места. Например, если у вас сначала была проблема узкого места из-за ЦП и вы разрешили эту проблему, добавив еще один ЦП, то ваша система, видимо, сможет выполнять больше работы, что приведет к увеличению количества дисковых операций ввода-вывода. В результате может возникнуть проблема узкого места из-за дисковой подсистемы ввода-вывода. Кроме того, убедитесь, что новые процессоры, которые вы хотите добавить, имеют кэш уровня 2 (Level 2 [L2]). Чем больше кэш ЦП, тем выше производительность, особенно в многопроцессорной системе.

Если вы действительно решили увеличить процессорную мощность, то можете добавить новые ЦП или заменить существующие ЦП на более мощные. Например, если в вашей системе два ЦП, но ее можно расширить до четырех ЦП, добавьте еще два ЦП того же типа или установите четыре новых, более быстрых ЦП. Если ваша система уже содержит максимальное количество ЦП и вам нужно увеличить процессорную мощность, постарайтесь получить более быстрые ЦП для их замены. Например, предположим, что у вас четыре ЦП, работающих со скоростью 200 МГц. Вы можете заменить их четырьмя ЦП со скоростью 500 МГц. Более быстрые ЦП способствуют сокращению времени обработки.

Память

Количество памяти, доступной SQL Server, является одним из наиболее критичных факторов для производительности SQL Server. Важным фактором является также соотношение между памятью и мощностью подсистемы ввода-вывода. Например, в системах с большой интенсивностью операций ввода-вывода больший объем памяти, который может использовать SQL Server для кэша данных, позволяет выполнять меньшее количество физических операций ввода-вывода. Это происходит потому, что данные считываются не с диска, а из кэша данных. SQL Server использует сложную кэш-систему для повышения производительности всей системы; максимально увеличивается доступ к данным в памяти и сводится к минимуму доступ к данным на дисках. Чем больше данных, считываемых из памяти, тем выше производительность вашей системы. Доступ к памяти осуществляется намного быстрее, чем доступ к диску.

В некоторых случаях недостаточное количество памяти может приводить к узкому месту за счет диска из-за увеличения количества дисковых физических операций ввода-вывода, связанного с тем, что система не может эффективно использовать кэш. Чтобы увидеть, сколько системной памяти использует SQL Server, запустите System Monitor, чтобы проверить счетчик общей памяти сервера Total Server Memory (KB) для объекта SQL Server: Memory Manager. Если SQL Server не использует ожидаемого количества памяти, то вам, возможно, требуется изменить параметры конфигурирования памяти, описанные в разделе "Параметры конфигурирования SQL Server" ниже в этой лекции.

Чтобы определить, хватает ли кэш-памяти для SQL Server, используйте System Monitor, чтобы проверить счетчик Buffer Cache Hit Ratio объекта SQL Server: Buffer Manager. Общее правило состоит в том, что счетчик Cache hit ratio должен давать значения не меньше 90%. Увеличьте размер памяти для кэша, если этот показатель меньше 90%. Отметим, что в некоторых системах счетчик Cache hit ratio никогда не достигает 90% из-за особенностей используемого приложения. Это может быть в случаях, когда повторное использование страниц данных происходит редко и система часто очищает страницы данных в кэше для размещения новых страниц.

Примечание. Microsoft SQL Server 2000 динамически выделяет память для буферного кэша, исходя из размера доступной памяти системы и установки параметров памяти. Некоторые внешние процессы, такие как процесс печати и другие приложения, могут вынуждать SQL Server, чтобы он освобождал значительную часть своей памяти для их использования. Внимательно следите за памятью системы и изолируйте, если это возможно, SQL Server на его собственной системе. (Об использовании параметров памяти см. лекцию 30 и раздел "Параметры конфигурирования SQL Server" далее в этой лекции.)
Подсистема ввода-вывода

Узкие места, возникающие в подсистеме ввода-вывода, – это наиболее распространенные проблемы оборудования для систем баз данных. Плохо сконфигурированные подсистемы ввода-вывода уступают по своему влиянию на производительность только неэффективным операторам SQL. К счастью, проблемы подсистемы ввода-вывода относятся к тем проблемам производительности, которые наиболее легко поддаются разрешению. Во многих случаях добавление дисков полностью устраняет эти проблемы.

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

В большинстве случаев проблемы производительности подсистем ввода-вывода возникают потому, что был неправильно спланирован состав соответствующей подсистемы ввода-вывода. О планировании состава системы см. лекции 5 и 6, но мы все же дадим здесь краткий обзор этой темы.

Планирование состава (sizing) подсистемы ввода-вывода необходимо, как уже говорилось, из-за ограниченности количества операций ввода-вывода в секунду, которые могут выполняться одним дисководом. Если на диске выполняются преимущественно последовательные операции ввода-вывода, как это происходит с журналом транзакций, то он может осуществлять, например, более 150 операций в секунду без какой-либо перегрузки. (Как уже говорилось, перегрузки приводят к длительным задержкам.) С другой стороны, если на диске выполняются операции ввода-вывода с произвольным доступом, что характерно для файлов данных, то его производительность может составлять только 85 операций в секунду. При высоких требованиях к вводу-выводу все более возрастает время задержек.

Чтобы определить, не перегружены ли ваши диски, выполняйте мониторинг счетчиков объектов PhysicalDisk и LogicalDisk в System Monitor. Эти счетчики (некоторые из них описаны более подробно ниже в этом разделе) выполняют сбор данных об интенсивности физических и логических операций ввода-вывода на диске, таких как число операций чтения и записи в секунду. Эти счетчики активизируются во время инсталляции операционной системы, но вам следует знать, как их активизировать и отключать. Они используют системные ресурсы, такие как время ЦП, когда они собирают статистику, поэтому вам следует активизировать их, только если вам нужен мониторинг ввода-вывода в системе. Чтобы активизировать или отключить эти счетчики, вам нужно активизировать или отключить оператор Windows NT/2000 DISKPERF.

Чтобы определить, активизирован ли оператор DISKPERF, запустите следующий оператор в командной строке:

diskperf

Если DISKPERF активизирован, то появится следующее сообщение: "Physical Disk Performance counters on this system are currently set to start at boot" (Счетчики производительности физических дисков в этой системе в настоящее время установлены для запуска при загрузке системы). Если DISKPERF отключен, то появится следующее сообщение: "Both Logical and Physical Disk Performance counters on this system are now set to never start" (Оба счетчика производительности [для логического и физического диска] не будут запускаться).

Чтобы активизировать оператор DISKPERF, если он отключен, введите следующий оператор в командной строке:

diskperf -Y

Чтобы отключить DISKPERF, запустите следующий оператор:

diskperf -N

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

diskperf ?

Особенно важны счетчики Disk Writes/Sec (Число операций записи/сек), Disk Reads/Sec (Число операций чтения/сек), Avg. Disk Queue Length (Средняя длина очереди на диск), Avg. Disk Sec/Write (Среднее время одной операции записи) и Avg. Disk Sec/Read. (Среднее время одной операции чтения). Эти счетчики помогают вам определить, не перегружена ли ваша дисковая подсистема. Эти счетчики включены в оба объекта – PhysicalDisk и LogicalDisk. Чтобы получить подробное описание информации, которую предоставляют эти счетчики, щелкните на кнопке Explain (Объяснить) в диалоговом окне Add Counters, когда вы добавляете соответствующий счетчик в System Monitor.

Рассмотрим пример использования этих счетчиков. Предположим, вы считаете, что у вас имеется проблема узкого места подсистемы ввода-вывода. Вам следует проверить счетчики Avg. Disk Sec/Transfer (Средняя длительность одной передачи на диске), Avg. Disk Sec/Read и Avg. Disk Sec/Write объекта PhysicalDisk, поскольку они отражают задержку (ожидание) на диске (время, которое требуется диску для выполнения операции чтения или записи), а повышение длительности задержки является признаком того, что у вас перегружены дисководы или дисковая матрица. Общее правило состоит в том, что нормальные показания этих счетчиков должны составлять от 1 до 15 миллисекунд (от 0,001 до 0,015 секунды), но вам не следует беспокоиться, если в периоды пиковой нагрузки задержка составит 20 миллисекунд (0,020 секунды). Но если значения более 20 миллисекунд, то в вашей системе явно имеется проблема производительности, связанная с подсистемой ввода-вывода.

Вы должны также проверять счетчики Disk Writes/Sec и Disk Reads/Sec. Предположим, эти счетчики показывают, что на диске выполняется 20 операций записи и 20 операций чтения в секунду, то есть всего 40 операций ввода-вывода в секунду, а мощность диска составляет 85 операций ввода-вывода в секунду. И если в то же самое время диск дает большие задержки, то, возможно, это говорит о неисправности данного диска. А теперь предположим, что на этом диске выполняется 100 операций в секунду и длительность задержек составляет 20 миллисекунд или больше. В этом случае вам требуется увеличить количество дисков, чтобы повысить производительность.

Чтобы определить, сколько операций ввода-вывода выполняет ваша система, когда вы используете RAID-матрицу, разделите количество операций ввода-вывода в секунду, которое вы видите в System Monitor, на количество дисков этой матрицы, и умножьте на дополнительный коэффициент для матрицы RAID. В табл. 36.1 приводится количество физических операций, генерируемых для чтения и записи при использовании технологии RAID.

Таблица 36.1. Количество физических операций, выполняемых при чтении и записи для соответствующих уровней RAID
Уровень RAIDЧтениеЗапись
011
1 или 1012
514

Обычно наилучшим способом устранения узкого места подсистемы ввода-вывода является просто добавление дисков. Но не забудьте проверить другие возможные причины узкого места в подсистеме ввода-вывода, такие как низкое значение коэффициента попадания в кэш и транзакции, в которых выполняется больше операций ввода-вывода, чем это необходимо. (Как уже говорилось, в большинстве случаев коэффициент попадания в кэш меньше 90% считается слишком низким.) Если вы нашли узкое место подсистемы ввода-вывода, посмотрите указания в лекции 6, чтобы определить количество дисков, необходимое вашей системе.

Неисправные компоненты

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

Приложения

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

Оптимизируйте планы исполнения

Вы видели в лекции 35, насколько важно выбрать наилучший план исполнения и метод доступа к данным для запроса. К сожалению, не существует какой-либо "особой формулы" определения наилучшего плана. SQL Server автоматически выбирает план исполнения, который определяется как наилучший план оптимизатором запросов. Вы можете использовать различные типы подсказок в ваших запросах, включая подсказки на уровне запросов, подсказки для таблиц и подсказки для операций связывания. Ознакомившись с этими подсказками, вы, вероятно, сможете аналитически определять наилучший план для запроса. Обычно требуется просмотреть несколько планов, прежде чем выбрать наиболее приемлемый.

Используйте индексы осмысленно

Правильное использование индексов является критически важным для получения высокой производительности (см лекции 17 и 35). Для поиска нужных данных с помощью индекса может потребоваться всего лишь 10–20 операций ввода-вывода, в то время как для поиска нужных данных путем сканирования таблиц могут потребоваться тысячи или миллионы операций ввода-вывода. Однако индексы следует использовать с осторожностью. Напомним, что при модифицировании данных таблицы с помощью оператора INSERT, UPDATE или DELETE происходит автоматическое обновление индекса или индексов, связанных с этими данными, что требует выполнения соответствующих операций ввода-вывода в дополнение к операциям непосредственного модифицирования таблицы. Следите за тем, чтобы не создавать слишком много индексов; иначе дополнительная нагрузка, связанная с поддержкой этих индексов, будет приводить к снижению производительности.

Используйте хранимые процедуры

Хранимые процедуры используются для выполнения пакета заранее откомпилированных операторов SQL на сервере (см.лекцию 21). Вызов хранимых процедур из ваших приложений вместо вызова отдельных операторов SQL способствует повышению производительности как за счет повторяемого использования операторов SQL на сервере, так и за счет сильного снижения сетевого трафика. Снижение количества данных, передаваемых между клиентами и серверами, происходит за счет того, что хранимая процедура находится на сервере, а вы можете программировать обработку и фильтрацию данных в хранимой процедуре, а не в приложении.

Параметры конфигурирования SQL Server

SQL Server 2000 является практически самонастраиваемой системой, но вы все же можете изменять способ работу вашей системы, модифицируя значения определенных параметров конфигурирования. В этом разделе вы узнаете, как конфигурировать эти параметры и как они влияют на работу вашей системы. Скорее всего, вам не потребуется изменять эти параметры, но знание их возможностей позволяет вам решать, нужно ли вам их изменение. Вы можете конфигурировать эти параметры с помощью Enterprise Manager или с помощью хранимой процедуры T-SQL sp_configure.

Чтобы использовать Enterprise Manager, щелкните правой кнопкой мыши на имени сервера, который вы хотите конфигурировать, и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно SQL Server Properties. Это окно содержит девять вкладок, и каждая вкладка содержит параметры, которые вы можете конфигурировать. Эти вкладки и соответствующие параметры описаны в следующих разделах.

Используя sp_configure для конфигурирования этих параметров, вы должны помнить, что определенные параметры считаются дополнительными (advanced options). (В следующих разделах указывается, какие параметры являются дополнительными.) Для изменения какого-либо дополнительного параметра с помощью sp_configure вы должны задать для параметра show advanced options (показать дополнительные параметры) значение 1 (активизировать). Для этого параметра по умолчанию задано значение 0 (деактивизировать). (Этот параметр не оказывает влияния на дополнительные параметры, если вы используете Enterprise Manager.) Чтобы активизировать параметр show advanced options, используйте следующий оператор:

sp_configure "show advanced options", 1 
GO

Обычно для установки любого параметра с помощью sp_configure используется следующий синтаксис:

sp_configure "имя параметра", значение
Параметр affinity mask

Параметр affinity mask (маска "родственности") используется, чтобы указывать, на каких ЦП могут выполняться потоки SQL Server в многопроцессорной среде. Значение 0 (принятое по умолчанию) указывает, что родственность потоков определяется алгоритмами планировщика Windows 2000. Ненулевое значение задает битовую маску, определяющую ЦП, на которых могут выполняться потоки SQL Server. Десятичное значение 1 (или двоичное значение маски 00000001) указывает, что может использоваться только ЦП 1; значение 2 (или 00000010) указывает использование только ЦП 2; 3 (или 00000011) указывает использование ЦП 1 и ЦП 2, и т.д.

Этот параметр относится к группе дополнительных параметров, поэтому для его конфигурирования с помощью sp_configure вы должны задать для параметра show advanced options значение 1. Вы можете также конфигурировать параметр affinity mask с помощью Enterprise Manager. Для этого щелкните на вкладке Processor (Процессор) в окне SQL Server Properties и в секции Processor Control (Управление процессорами) установите флажки перед каждым ЦП (CPU), который хотите использовать для SQL Server. Щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK, чтобы сохранить данное изменение. Чтобы это изменение начало действовать, вы должны закрыть и перезапустить SQL Server.

В системе, выделенной только для SQL Server, вы должны задать такое значение параметра affinity mask, чтобы использовать для SQL Server все ЦП. В системе, которая не полностью выделена для SQL Server (то есть содержит другие процессы, которым требуется время ЦП) вам, возможно, потребуется задать такую маску, чтобы для SQL Server использовались все ЦП, кроме одного.

Параметр lightweight pooling

Параметр lightweight pooling (упрощенная организация пула) используется чтобы сконфигурировать SQL Server для использования упрощенных потоков (или "волокон" – fibers). Использование "волокон" может снизить количество переключений контекста за счет того, что планирование процессов выполняет SQL Server (а не планировщик Windows NT или Windows 2000). Если ваше приложение выполняется в многопроцессорной системе и вы видите много переключений контекста, то можете попытаться задать для параметра lightweight pooling значение 1, которое активизирует упрощенную организацию пула, и затем снова выполнить мониторинг количества переключений контекста, чтобы убедиться в снижении этого количества. Значение по умолчанию – 0 (запрещение использования "волокон").

Параметр lightweight pooling относится к группе дополнительных параметров, поэтому его можно конфигурировать с помощью sp_configure, если для параметра show advanced options задано значение 1. Вы можете также конфигурировать lightweight pooling с помощью Enterprise Manager. Щелкните на вкладке Processor в окне SQL Server Properties и в секции Processor Control установите флажок Use Windows NT Fibers (Использовать "волокна" Windows NT) для его активизации или сбросьте этот флажок для деактивизации параметра. Щелкните на кнопке Apply, щелкните на кнопке OK и затем закройте и перезапустите SQL Server, чтобы этот параметр начал действовать.

Параметр max server memory

SQL Server динамически выделяет память. Чтобы задать максимальное количество памяти (в мегабайтах), которое SQL Server может выделить для буферного пула, вы можете использовать параметр max server memory (максимальная память для сервера). Поскольку SQL Server требуется определенное время для освобождения памяти, если у вас есть другие приложения, которым периодически нужна память, то для параметра max server memory можно задать такое значение, чтобы SQL Server оставлял определенную часть памяти свободной для других приложений. Значение по умолчанию – 2147483647 – означает, что SQL Server будет забирать у системы максимально возможное количество памяти, динамически освобождая память, когда она требуется другим приложениям, и снова захватывая память, когда эти приложения освобождают ее. Это рекомендованное значение для выделенной системы SQL Server. Если вы хотите изменить это значение, рассчитайте максимальный объем памяти, который вы можете предоставить SQL Server, вычитая из полного объема физической памяти количество памяти, необходимое для Windows 2000, а также для любых приложений, не относящихся к SQL Server.

Этот параметр относится к группе дополнительных параметров, поэтому для его конфигурирования с помощью sp_configure вы должны задать значение 1 для параметра show advanced options. Для задания этого параметра с помощью Enterprise Manager щелкните на вкладке Memory (Память) в окне SQL Server Properties и используйте движок Maximum (MB) (Максимум [Мб]). Затем щелкните опцию Dynamically Configure SQL Server Memory (Динамическое конфигурирование памяти SQL Server). Этот параметр начинает действовать сразу – без необходимости закрытия и повторного запуска SQL Server. (Если щелкнуть опцию Use A Fixed Memory Size [Использовать фиксированный размер памяти], то SQL Server выделит память до указанного объема и затем уже не будет освобождать память.)

Параметр min server memory

Параметр min server memory (минимальная память для сервера) используется для указания минимального количества памяти (в мегабайтах), которое должно выделяться для буферного пула SQL Server. Устанавливать этот параметр полезно в системах, где SQL Server, возможно, резервирует слишком много памяти для других приложений. Например, в среде, где данный сервер используется для служб печати и файловых служб, а также для служб базы данных, SQL Server должен "уступать" слишком много памяти другим приложениям. Это приводит к увеличению времени отклика для пользователей. Значение по умолчанию min server memory равно 0, что позволяет SQL Server динамически забирать и освобождать память. Это рекомендованное значение, но вам может потребоваться его изменение, если ваш сервер не полностью выделен для SQL Server.

Этот параметр относится к группе дополнительных параметров, поэтому для его конфигурирования с помощью sp_configure вы должны задать значение 1 для параметра show advanced options. Вы можете также сконфигурировать его с помощью Enterprise Manager. Щелкните на вкладке Memory (Память) в окне SQL Server Properties, используйте движок Minimum (MB) (Минимум [Мб]) и затем щелкните опцию Dynamically Configure SQL Server Memory. Этот параметр начинает действовать сразу – без необходимости закрытия и повторного запуска SQL Server.

Параметр recovery interval

Вы можете использовать параметр recovery interval (интервал восстановления), чтобы определить максимальное количество минут, которое может потратить система для восстановления после аварии. SQL Server использует значение этого параметра и специальный встроенный алгоритм, определяя, насколько часто следует автоматически создавать контрольные точки, чтобы восстановление занимало только указанное количество минут. SQL Server определяет длительность интервала между контрольными точками в соответствии с объемом работы, выполняемой в системе. Если выполняется много работы, то контрольные точки создаются чаще, чем при небольшом объеме работы. Чем меньше объем выполняемой работы, тем меньше времени требуется SQL Server для восстановления после аварии. И чем больше заданный интервал восстановления, тем больше будет интервал между контрольными точками.

Увеличение интервала восстановления повышает производительность системы за счет снижения количества контрольных точек. (При создании контрольной точки выполняется большое число операций записи на диск, что может несколько замедлять выполнение транзакций пользователей.) Но при этом также увеличивается количество времени, которое SQL Server потратит на восстановление. Значение по умолчанию равно 0, указывая на то, что этот интервал будет определять для вас SQL Server и время восстановления будет составлять примерно 1 минуту. Увеличивайте параметр recovery interval на свое усмотрение. Значение от 5 до 15 (минут) находится в обычных пределах, но ваш выбор зависит только от вашего согласия, чтобы пользователи ждали от 5 до 15 минут для восстановления базы данных в случае аварии системы. Обычно значение параметра recovery interval требуется увеличить, чтобы снизить частоту создания контрольных точек, предоставляя пользователям возможность более свободного выполнения операций ввода-вывода для их транзакций без прерывания.

Параметр recovery interval входит в группу дополнительных параметров: для его конфигурирования с помощью sp_configure вы должны задать значение 1 для параметра show advanced options. Вы можете задать этот параметр с помощью Enterprise Manager, щелкнув на вкладке Database Settings (Параметры базы данных) окна SQL Server Properties и задав нужное значение в поле-счетчике Recovery Interval (min). Изменение этого параметра начинает действовать сразу – без необходимости закрытия и повторного запуска SQL Server.

Заключение

В этой лекции вы узнали о некоторых проблемах производительности, с которыми можете столкнуться как DBA. Вы узнали, как использовать System Monitor и Enterprise Manager для мониторинга системы и выявления узких мест, влияющих на производительность. Вы также узнали, как обнаруживать и разрешать наиболее распространенные проблемы производительности системы.

Этот курс провел вас через все "как, что и почему" в администрировании SQL Server 2000. Теперь вы сможете эффективно управлять своей системой и конфигурировать ее, а также легко и эффективно выполнять задачи повседневного администрирования. Авторы надеются, что вы с удовольствием прочитали этот курс.

Дополнения

Дополнение. Приложение А. Параметры конфигурирования Microsoft SQL Server

В этом приложении дается описание параметров конфигурирования Microsoft SQL Server. Здесь также описывается, как задавать значения этих параметров.

Параметры

Вы можете задавать параметры конфигурирования одним из двух способов: путем выбора свойств в окне SQL Server Enterprise Manager или путем использования системной хранимой процедуры sp_configure. Метод задания параметров с помощью Enterprise Manager описан ниже в этом приложении. Для использования хранимой процедуры sp_configure нужно запустить следующую команду:

sp_configure 'имя_параметра', значение

Например, вы можете задать значение 200 для параметра конфигурирования max worker threads с помощью следующей команды:

sp_configure 'max worker threads', 200
Go

Параметры конфигурирования SQL Server кратко описываются в следующих разделах. Полное описание этих параметров можно найти в SQL Server Books Online.

affinity mask

Параметр affinity mask (маска "родственности") является битовой переменной, которая указывает, на каких ЦП может выполнять свою работу SQL Server. Значение 0 (принятое по умолчанию) позволяет планировщику Microsoft Windows NT/2000 определять, на каких ЦП будет работать SQL Server. Поскольку это битовая переменная, то двоичное представление этого значения определяет, какие ЦП будут использоваться. Ниже приводятся пять первых двоичных значений.

0=0000
1=0001
2=0010
3=0011
4=0100

Например, если вы используете 4-процессорную систему, то можете задать для параметра affinity mask значение 15 (1111), чтобы SQL Server работал на всех ЦП.

allow updates

Параметр allow updates (разрешить модифицирование) позволяет пользователям с соответствующими привилегиями доступа непосредственно модифицировать системные таблицы. Если для параметра allow updates задано значение 0 (принятое по умолчанию), то системные таблицы можно модифицировать только с помощью системных хранимых процедур.

awe enabled

Параметр awe enabled (активизирована awe) разрешает использовать средство расширенной памяти Address Windowing Extensions (AWE) в Microsoft Windows 2000. Если для awe enabled задано значение 1, то разрешается использование памяти свыше 4 Гб.

C2 audit mode

Параметр C2 audit mode (режим аудита уровня C2) позволяет использовать режим аудита безопасности уровня C2. При этом аудите безопасности происходит протоколирование определенных событий в SQL Server, чтобы достичь безопасности C2.

cost threshold for parallelism

Параметр cost threshold for parallelism (порог стоимости для распараллеливания) указывает стоимость, которая определяет возможность распараллеливания запросов. Если стоимость запроса в последовательном режиме превышает значение cost threshold for parallelism, то запрос распараллеливается. Значение по умолчанию равно 5.

cursor threshold

Параметр cursor threshold (пороговое значение для курсора) указывает количество строк в наборе курсора, превышение которого приводит к асинхронному созданию набора ключей данного курсора. Если количество строк меньше значения cursor threshold, то наборы ключей создаются синхронно. Значение по умолчанию, равное –1, указывает, что все наборы ключей курсора будут создаваться синхронно.

default full-text language

Параметр default full-text language (язык по умолчанию для полнотекстового поиска) указывает идентификатор языка по умолчанию, который используется в SQL Server для индексирования с целью полнотекстового поиска. Значение по умолчанию 1033 – это идентификатор для U.S. English.

default language

Параметр default language (язык по умолчанию) указывает идентификатор для языка по умолчанию, используемого в SQL Server. Значение по умолчанию 0 – это идентификатор для U.S. English.

fill factor

Параметр fill factor (коэффициент заполнения) указывает, насколько плотно SQL Server будет заполнять индексные страницы при их создании. Значение 1 указывает, что страницы будут почти пустыми; значение 100 соответствует 100% заполнению индексных страниц. Значение по умолчанию, равное 0, указывает, что страницы-листья B-дерева будут заполняться до конца, а на страницах более высокого уровня некоторая часть будет оставаться свободной.

index create memory

Параметр index create memory (память для создания индекса) указывает количество памяти, используемое для сортировок при создании индекса. Значение по умолчанию, равное 0, указывает, что это значение будет определять SQL Server.

lightweight pooling

Параметр lightweight pooling (упрощенная организация пула), для которого задается значение TRUE (1) или FALSE (0), указывает, будет ли SQL Server использовать планирование режима "волокон" (fiber mode) для снижения количества переключений контекста. Переключения контекста сопровождаются большой дополнительной нагрузкой на систему; их количество будет снижаться, если SQL Server может выполнять собственное планирование. Значение по умолчанию, равное 0, указывает, что планирование режима "волокон" (fiber mode) не будет использоваться.

locks

Параметр locks (блокировки) указывает максимальное количество блокировок, которое может быть выделено на сервере. Значение по умолчанию, равное 0, указывает, что SQL Server будет динамически захватывать и освобождать блокировки. Вы можете следить за количеством блокировок в вашей системе с помощью Performance Monitor в Windows NT или Windows 2000; если вы видите много захватов и освобождений блокировок, то вам, вероятно, требуется выделять блокировки статически. Но в большинстве случаев следует использовать значение по умолчанию, равное 0.

max degree of parallelism

Параметр max degree of parallelism (максимальная степень распараллеливания) указывает максимальное количество потоков, которые могут быть выделены для параллельного выполнения. Значение по умолчанию, равное 0, указывает, что будут использоваться все ЦП в данной системе, что делает количество потоков равным количеству ЦП в системе. Значение 1 запрещает параллельное выполнение. Поскольку распараллеливание может повысить производительность запросов, ограниченных возможностями ввода-вывода, вам, возможно, потребуется задать более высокое значение для параметра max degree of parallelism. Максимальное значение – 32.

max server memory

Параметр max server memory (максимальная память сервера) используется для задания максимального количества памяти, которое может быть динамически выделено в SQL Server. Этот параметр используется в сочетании с параметром min server memory. Количество памяти, выделяемое в SQL Server, будет находиться между значениями, заданными для параметров min server memory и max server memory. Если вы хотите зарезервировать дополнительное пространство для процессов, отличных от SQL Server, то можете использовать этот параметр. Значение по умолчанию, равное 0, указывает, что SQL Server будет выделять память автоматически.

max text repl size

Параметр max text repl size (максимальный размер для репликации) указывает максимальное количество байтов текста и данных типа image, которое можно добавить к реплицируемой колонке в одном операторе SQL.

max worker threads

Параметр max worker threads (максимальное количество потоков) указывает максимальное количество потоков Windows, которые может использовать SQL Server. Этот параметр можно изменять, чтобы предоставлять больше потоков для обработки в SQL Server. Но если SQL Server использует слишком много потоков, это приводит к перегрузке операционной системы.

media retention

Параметр media retention (хранение носителя) указывает количество дней хранения носителя резервной копии. SQL Server не перезаписывает этот носитель резервной копии, пока не пройдет указанное количество дней.

min memory per query

Параметр min memory per query (минимальная память на один запрос). Этот параметр указывает минимальное количество памяти, которое будет выделяться на один запрос. Значение по умолчанию – 1024, но вы можете задать значение от 512 байтов до 2 Гб. Задание этого параметра таким образом, чтобы при запуске запроса выделялось указанное количество памяти, может способствовать повышению производительности при больших сортировках и операциях хеширования.

min server memory

Параметр min server memory (минимальная память сервера) используется в сочетании с параметром max server memory для задания минимального и максимального количества памяти, которое будет использовать SQL Server. Значение по умолчанию, равное 0, указывает, что SQL Server будет выделять память автоматически.

nested triggers

Параметр nested triggers указывает, может ли один триггер инициировать другой триггер. Принятое по умолчанию значение 1 указывает, что это разрешено.

network packet size

Параметр network packet size (размер сетевого пакета) указывает размер входных и выходных пакетов данных SQL Server. Принятое по умолчанию значение 4096 указывает размер пакета в 4 Кб. Если у вас много больших результирующих наборов, то вам, возможно, потребуется увеличить это значение

open objects

Параметр open objects (открытые объекты) указывает максимальное количество объектов, которые можно одновременно открыть в базе данных SQL Server. Принятое по умолчанию значение равно 500, максимальное значение – 2 миллиарда.

priority boost

Значение 1 параметра priority boost (приоритетный запуск) указывает, что SQL Server запускается с более высоким, чем обычно, приоритетом планировщика Windows NT/2000. Принятое по умолчанию значение 0 запрещает запуск с более высоким приоритетом. Если задать для этого параметра значение 1, это может повысить производительность SQL Server, но другим процессам может недоставать времени ЦП. Вам следует задавать это значение, только если SQL Server является единственной программой, работающей в системе Windows NT. Изменение этого значения может вызвать проблемы, если вы не будете проявлять аккуратность. Изменяйте этот параметр под свою ответственность.

query governor cost limit

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

query wait

При недостатке памяти для запуска запроса SQL Server помещает этот запрос в очередь, пока не освободятся необходимые ресурсы. По умолчанию время ожидания в 25 раз превышает стоимость запроса. Задавая параметр query wait (время ожидания), вы указываете, тем самым, значение тайм-аута.

recovery interval

Параметр recovery interval (интервал восстановления) очень важен. Значение параметр recovery interval указывает максимальное количество времени, которое может потратить SQL Server на восстановление (воспроизведение) базы данных в случае отказа системы, и, тем самым, этот параметр определяет, насколько часто будут создаваться контрольные точки. Принятое по умолчанию значение 0 указывает, что SQL Server будет определять это значение автоматически.

remote access

Параметр remote access (удаленный доступ), имеющий значения Да (1) или Нет (0), указывает, допускаются ли входы по login-записям (учетным записям подключения) из удаленных систем SQL Server. Принятое по умолчанию значение 1 разрешает удаленные входы.

remote login timeout

Параметр remote login timeout (тайм-аут удаленного входа) указывает допустимое время ожидания (в секундах) при входе по удаленной login-записи. Значение по умолчанию равно 5.

remote proc trans

При значении параметра remote proc trans, равном 1, поддерживается соблюдение ACID-свойств для удаленных транзакций, выполняемых под управлением координатора распределенных транзакций MS DTC (Microsoft Distributed Transaction Coordinator).

remote query timeout

Параметр remote query timeout (тайм-аут удаленного запроса) указывает время (в секундах), после которого удаленный запрос будет прерван по тайм-ауту. Принятое по умолчанию значение 0 указывает, что запросы не будут прерываться по тайм-ауту.

scan for startup procs

Параметр scan for startup procs (сканирование для запуска процедур), имеющий значения Да (1) или Нет (0), указывает, будет ли SQL Server выполнять автоматическое сканирование для автоматического исполнения хранимых процедур. Принятое по умолчанию значение 0 указывает, что SQL Server не будет выполнять сканирование этих хранимых процедур,

set working set size

Параметр set working set size (установить размер рабочего набора) действует совместно с параметрами min server memory и max server memory. При установке этого параметра удаление ("откачка") страниц из памяти SQL Server не допускается, даже если SQL Server простаивает. Если вы хотите, чтобы SQL Server захватывал память динамически, не задавайте для этого параметра значение 1. Принятое по умолчанию значение 0 отключает параметр set working set size.

show advanced options

Если для параметра show advanced options (показать дополнительные параметры) задано значение 1, то вы можете использовать хранимую процедуру sp_configure для показа дополнительных параметров.

two digit year cutoff

Параметр two digit year cutoff (двузначный формат года) указывает интерпретацию двузначной записи года в SQL Server. Если год, заданный двумя цифрами, меньше значения, указанного этим параметром, то это 20xx год, и если он больше, то это 19xx год. Например, если для параметра two digit year cutoff задано значение 2049 (принятое по умолчанию), то 51 будет интерпретироваться как 1951 год, а 48 – как 2048 год.

user connections

Параметр user connections (количество подсоединений пользователей) указывает максимальное количество пользователей, которые могут одновременно подсоединяться к SQL Server. По умолчанию SQL Server динамически регулирует допустимое количество подсоединений пользователей, но это динамическое регулирование создает дополнительную нагрузку. Данный параметр позволяет вам задавать статически допустимое количество подсоединений пользователей.

user options

Параметр user options (параметры для пользователей) используется, чтобы задавать глобальные значения по умолчанию для всех пользователей.

Спецификации параметров

Некоторые из только что описанных параметров относятся к группе дополнительных параметров, в то время как остальные – стандартные параметры. Некоторые параметры начинают действовать сразу, а другие начинают действовать только после перезапуска SQL Server. В табл. A.1 приводится список параметров SQL Server вместе с их классификацией и необходимостью перезапуска, чтобы соответствующий параметр начал действовать.

Таблица A.1. Параметры SQL Server
ПараметрДополнительный параметрТребуется перезапуск
affinity maskДаДа
allow updatesНетНет
awe enabledДаДа
C2 audit modeДаДа
cost threshold for parallelismДаНет
cursor thresholdДаНет
default full-text languageДаНет
default languageНетНет
fill factorДаНет
index create memoryДаНет
lightweight poolingДаДа
locksДаДа
max degree of parallelismДаНет
max server memoryДаНет
max text repl sizeНетНет
max worker threadsДаДа
media retentionДаДа
min memory per queryДаНет
min server memoryДаНет
nested triggersНетНет
network packet sizeДаНет
open objectsДаДа
priority boostДаДа
query governor cost limitДаНет
query waitДаНет
recovery intervalДаНет
remote accessНетДа
remote login timeoutНетНет
remote proc transНетНет
remote query timeoutНетНет
scan for startup procsДаДа
set working set sizeДаДа
show advanced optionsНетНет
two digit year cutoffНетНет
user connectionsДаДа
user optionsНетНет

Изменение параметров с помощью Enterprise Manager

Вы можете модифицировать значения многих параметров SQL Server с помощью Enterprise Manager. Чтобы использовать Enterprise Manager для модифицирования значений параметров, нужно сначала открыть окно свойств SQL Server Properties. Для этого нужно щелкнуть правой кнопкой мыши на имени сервера в окне Enterprise Manager и выбрать из контекстного меню пункт Properties (Свойства). В каждом из следующих разделов дается описание параметров, содержащихся в одной из вкладок окна SQL Server Properties.

Вкладка General

Первая вкладка, которую вы видите в окне свойств, это вкладка General (Общие) (см. рис. A.1). Вкладка не содержит каких-либо базовых параметров конфигурирования, которые включены в другие вкладки. Однако вы можете задать в этой вкладке несколько параметров автозапуска (флажки Autostart) и параметров запуска. (Чтобы изменить значения параметров запуска щелкните на кнопке Startup Parameters.)

 Вкладка General (Общие) окна SQL Server Properties


Рис. A.1.  Вкладка General (Общие) окна SQL Server Properties

Вкладка Memory

Вкладка Memory (Память) показана на рис. A.2. В этой вкладке вы можете задать, как SQL Server будет выделять память – динамически или будет использовать фиксированное количество памяти. Чтобы задать этот параметр, щелкните на соответствующей кнопке выбора и переместите соответствующие ползунки. Во вкладке Memory вы можете также задавать минимальное количество памяти, которое SQL Server будет использовать для одного запроса.

  Вкладка Memory (Память) окна SQL Server Properties


Рис. A.2.  Вкладка Memory (Память) окна SQL Server Properties

Во вкладке Memory задаются следующие параметры конфигурирования:

Вкладка Processor

Вкладка Processor (Процессор) показана на рис. A.3. В этой вкладке вы можете выбирать ЦП (CPU), которые может использовать SQL Server. Вы можете задать с помощью соответствующих флажков максимальное количество потоков (Maximum worker threads), приоритетное выполнение SQL Server (Boost SQL Server priority) и использование "волокон" Windows (Use Windows NT fibers). И, наконец, вы можете указать, как SQL Server будет выполнять распараллеливание запросов (секция Parallelism).

 Вкладка Processor (Процесс) окна SQL Server Properties


Рис. A.3.  Вкладка Processor (Процесс) окна SQL Server Properties

Во вкладке Processor задаются следующие параметры конфигурирования:

Вкладка Security

Вкладка Security (Безопасность) показана на рис. A.4. В этой вкладке не задаются какие-либо параметры настройки. Вы можете задать здесь метод аутентификации (секция Authentication), уровень аудита (Audit level) и учетную запись Windows для запуска и выполнения SQL Server.

Вкладка Security (Безопасность) окна SQL Server Properties


Рис. A.4.  Вкладка Security (Безопасность) окна SQL Server Properties

Вкладка Connections

Вкладка Connections (Соединения) показана на рис. A.5. Эта вкладка содержит ряд параметров, относящихся к соединениям пользователей. Здесь вы можете задать максимально допустимое количество подсоединений пользователей и уровень проверки ограничений. В секции Remote Server Connections (Соединения с удаленным сервером) вы можете разрешить использование RPC-соединений (с удаленным вызовом процедур) и выполнение распределенных транзакций, а также задать длительность тайм-аута запросов.

Во вкладке Connections задаются следующие параметры:

Вкладка Connections (Соединения) окна SQL Server Properties


Рис. A.5.  Вкладка Connections (Соединения) окна SQL Server Properties

Вкладка Server Settings

Вкладка Server Settings (Параметры сервера) показана на рис. A.6. В этой вкладке вы можете задавать общие параметры сервера. Здесь можно задать язык по умолчанию для пользователя. Вы можете также задать параметры, разрешающие модифицирование каталога и запуск триггерами других триггеров, а также можете активизировать использование "регулятора" запросов (query governor). Вы можете также задать почтовый профиль и поддержку двузначной записи года.

Вкладка Server Settings (Параметры сервера) окна SQL Server Properties


Рис. A.6.  Вкладка Server Settings (Параметры сервера) окна SQL Server Properties

Параметры вкладки Server Settings используются для задания следующих параметров:

Вкладка Database Settings

Вкладка Database Settings (Параметры базы данных) показана на рис. A.7. В этой вкладке вы можете задать коэффициент заполнения (fill factor), а также параметры резервного копирования и интервал восстановления (recovery interval). Кроме того, здесь можно задать местоположение файлов по умолчанию. Это местоположение будет использоваться для создания новых баз данных, если оно не указано в команде создания базы данных.

Вкладка Database Settings (Параметры базы данных) окна SQL Server Properties


Рис. A.7.  Вкладка Database Settings (Параметры базы данных) окна SQL Server Properties

Во вкладке Database Settings задаются следующие параметры:

Вкладка Replication

Вкладка Replication (Репликация) показана на рис. A.8. Эта вкладка используется для просмотра и задания параметров опубликования и распространения репликации. Здесь вы можете также добавить текущую систему в группу мониторинга репликации. Это позволяет группировать вашу систему с другими системами при мониторинге репликации.

Вкладка Active Directory

Вкладка Active Directory (см. рис. A.9) используется для модифицирования записей Active Directory. Вы можете добавить текущую систему в Active Directory, обновить ее статус в Active Directory или удалить эту систему из Active Directory.

Вкладка Replication (Репликация) окна SQL Server Properties


Рис. A.8.  Вкладка Replication (Репликация) окна SQL Server Properties

Вкладка Active Directory окна SQL Server Properties


Рис. A.9.  Вкладка Active Directory окна SQL Server Properties

Дополнение. Приложение B. Параметры конфигурирования Microsoft SQL Server

В Microsoft SQL Server включены объекты и счетчики, которые используются монитором производительности для мониторинга процессов в системах SQL Server. Объекты представляют ресурсы Microsoft Windows и SQL Server, и каждый объект содержит один или несколько счетчиков, которые следят за различными аспектами этого объекта. В этом приложении приводится каждый объект и его счетчики. В статье для каждого счетчика содержится краткое описание данных, возвращаемых этим счетчиком, и статьи для некоторых счетчиков содержат дополнительную информацию.

Объект SQL Server: Аccess Methods

Данный объект содержит счетчики, которые следят за различными методами и свойствами доступа к объектам. Это следующие счетчики.

Объект SQL Server: Backup Device

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

Объект SQL Server: Buffer Manager

Данный объект содержит ряд счетчиков, относящихся к буферному кэшу SQL Server. Это следующие счетчики.

Примечание. В следующем ниже списке "AWE" означает Address Windowing Extensions (интерфейс расширенной памяти Windows 2000). AWE используется для поддержки в SQL Server физической памяти свыше 4 гигабайт (Гб). Для использования такого объема памяти SQL Server выполняет специальные системные вызовы.

Объект SQL Server: Cache Manager

Этот объект используется для просмотра статистики Cache Manager. Каждый из этих счетчиков может следить за следующими экземплярами данного объекта: Adhoc SQL Plans, Misc. Normalized Trees, Prepared SQL Plans, Procedure Plans, Replication Procedure Plans и Trigger Plans. Это следующие счетчики.

Объект SQL Server: Databases

Этот объект содержит набор счетчиков, которые следят за каждой базой данных в системе. Выбранный экземпляр объекта представляет базу данных, за которой вы хотите следить. Вы можете следить за базами данных master, model, msdb и tempdb, а также за базой данных Northwind, pubs и всеми базами данных, которые создаются пользователями. Это следующие счетчики.

Объект SQL Server: General Statistics

Счетчики этого объекта дают вам некоторую общую информацию о подсоединениях пользователей к SQL Server. Это следующие счетчики.

Объект SQL Server: Latches

Этот объект используется для показа статистики по защелкам. Защелки (latches) – это внутренние механизмы блокирования, используемые в SQL Server. Данный объект дает информацию по этим внутренним защелкам и содержит следующие счетчики.

Объект SQL Server: Locks

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

Объект SQL Server: Memory Manager

Этот объект предоставляет информацию о памяти SQL Server, отличной от буферной кэш-памяти. Имеются следующие счетчики этого объекта.

Объект SQL Server: Replication Agents

Этот объект содержит один счетчик.

Объект SQL Server: Replication Dist.

Этот объект используется для просмотра информации о дистрибьюторах и подписчиках. Имеются следующие счетчики.

Объект SQL Server: Replication Logreader

Этот объект используется для просмотра информации о дистрибьюторах и подписчиках. Имеются следующие счетчики.

Объект SQL Server: Replication Merge

Этот объект относится к процессу репликации слиянием. Он содержит следующие счетчики.

Объект SQL Server: Replication Snapshot

Этот объект относится к процессу репликации моментального снимка. Он содержит следующие счетчики.

Объект SQL Server: SQL Statistics

Этот объект относится к процессу репликации моментального снимка. Он содержит следующие счетчики.

Объект SQL Server: User Settable

Объект SQL Server: User Settable содержит набор счетчиков, которые вы можете задавать. Вы можете задать эти счетчики из любого оператора SQL путем вызова системных хранимых процедур от sp_user_counter1 до sp_user_counter10, сопровождаемых целым значением для счетчика. Вы можете читать эти счетчики в Performance Monitor путем просмотра следующего счетчика.

Объект SQL Server: User Settable

Объект SQL Server: User Settable содержит набор счетчиков, которые вы можете задавать. Вы можете задать эти счетчики из любого оператора SQL путем вызова системных хранимых процедур от sp_user_counter1 до sp_user_counter10, сопровождаемых целым значением для счетчика. Вы можете читать эти счетчики в Performance Monitor путем просмотра следующего счетчика.

Дополнение. Приложение C. Команды DBCC

В Microsoft SQL Server имеется набор команд, предназначенный для выявления и устранения проблем согласованности в базе данных SQL Server. Для запуска этих команд нужно использовать в качестве префикса строку DBCC. На самом деле "DBCC" означает "database consistency checker" (средство проверки согласованности базы данных). Хотя команды DBCC первоначально разрабатывались как инструменты проверки согласованности, со временем диапазон применения команд DBCC расширился.

В этом приложении приводится список команд DBCC и дается краткое описание каждой команды, что позволяет вам быстро находить нужную вам команду. В этом приложении не представлены все параметры каждой команды DBCC. Полные инструкции по выполнению этих команд можно найти в SQL Server Books Online.

Дополнение. Глоссарий

А

Aгент. Программа, работающая в Microsoft Windows 2000 или в Windows 2000 независимо, как бы "сама по себе", и выполняющая какое-либо обслуживание. Агент обычно имеет некоторую конкретную задачу, например, планирование операций или исполнение заданий репликации. В операционных системах семейства UNIX такие программы называются "демонами" (daemons).

Агрегатная функция (aggregate function). Функция, выполняющая операцию над набором величин и возвращающая одно значение. В SQL Server имеются следующие агрегатные функции: AVG, COUNT, DISTINCT, GROUP BY, HAVING, MAX, MIN, STDEV, STDEVP, SUM, VAR и VARP.

Адаптер главной шины (HBA, host bus adapter). Компонента компьютера, служащая для взаимодействия с шиной ввода-вывода.

Администратор баз данных (DBA, database administrator).Человек или люди, отвечающие за поддержку базы данных. Обязанности администраторов баз данных могут в различных фирмах могут сильно отличаться.

Активные серверные страницы.См. ASP-страница (Active Server Pages page).

Анализатор запросов См. SQL Query Analyzer.

Асинхронный режим передачи (ATM, Asynchronous Transfer Mode).Аппаратный сетевой протокол ATM– стандартизованная Международным союзом по телекоммуникациям (ITU) сетевая технология, заключающаяся в пересылке данных в форме ячеек (cells), то есть пакетов фиксированной длины. Передача данных является асинхронной в том смысле, что передача ячеек (пакетов) с информацией от отдельных пользователей производится необязательно периодически.

Б

База данных (database). Хранилище данных. Масштабы баз данных могут варьировать от небольшого списка имен до записей данных обо всех людях в мире.

Блок (block).См. страница.

Блокировка (lock, locking).Объект-"замок", используемый для того, чтобы к ресурсу мог бы иметь доступ одновременно только один поток. Блокировка при помощи таких замков очень важна, особенно для симметричных многопроцессорных систем (SMP systems, symmetric multiprocessor systems), потому что возможны ситуации, когда к ресурсу пытаются осуществить доступ несколько процессов одновременно.

В

Ввод-вывод (input/output, I/O). Перемещение данных от одной компоненты компьютера к другой. Этот термин применяется при описании доступа к дисковой подсистеме или к другим компонентам для передачи данных.

Виртуальная память (virtual memory). Механизм управления памятью, благодаря которому Windows NT/2000 может обращаться к памяти, большей, чем память, фактически установленная в компьютере. Это возможно благодаря подкачке страниц (свопингу). В каждый момент времени в оперативной памяти на самом деле размещается лишь часть виртуальной памяти.

Внешнее соединение (outer join). Операция, которая возвращает все строки из хотя бы одной таблицы или представления, упомянутых в предложении FROM, когда их строки удовлетворят какому либо условию поиска WHERE или. HAVING.

Внешний ключ (foreign key). Поле таблицы, которое ссылается на аналогичное поле.

Восстановление из резервной копии (restore). Процесс, при котором файл резервной копии (backup file). копируется обратно в базу данных SQL Server. После выполнения восстановления база данных вернется в состояние, в котором она была в момент создания резервной копии.

Восстановление (регенерация) системы (recovery). Процесс перезапуска SQL Server после краха системы. Чтобы произвести повторное исполнение (roll forward) всех зафиксированных транзакций или откат (roll back) всех зафиксированных транзакций, необходимо воспользоваться журналом транзакций; тогда база данных придет в то состояние, которое было перед моментом краха системы.

Время отклика (response time).Продолжительность времени между моментом, когда пользователь подал запрос на доступ к данным (на исполнение ими транзакций) и возвратом данных пользователю. Время отклика часто служит для оценки производительности системы.

Время поиска дорожки (seek time). Продолжительность времени, необходимого для перехода головок дискового накопителя к дорожке, на которой находятся нужные данные.

Г

Графический пользовательский интерфейс (graphical user interface, GUI). Интерфейс приложения, имеющий графическую природу, что облегчает пользование приложением. Графический пользовательский интерфейс может применяться для наглядного отображения данных.

Группа файлов (filegroup). Группа файлов, применяемых как хранилище для объектов SQL Server. Группа файлов может состоять из одного или нескольких файлов данных. При создании объектов SQL Server они могут быть назначены тем или иным группам файлов.

Д

Данные контроля по четности (parity). Дополнительные данные (псевдоданные), применяемые для проверки или для исправления основных данных. Обычно говорят "бит четности" о бите, применяемом для дополнения относящихся к нему битов данных до четности или до нечетности. Проверяя четность либо нечетность битов данных, система может удостовериться в их правильности. Контроль по четности применяется для защиты данных в системах RAID 5.

Двухфазная фиксация транзакций (two-phase commit). Протокол, при помощи которого происходит координация транзакций между двумя независимыми системами, который обеспечивает в отношении транзакций принцип "всё или ничего". Двухфазная фиксация транзакций разделяет операцию фиксации на две фазы: сначала происходит подготовительная фаза (prepare phase), а вторая фаза называется фазой фиксации (commit phase). Эти фазы запускаются из приложений командой COMMIT.

Декартово произведение (Cartesian product). Результат соединения, не имеющего предложения WHERE. Размер результирующего набора данных равен произведению числа строк первой таблицы и числа строк второй таблицы. Декартово произведение обычно не является желанным результатом запроса.

Диск (disk). В нашей книге термин "диск" означает дисковый накопитель с несъемным диском – магнитный носитель информации, предназначенный для хранения данных. На диске возможно долговременное сохранение информации: данные сохраняются даже при отключении или сбоях электропитания.

Дистрибьютор (distributor). Промежуточный участник репликации SQL Server. Дистрибьютор берет данные репликации от издателя (publisher) и предлагает их подписчикам (subscribers).

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

Домен (domain).Группа компьютеров в сети Windows 2000 или Windows NT, имеющих общий список пользователей и пароли.

Ё

Ёмкость ввода-вывода (I/O capacity). Объем работы, который может выполнять подсистема ввода-вывода. Ёмкость ввода-вывода ограничена либо количеством операций ввода-вывода (если ограничивающим фактором является доступ к случайным дорожкам), либо производительностью (если происходят переходы головок на соседние дорожки диска).

Ж

Журнал транзакций (transactional log). Файл в базе данных, применяемый для записи всех изменений базы данных. В журнале транзакций также хранится информация о транзакциях, осуществивших изменения. Журнал транзакций хранит информацию, которой достаточно для отмены транзакций (если нужен откат, rollback) и для повторного выполнения транзакций (если нужно отменить откат)

З

Задержка (latency). Этот термин обозначает время, которое тратится процессом на ожидание завершения какой-либо операции. Чаще всего этот термин применяется, когда речь идет об ожидании процессом завершения операции ввода-вывода.

Задержка вращения (rotational latency). Продолжительность времени, требуемого, чтобы диск дискового накопителя повернулся бы в положение, необходимое для доступа к запрошенным данным.

Запись (record). Одна строка в базе данных.

Запрос (query). Оператор SQL SELECT, применяемый для доступа к данным, находящимся в базе данных. В нашей книге термин "запрос" означает операции, которые лишь считывают, но не изменяют данные.

Зеркальное отражение (mirroring).Методика обеспечения отказоустойчивости при помощи создания дублирующей компоненты, хранящей запасную копию, которую можно применить при отказе основной компоненты. Зеркальные отражения обычно употребляют в подсистемах ввода-вывода. Зеркальные отражения применяются в RAID 1 и в RAID 10.

И

Идентификатор системного процесса (SPID, system process identifier). Уникальное короткое целое ( smallint ), сопоставляемое с каждым из пользовательских соединений в момент создания соединения. Данное сопоставление не является постоянным.

Издатель (publisher). Система SQL Server, реплицирующая (распространяющая) свои данные для других систем. Получатели данных репликации называются подписчиками.

Измерения для планирования емкости (capacity planning measurement).Совокупность статистических показателей измерений производительности, применяемых для оценки использования ресурсов для исполнения рабочей нагрузки, предназначенных для планирования установки дополнительных аппаратных ресурсов. Такие измерения займут больше времени, чем измерения производительности (обычно – несколько часов или даже целый день).

Измерения производительности (performance measurement).Совокупность статистических показателей измерений производительности (называющихся показателями производительности), применяемых для слежения за состоянием компьютера и для настройки компьютера. Такие измерения производятся быстро (обычно – секунды или минуты, иногда –несколько часов) и служат для выявления и исправления анорБ¤ZQVрБ¤ZQVАИџZQV0:ўZQVXВ¤ZQVВ¤ZQV@В¤ZQVindows NT/2000 для ресурса в сети. Имена UNC имеют такой синтаксис:

\\имя_сервера\имя_разделяемого_ресурса

Здесь имя_сервера обозначает имя сетевого сервера, а имя_разделяемого_ресурса обозначает имя разделяемого ресурса. В имена UNC также обычно включаются путь к директории и имя файла, вот так:

\\имя_сервера\имя_разделяемого_ресурса\имя_директории\имя_файла

Именованные каналы (named pipes).Сетевая библиотека SQL Server. Именованные каналы требуются для инсталляций SQL Server/Windows NT. Именованные каналы являются защищенной сетевой библиотекой и поддерживают некоторые нижележащие сетевые протоколы, такие как IPX/SPX, NetBEUI и TCP/IP.

Индекс (index). Вспомогательная структура данных, применяемая для ускорения доступа к данным внутри базы данных.

Индексное сканирование (index scan). Операция, происходящая при считывании группы элементов индекса с целью поиска нужных данных. Такое сканирование обычно выполняется при доступе к композитному индексу, когда не все колонки, образующие индекс имеются в предложении WHERE запроса.

Интервал восстановления (recovery interval).Продолжительность времени, которое необходимо SQL Server для восстановления после краха системы.

K

Кластер (cluster). См. кластеризованный индекс и службы MSCS (Microsoft Cluster Services, службы для поддержки перехода к другому узлу кластера при отказах).

Кластеризованный индекс (clustered index). Комбинация индекса и таблицы. Такой индекс хранится как сбалансированное дерево (balanced tree, B-tree), а данные хранятся в узлах-листьях индекса.

Ключ (key). Колонка или несколько колонок, применяемые для определения точки доступа (access point) к индексу. Если композитный индекс создан из двух колонок, то эти две колонки образуют ключ индекса.

Коллизия (collision). Ситуация, возникающая, когда два контроллера одновременно пытаются пользоваться сетью. Каждый из контроллеров обнаруживает коллизию и обычно ждет некоторое время (его длительность выбирается случайным образом), а затем повторяет попытку. В сети с большой нагрузкой, коллизии могут стать узким местом для производительности. Термин "коллизия" обычно применяется к сетям Ethernet.

Колонка (column). Набор одноименных полей для всех строк с данными из таблицы. Каждая колонка имеет сопоставленный с ней тип данных. Все колонки одной строки образуют запись базы данных.

Коммутатор (switch). Сетевое устройство, в котором разъемы соединяются электрически друг с другом, причем путь для этого соединения устанавливается в зависимости от сетевых адресов. Коммутаторы отличаются и от хабов (концентраторов) – в хабах трафик виден на всех разъемах, и от маршрутизаторов – в маршрутизаторах производится модификация пакетов.

Композитный индекс (composite index). Индекс, создаваемый на комбинации двух или нескольких колонок.

Контрольная точка (checkpoint). Операция, выполняемая для синхронизации файлов данных с текущим содержимым кэша памяти базы данных, чтобы уменьшить время восстановления, которое потребуется в случае отказа системы. Процесс создания контрольной точки просматривает список черновых страниц (dirty pages) и записывает ("сбрасывает") их на диск.

Концентратор (hub). См. хаб.

Корневой узел (root node). Вершинный узел индекса.

Корпоративный (enterprise). ермин, относящийся к системе, работающей для всего предприятия (фирмы).

Кэш (cache). Оперативная память, применяемая для хранения данных, обращения к которым производятся часто, благодаря чему можно повысить скорость работы. SQL Server имеет свой собственный кэш, состоящий из памяти Windows 2000 и применяемый для хранения страниц, доступ к которым производится чаще всего. Этот кэш называется "кэш буфера SQL Server" или "кэш страниц". Чипы центральных процессоров тоже имеют свои собственные встроенные кэши; свои кэши имеются также у некоторых контроллеров ввода-вывода.

Кэш второго уровня (level 2 cache, L2 cache). Память, либо встроенная в чип центрального процессора, либо находящаяся за пределами чипа центрального процессора, и используемая при переполнении кэша первого уровня.

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

Кэш процедур (procedure cache). Часть памяти SQL Server, применяемая для кэширования хранимых процедур и операторов SQL, прошедших синтаксический разбор. Кэш процедур служит для повышения производительности SQL Server.

Куб (cube). Многомерное представление сразу и данных-подробностей и итоговых данных. Понятие куба обычно используется в технологии аналитической обработки данных в реальном времени (OLAP, on-line analytical processing).

Л

Логический диск (logical disk drive). Виртуальный дисковый накопитель, воспринимаемый операционной системой как физический диск, но на самом деле состоящий из одного или нескольких дисковых накопителей RAID-системы.

М

Маршрутизатор (router).Сетевое устройство, которое передает данные из одной подсети в другую подсеть в соответствии с сетевыми адресами.

Массовое копирование (bulk copy).Общий термин, обозначающий копирование больших объемов данных в базу данных или из базы SQL Server. Обычно для выполнения массового копирования применяется оператор T-SQL BULK INSERT.

Массовое наполнение базы данных (bulk load).Наполнение базы данных при помощи операций массового ввода данных (bulk insert). Массовое наполнение базы данных может производиться при помощи оператора T-SQL BULK INSERT либо при помощи утилиты BCP.

Мгновенная репликация (snapshot replication).Форма репликации, при которой вся публикация целиком периодически копируется от издателя к подписчику.

Модель "клиент-сервер" (client/server model).Модель программирования, при которой компоненты программы, в которых содержится пользовательский интерфейс, располагаются в выполняемой программе на компьютере пользователя и осуществляют доступ к данным в базе данных на сервере. Алгоритм работы приложения распределен между клиентом (компьютером пользователя) и сервером.

Н

Носитель (medium, множественное число: media). Объект, на который производится запись данных. Носителями, например, являются дисковые и ленточные накопители.

O

Объединение по эквивалентности (equijoin). Соединение, в котором применяется операция эквивалентности в предложении WHERE оператора SQL, выполняющего это соединение.

Ограничение FOREIGN KEY (FOREIGN KEY constraint). Ограничение, требующее, чтобы внешние ключи (foreign key) были правильными первичными ключами (primary key) базы данных. Этот тип ограничений применяется обычно для проверки доступности данных, на которые сделаны ссылки.

Ожидание в очереди (queuing). Состояние нахождения в очереди. Ожидания в очередях могут возникать в SQL Server, в операционной системе и в аппаратуре.

Оперативная память (RAM, random access memory). Запоминающее устройство, не способное к постоянному хранению данных, применяемое для хранения данных во время их обработки. Оперативная память быстрее, чем диск, но при отключении или при сбое электропитания все хранимые в ней данные пропадают.

Оптимизатор запросов SQL Server (SQL Server query optimizer). Внутренняя компонента SQL Server, которая анализирует статистику SQL Server и статистику предметной области, чтобы найти оптимальный план исполнения для запросов. Пользователи не имеют доступа к оптимизатору запросов; оптимизатор запросов получает синтаксически разобранные операторы SQL от синтаксического анализатора.

Отказоустойчивость (fault tolerance). Способность подсистемы продолжать функционирование после отказа компоненты. Отказоустойчивость достигается благодаря применению избыточных компонент. Отказоустойчивость обычно связывают с подсистемой ввода-вывода и RAID-контроллерами, но отказоустойчивыми могут быть и другие подсистемы, например источники электропитания.

Очередь (queue).Список процессов или потоков, ожидающих исполнения.

Очистка (усечение) (truncating).Операция, при которой происходит удаление всех строк из объекта, но удаление самого объекта не производится.

П

Память (memory). Термин, употребляемый, когда речь идет об оперативной памяти (RAM, random access memory), распределенной и используемой операционной системой и SQL Server. В нашей книге термин "память" обозначает оперативную память (основную память, main memory). Память SQL Server служит в основном для хранения кэша. Память не может служить долговременным хранилищем для информации: при отключении электричества информация в ней пропадает.

Параллельный поиск (split seek). Особенность работы систем RAID 1 и RAID 10, заключающаяся в том, что оба диска в составе зеркальной пары дисков производят поиск данных одновременно.

Параметр конфигурации (configuration parameter).Переменная, при помощи которой можно изменить поведение SQL Server. Параметры конфигурации применяются для настройки механизма работы SQL Server. Параметры конфигурации влияют, например, на распределение памяти SQL Server, на счетчики потоков (thread counts) и на максимально допустимое количество пользовательских соединений.

Пакет (packet). См. сетевой пакет.

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

Переходная таблица (staging table). Временная таблица, в которую должны заноситься данные, которые затем могут извлекаться или преобразовываться и копироваться в постоянные таблицы. Переходные таблицы обычно применяются, когда нужно выполнять преобразования данных внутри базы данных.

Период максимальной загруженности (peak utilization period).Время, когда компьютер больше всего занят работой (рабочий день, либо определяемое по результатам измерений).

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

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

План исполнения (execution plan). Метод, при помощи которого оператор SQL Server, проходящий синтаксический разбор, осуществляет действия с базой данных.

Подкачка страниц (paging, swapping). Процесс, который происходит, когда операционная система и SQL Server используют объем памяти, больший, чем физически доступная память, из-за чего происходит временное копирование данных на диск. При возникновении подкачки страниц производительность системы резко снижается. Подкачка страниц имеет и другое название – свопинг.

Подписчик (subscriber).Получатель данных репликации SQL Server.

Подсказка (hint). Необязательное предложение, которое вы можете добавлять к оператору SQL, благодаря которому оптимизатор запросов получает информацию о том, как, по вашему мнению, должен быть построен план исполнения.

Поле (field). См. колонка.

Полное сканирование таблицы (full table scan). Операция выборки, при которой для поиска нужных данных прочитываются все строки таблицы. Полное сканирование таблицы обычно нежелательно, т.к. при этом возникает очень большой объем операций ввода-вывода.

Поток (thread). Понятие в операционных системах Windows NT и Windows 2000, благодаря которому логику исполнения приложения можно разделить на несколько частей, исполняющихся одновременно. Все потоки являются частями одного и того же процесса и пользуются общей для них памятью.

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

Приложение (application).Программа, которая взаимодействует с пользователями. Приложения баз данных обычно также взаимодействуют с системой управления реляционной базой данных, СУРБД (RDBMS, Relational DataBase Management System).

Программа проверки согласованности базы данных (DBCC, database consistency checker). Программа-утилита для поиска и исправления проблем, связанных с целостностью базы данных.

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

Процессор (processor).Центральный процессор (CPU, central processing unit). – это "мозг" компьютера. Обычный компьютер состоит из одного или нескольких центральных процессоров, оперативной памяти и дисковой памяти.

Публикация (publication). Группа статей репликации (articles), реплицируемых издателем репликации.

Р

Рабочее множество (working set). Объем памяти, используемой процессом в текущий момент времени.

Расслоение данных (striping).Распределение данных одинаковыми объемами по двум или нескольким дисковым накопителям. В системах RAID данные логического диска размещаются равными долями по всем дисковым накопителям RAID-системы.

Резервная копия (backup). Копия содержимого базы данных SQL Server, применяемая при восстановлении после отказа системы. Резервная копия может быть снова скопирована в базу данных, чтобы вернуть базу данных к состоянию, которое было у нее в то время, когда выполнялось резервное копирование.

Резервное копирование групп файлов (filegroup backрБ¤ZQVрБ¤ZQVАИџZQV0:ўZQVXВ¤ZQVВ¤ZQV@В¤ZQVервное копирование и восстановление отдельных групп файлов, а не всей базы данных. Благодаря этому можно выполнять резервное копирование всей базы данных лишь раз в несколько дней.

Репликация (replication).Функциональная возможность SQL Server, благодаря которой происходит автоматическое создание копий объектов и подмножеств объектов SQL Server на системе и распространение объектов репликации на другие системы. Репликация может иметь три формы: моментальных снимков, транзакционная и репликация слиянием.

Репликация слиянием (merge replication).Схема репликации, которая была разработана для многонаправленной репликации. При помощи репликации слиянием можно обновлять данные и издателей, и подписчиков, причем без применения MS DTC.

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

Рынок данных (data mart).Система поддержки принятия решений, созданная из корпоративной системы аналитической обработки данных в реальном времени (OLAP). "Рынки данных" отличаются от "складов данных" (data warehouses) тем, что рынки данных хранят данные, применяемые обычно в каком-либо одном сегменте бизнеса, например, данные о дебиторских задолженностях или данные о счетах к оплате, а склады данных хранят все данные фирмы.

C

Самосоединение, рефлексивное соединение (self join).Соединение таблицы с нею же самой.

Свопинг (swapping). См. подкачка страниц.

Селективность (selectivity). Способность индекса идентифицировать объекты. Про индекс с небольшим числом уникальных значений говорят, что он обладает плохой селективностью. Уникальный индекс обладает превосходной селективностью.

Секционирование (partitioning).Процесс, при котором происходит разделение таблицы или базы данных на отдельные компоненты, чтобы получились наборы данных меньшего размера и более удобные в работе.

Сетевой пакет (network packet).Набор данных, содержащий управляющую информацию, передаваемый по сети как единое целое. Запрос SQL Server может уместиться в один сетевой пакет, а иногда для него может потребоваться несколько сетевых пакетов.

Симметричная многопроцессорная система (SMP, symmetric multiprocessor system).Вычислительная система с несколькими равноправными центральными процессорами (функционирующими одинаково), осуществляющими доступ к общей памяти. Обычно каждый центральный процессор имеет свой собственный кэш памяти, но оперативная память не сопоставляется ни с одним из центральных процессоров.

Синтаксический разбор (parse). Процесс, выполняемых SQL Server, при котором происходит разбиение оператора SQL  на основные компоненты (перед его передачей оптимизатору запросов).

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

Система поддержки принятия решений (DSS, decision support system).Система управления базой данных, применяемая для помощи при принятии решений, касающихся бизнеса; для принятия решения используется информация, хранящаяся в базе данных. Принимаемые решения могут основываться на тенденциях продаж, на анализе продаж продуктов и т.д.

Система управления базами данных, СУБД (DBMS, database management system). Программы, файлы, процессы и память, из которых образована база данных. SQL Server является реляционной СУБД (системой управления реляционными базами данных, СУРБД), relational database management system (RDBMS).

Система управления реляционными базами данных, СУРБД (RDBMS, relational database management system). Система управления базами данных, хранящая данные в соответствии с реляционной моделью данных. Данные организованы в иерархические структуры, отражающие взаимоотношения (relations) между объектами. SQL Server является примером системы управления реляционными базами данных.

Системный администратор (system administrator).Человек или несколько людей, которые на вашей фирме отвечают за поддержку компьютерного оборудования и операционных систем. На разных фирмах обязанности системных администраторов могут быть разными.

Сканирование таблицы (table scan). Операция, при которой для отыскания интересующих данных нужно прочитать все строки таблицы. Сканирование всей таблицы обычно не является хорошим способом для исполнения запросов.

Склад данных (data warehouse).Система поддержки принятия решений, созданная из корпоративной системы аналитической обработки данных в реальном времени (OLAP). "Склады данных" могут быть очень объемными и содержать терабайты данных.

Службы компонент (component services). Это – набор продуктов, основанных на технологиях COM (Component Object Model) и DCOM (Distributed Component Object Model), Microsoft Transaction Server (MTS), Microsoft Internet Information Server (IIS) и Microsoft Queue Server из Windows NT 4. С появлением Windows 2000 модели COM и DCOM развились до нового уровня, который называется COM+. Приложения COM+ и другие системные службы образуют службы Windows 2000 Component Services.

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

Соединение (join). Операция, соединяющая данные из двух или нескольких таблиц, пользующаяся отношениями между этими таблицами.

Статья репликации (article). Статья репликации – таблица или подмножество данных, выбираемых для репликации.

Страница (page).Основная единица хранения данных в SQL Server. Страница – это наименьший объем данных, записываемых или считываемых на диск (с диска) или в память (из памяти). У Microsoft SQL Server 2000 размер страницы составляет 8 Кб, и он был 8 Кб у Microsoft SQL Server 7 и 2 Кб у Microsoft SQL Server 6.5.

Строка (row).Одна запись в базе данных. Строка (одна запись) данных является одним элементом базы данных и состоит из нескольких элементов данных, которые называются "колонки" (поля).

СУБД.См. система управления базами данных.

Схема (schema). Набор объектов, связанных с базой данных. Объектами схемы могут быть таблицы, индексы, представления и т.д.

Схема "звезда" (star schema).Схема, в которой имеется одна таблица фактов, окруженная таблицами размерности (dimension tables). Таблицы размерности служат для формирования основы аналитической обработки данных из таблицы фактов. Каждая из таблиц размерности соединена с колонкой в таблице фактов. Таблица фактов, окруженная таблицами размерности, напоминает звезду. Схема "звезда" обычно применяется в складах данных (data warehouses).

Схема "снежинка" (snowflake schema).Схема, в которой применяются таблицы размерности (dimension tables), соединяющиеся с таблицей фактов (fact table) не непосредственно, а через другие таблицы размерности. Между таблицами размерностей и таблицей фактов могут находиться несколько слоев (уровней) таблиц размерностей. Если вы нарисуете эту схему, то она своим внешним видом будет похожа на снежинку.

"Сырое устройство" (raw device).Способ доступа к дисковым накопителям – через интерфейс "сырого устройства", то есть без пользования средствами файловой системы.

Т

Транзакционная репликация (transactional replication) Форма репликации, при которой на подписчике производится повторение всех тех транзакций, которые были исполнены на издателе.

Транзакция (transaction). Набор операторов SQL, заканчивающийся оператором COMMIT либо ROLLBACK. Термином "транзакция" обычно называют операторы, которые изменяют данные, а термином "запрос" называют операторы SELECT, осуществляющие только чтение данных

Триггер (trigger). Особый вид хранимых процедур. Триггер запускается (срабатывает) автоматически при исполнении некоторого условия. Этим условием может быть исполнение для какой-либо таблицы операторов UPDATE, INSERT либо DELETE.

У

Узел-ветвь (branch node). Промежуточный узел индекса. Узлы-ветви располагаются между корневым узлом и узлами-листьями.

Узел-лист (leaf node). Узел индекса, находящийся на самом нижнем уровне иерархии узлов. Узел-лист содержит либо указатели на "сырые данные" (raw data), либо сами данные (для случая кластеризованного индекса).

Узкое место (bottleneck). Компонента, ограничивающая производительность. Этот термин возник из образа бутылки с жидкостью – узкое горлышко бутылки (bottle neck) замедляет поток жидкости, вытекающей из бутылки.

Уникальный (unique). Этот термин означает, что для какой-либо величины нет совпадающих значений. Чтобы добиться для SQL Server уникальности, вы можете создать либо ограничение, либо уникальный индекс.

Упреждающий анализ (predictive analysis). Математический метод, применяемый для предсказания последствий тех или иных изменений системы. Упреждающий анализ может применяться для предсказания последствий от увеличения числа пользователей или от добавления системных ресурсов.

Уровень RAID (RAID level).Обозначение применяемой конфигурации RAID.

Установившийся режим (steady state).Средний показатель использования компьютера для некоторого периода измерения или за рабочий день.

Ф

Файл данных (data file).Физический файл операционной системы, в котором хранятся данные, сопоставленные с группой файлов и, в свою очередь, с базой данных. Под SQL Server это может быть файл файловой системы NTFS либо "сырое устройство" (raw device) Windows NT/2000.

Физическая память (physical memory). Чипы, применяемые в качестве памяти компьютера.

Х

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

Хранимая процедура (stored procedure).Один или несколько операторов T-SQL, скомпилированных в один план исполнения. Этот план исполнения хранится в базе данных SQL Server.

Ц

Целостность данных (data integrity).Правильность и полнота данных в базе данных. При соблюдении целостности данных в базе данных содержатся только правильные данные (данные, согласующиеся с моделью бизнеса). Когда речь идет о целостности ссылочных данных, то применяется термин "целостность на уровне ссылок" (referential integrity).

Ч

Черновая страница (dirty page). Страница кэша SQL Server, которая была изменена, но не записана на диск.

Э

Эпизодический запрос (ad hoc query).Этим термин обозначает спонтанные, не запланированные заранее, запросы. Как правило, эпизодические запросы не оптимизированы и вводятся через Query Analyzer, ISQL или OSQL, а не через приложение.

Я

Язык определения данных (DDL, data definition language).Операторы SQL Server, применяемые для определения или декларирования объектов базы данных. В состав DDL входят такие операторы, как CREATE DATABASE и DROP DATABASE.

Язык манипулирования данными (DML, data manipulation language). Операторы SQL, применяемые для ввода данных в базу данных или для обновления данных, удаления данных и доступа к данным в базе данных.

A

API (Application Programming Interface, интерфейс прикладного программирования).Стандартный и документированный интерфейс, в соответствии с которым пишутся программы. Программируя в API, разработчики создают программы, способные использовать внешние функции, например, такие как функции доступа SQL Server.

AppleTalk. Сетевой протокол фирмы Apple.

ASP-страница (Active Server Pages page)."Активная серверная страница" – веб-страница, которая динамически создает HTML-страницы на сервере. Для доступа к Microsoft SQL Server через Всемирную Паутину (World Wide Web) обычно применяются ASP.

ATM (Asynchronous Transfer Mode). См. Асинхронный режим передачи (ATM).

B

BCP (Bulk Copy Program). Программа-утилита массового копирования, поставляемая вместе с SQL Server и применяемая для загрузки данных из текстовых файлов в базы данных.

BULK INSERT.Команда T-SQL, применяемая для копирования больших объемов данных из файла данных в таблицу SQL Server, находящуюся внутри SQL Server.

C

COM (модель компонентных объектов COM, Component Object Model). Технологии COM (Component Object Model) – это набор интерфейсов программирования API и инструментальных средств, разработанных фирмой Microsoft. Эти приложения работают под управлением Microsoft Transaction Server (MTS) на компьютере-сервере или под управлением Distributed COM (DCOM) на компьютере-клиенте. Разработчики создают клиенты COM при помощи таких платформ, как Microsoft Visual Basic или Microsoft Visual C++. Приложения могут быть созданы также при помощи таких новых технологий, как ASP-страницы или Internet Server API.

COMMIT. Оператор SQL, завершающий транзакцию SQL. До тех пор, пока не будет выдан оператор COMMIT, сохраняется возможность отмены транзакции (при помощи оператора ROLLBACK ).

D

DDBA. См. администратор баз данных.

DBCC.См. программа контроля непротиворечивости базы данных.

DB-LIB. аббревиатура для DB-Library (соединительного протокола SQL Server).

DBMS.аббревиатура для database management system, см. система управления базами данных, СУБД.

DDL (data definition language). См. язык определения данных.

DML. См. язык манипулирования данными.

DSS. См. система поддержки принятия решений.

DTS (Data Transformation Services). "Службы преобразования данных" – инструментальное средство SQL Server для преобразования данных между различными системами.

E

Enterprise Manager.Основное инструментальное средство (утилита) для администрирования СУРБД SQL Server.

Ethernet. Популярный сетевой аппаратный протокол.

Fiber (или fiber optics).Сетевой аппаратный протокол.

Fibre Channel. Новый протокол ввода-вывода, применяющий либо медный кабель, либо аппаратуру для волоконно-оптических соединений.

G

GROUP BY. Предложение SQL, применяемое для разделения таблиц на группы данных. Эти группы могут состоять из имен колонок или из результатов в вычисляемых колонках.

GUI. См. графический пользовательский интерфейс.

H

HBA. См. адаптер главной шины.

I

I/O.Англоязычная аббревиатура для input/output, см. ввод-вывод.

IPX/SPX (Internetwork Packet Exchange/Sequenced Packet Exchange). Сетевой протокол, применяемый в сетях Novell.

ISAPI (Internet Server API). Набор вызовов функций, разработанных для того, чтобы разработчики Интернет-приложений могли бы расширить функциональность IIS (Internet Information Server/Services).

ISQL.Приложение, поставляемое фирмой Microsoft, позволяющее осуществлять доступ к реляционной СУБД SQL Server. ISQL использует протокол DB-LIB, а OSQL использует протокол ODBC.

J

JBOD. Аббревиатура, расшифровывающаяся как "just a bunch of disks", "просто куча дисков" – конфигурация дисков без применения технологий RAID.

L

lazywriter – "отложенная запись". Поток SQL Server, отвечающий за чтение буфера журнала и записывающий ("сбрасывающий") его содержимое в журнал транзакций.

logwriter – "писатель в журнал". Процесс, берущий черновые блоки (dirty blocks) из кэша SQL Server и записывающий их на диск. У него такое название, потому что он является фоновым процессом, работающим по своему собственному расписанию и имеющим свои собственные приоритеты.

M

MSCS (Microsoft Cluster Services). Программа-вставка (add-in program) для дополнения SQL Server, благодаря которой SQL Server может работать в режиме ожидания по отношению к основному (первичному) серверу. Вторичный сервер принимает на себя обязанности основного сервера в случае его отказа.

MS DTC (Microsoft Distributed Transaction Coordinator).Компонента Microsoft SQL Server служащая для межсистемной координации транзакций (эта координация осуществляется при помощи двухэтапных фиксаций транзакций).

MTS (Microsoft Transaction Server).Средства для разработки трехзвенных распределенных приложений.

N

NWLINK. Сетевая библиотека SQL Server, поддерживающая сетевой протокол IPX/SPX фирмы Novell.

O

ODBC (Open Database Connectivity). "Открытое соединение с базами данных" – разработка фирмы Microsoft – API для соединения приложений с разнообразными реляционными базами данных.

OLAP (online analytical processing). Аналитическая обработка в реальном времени – манипулирование данными с целью их анализа. Этот термин обычно применяют, когда речь идет о рынках данных (data marts) и о складах данных (data warehouses).

OLAP Services. См. SQL Server Analysis Services.

OLTP (online transaction processing). Оперативная обработка транзакций (обработка транзакций в реальном времени) – работа с базами данных, организованная таким образом, что многочисленные пользователи могут оперативно ("в реальном времени") осуществлять доступ к разнообразным данным. Так как пользователи ожидают завершений транзакций, то время отклика является критически важной характеристикой для систем OLTP.

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

OSQL.Приложение, поставляемое фирмой Microsoft, позволяющее осуществлять доступ к реляционной базе данных SQL Server. OSQL использует протокол ODBC, а ISQL использует протокол DB-LIB.

P

Performance Monitor. "Монитор производительности" – утилита, входящая в состав операционных систем Windows NT и Microsoft Windows 2000, при помощи которой можно просматривать разнообразные показатели производительности операционной системы и SQL Server.

Pull-подписка (pull subscription). Форма репликации, при которой репликация инициируется подписчиком.

Push-подписка (push subscription). Форма репликации, при которой репликация инициируется издателем или дистрибьютором.

Q

Query Analyzer. См. SQL Query Analyzer.

Query Optimizer. См. оптимизатор запросов SQL Server.

R

RAID (redundant array of independent disks)."Массив независимых дисков с избыточностью" – массив дисковых накопителей, составляющих вместе один большой дисковый накопитель. Данные разделяются (распределяются) по всем этим физическим устройствам – дисковым накопителям. Конфигурация RAID-контроллеров возможна многими способами. Каждый из вариантов конфигураций RAID имеет свои собственные показатели отказоустойчивости и производительности.

RAID 0.Уровень RAID, обеспечивающий расслоение данных (data stripping). Это – самый недорогой и самый быстрый из уровней RAID, однако он не обеспечивает отказоустойчивости при сбоях дисков.

RAID 1. Уровень RAID, называющийся "зеркальное отражение". Том RAID 1 состоит из двух одинаковых дисковых накопителей.

RAID 5. Уровень RAID, называющийся "RAID с распределенным контролем четности". Для данной конфигурации RAID производится контроль по четности для каждого из слоев данных. Эта конфигурация RAID – недорогая и обеспечивает отказоустойчивость.

RAID 10.Уровень RAID, применяющий и зеркальное отражение, и расслоение данных. Для этой конфигурации RAID иногда применяются обозначения RAID 0+1 или RAID 1/0.

RDBMS (relational database management system). См. система управления реляционными базами данных, СУРБД.

ROLLBACK. "Откат" – оператор SQL Server, применяемый для отмен транзакции. До момента фиксации транзакции вы можете применить оператор ROLLBACK, который отменит все действия, выполненные этой транзакцией.

S

SAN (Storage Area Network). Сетевая архитектура с сервером хранения данных. Подсистема ввода-вывода, благодаря которой много компьютеров могут пользоваться общей подсистемой RAID.

SCSI (Small Computer System Interface). "Интерфейс малых компьютерных систем" – интерфейс ввода-вывода, очень широко распространенный на современных компьютерах. SCSI-диски – это дисковые накопители, для которых применяется интерфейс SCSI.

SLA (Service Level Agreement). См. соглашение об уровне обслуживания.

SMP Аббревиатура для symmetric multiprocessor system,см. симметричная многопроцессорная система.

SMS (Systems Management Server). "Сервер управления системами" – платформа для управления предприятием предлагаемая фирмой Microsoft.

SPID Аббревиатура для system process identifier, см. идентификатор системного процесса.

SQL (Structured Query Language)."Язык структурированных запросов" – общепринятый язык для работы с реляционными базами данных. Стандарты на SQL установлены и Американским Национальным Институтом Стандартов (ANSI, American National Standards Institute), и Международной организацией по стандартизации (ISO, International Organization for Standardization). Большинство из современных продуктов-СУБД поддерживают Entry Level ("начальный уровень") для SQL-92 (самый поздний стандарт SQL, опубликован в 1992 году).

SQL Profiler. "Профайлер" – утилита SQL Server, применяемая для слежения за производительностью сервера и за происходящей деятельностью. SQL Profiler очень. полезен для отслеживания событий, происходящих внутри SQL Server.

SQL Query Analyzer."Анализатор запросов" – утилита, ставшая заменой применению ISQL/W в качестве инструментального средства для эпизодических запросов SQL Server. В окне Query Analyzer вы можете набрать с клавиатуры оператор SQL и посмотреть на результаты применения этого оператора, что позволяет производить отладку. Query Analyzer также показывает план исполнения для оператора SQL, благодаря чему вы можете производить его настройку.

SQL Server.Продукт фирмы Microsoft – система управления реляционными базами данных.

SQL Server Agent."Агент SQL Server" – программа, выполняющая некоторые задачи в фоновом режиме, например, планирующая задания SQL Server или оповещающая нужных людей о проблемах с SQL Server. SQL Server Agent Scheduler (планировщик агентов SQL Server) служит для исполнения других агентов, таких как агенты репликации. SQL Server Agent имелся в SQL Server 6.5 под названием SQL Executive.

SQL Server Analysis Services. Программа-вставка (add-in program), созданная для помощи в аналитической обработке данных в реальном времени (OLAP, on-line analytical processing); вы можете пользоваться ею, чтобы осуществлять доступ к данным в ваших складах (data warehouses) и рынках данных (data marts). В SQL Server 7 это инструментальное средство имело название "OLAP Services".

T

TCP/IP (Transmission Control Protocol/Internet Protocol). Широко распространенный сетевой протокол.

token ring. Широко распространенный аппаратный сетевой протокол, разработанный фирмой IBM.

T-SQL (Transact-SQL).Процедурный язык SQL, применяемый в SQL Server. Transact-SQL является расширением языка SQL.

U

UNC (Uniform Naming Convention). См. имя UNC.

UNION. "Объединение" – оператор SQL, применяемый для объединения результатов двух или нескольких запросов. Объединенный набор результатов, содержит все строки, которые были возвращены всеми запросами из оператора UNION.

UPDATE. "Обновить" – оператор SQL, применяемый для модификации записи в базе данных.

V

VINES (VIrtual NEtworking System). Сетевой протокол Banyan.

W

WHERE. "Где", "в котором" – оператор SQL, применяемый для задания условий, которым должны удовлетворять данные, которые вы хотите извлечь.


Литература