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

 

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

Для решения задачи необходимо использовать какие-то дополнительные механизмы. В качестве такого механизма можно выбрать пред­ставления.

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

При создании запроса указывается запрос select, который будет формировать содержимое представления. В этом запросе могут применяться все разделы ко­манды Select. Другими словами, пользователь может выполнять объединение (join) и слия­ние (union) данных, различные выражения, группировку, агрегирование и логи­ческие условия.

Создание представлений в SQL Server 2000 можно выполнить различными ме­тодами: с помощью Enterprise Manager; с помощью мастера Create View Wizard; средствами Transact-SQL.

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

Однако оба названных метода, в конце концов, обращаются к средствам Transact-SQL, с помощью которых собственно и выполняется создание пред­ставления. Ничто не мешает пользователям применять для создания представ­лений непосредственно команды Transact-SQL, не прибегая к помощи графиче­ского интерфейса.

При работе с Enterprise Manager список представлений, имеющихся в базе данных, находится в папке Views. Как видно из рисунка 18, для каждого представления указывается его имя (столбец Name), владелец (столбец Owner), тип (type) системный или пользовательский и дата создания (Create Date).

 

Для создания нового представления достаточно выбрать в контекстном меню папки Views команду New View или нажать на кнопку New на панели инструментов.

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

 

Индексы

 

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

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

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

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

Одним из наиболее эффективных методов поиска, реализованных и в SQL Server 2000, является метод “деления пополам”, работающий с упорядоченным представлением данных, т.е. с индексами. При поиске конкретного значения в отсортированном по возрастанию наборе в простейшем случае берется значение из середины упорядоченной последовательности и сравнивается с искомым. Если искомое значение больше, то все значения левее выбранного отбрасываются. Тем самым промежуток поиска уменьшается вдвое. Искомое значение сравнивается со значением, расположенным в центре правой области данных. Если значения опять не совпали, то интервал снова уменьшается вдвое и про­цесс продолжается. Когда значения, наконец, совпадут, поиск прекращается. Этот метод позволяет очень быстро находить требуемые значения.

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

 

Статистика

 

Статистика представляет собой данные о распределении в таблице, упорядоченные с помощью индекса данных. Информация об индексах хранится в системной таблице sysindexes, имеющейся в каждой базе данных. Каждый индекс представлен отдельной строкой. Информация о статистике индекса хранится в столбце statblob, имеющем тип данных image, максимальный размер которого равен 2 Гбайт.

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

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

 

ПРОГРАММИРОВАНИЕ

 

Transact-SQL

 

Целью любой системы управления базами данных является предоставление пользователю простых и эффективных механизмов манипулирования данными. Для этого можно использовать различные методы управления данными, одним из которых является язык структурированных запросов (SQL, Structured Query Language).

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

В 1992 г. Американским национальным институтом стандартизации (ANSI, American National Standard Institute) был разработан стандарт на язык SQL, на­званный ANSI SQL-92. Этот стандарт не только определяет основные правила использования команд, идентификаторов, переменных и других элементов, но и регламенти­рует работу самой системы управления базами данных. В частности, в стандарте ANSI SQL-92 были рассмотрены механизмы работы транзакций и блокировок.

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

Корпорация “Microsoft”, как и многие другие производители, разработала свою версию языка SQL, назвав его Transact-SQL. Именно этот язык используется в SQL Server 2000 для доступа к данным. Он удовлетворяет требованиям ANSI SQL-92, но предлагает пользователю еще и ряд дополнительных возмож­ностей, позволяющих более гибко и эффективно работать с данными. Язык Transact-SQL активно используется не только в программных продуктах корпо­рации Microsoft, но и в пакетах независимых разработчиков.