Использование представлений
При работе с таблицами иногда бывает необходимо скрыть от пользователей один или более столбцов с конфиденциальными данными. Например, таблица может содержать данные о фамилии, имени и отчестве служащего, дату его рождения, семейное положение, пол, национальность и размер оклада. Необходимо разрешить всем пользователям просматривать всю информацию о сотрудниках, кроме размера оклада.
Для решения задачи необходимо использовать какие-то дополнительные механизмы. В качестве такого механизма можно выбрать представления.
Представления(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, но и в пакетах независимых разработчиков.