Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие_Чигарина_бд_2014.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.25 Mб
Скачать

7.3 Индексы баз данных

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

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

Рекомендуется помнить:

  • выбор индекса определяется соображениями быстродействия, а не первичным ключом или другими обстоятельствами;

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

  • с ростом количества индексов (больше 5) затраты становятся чрезмерными;

  • в системах OLTP с оперативной обработкой транзакций создается минимальное количество индексов, что позволяет ускорить выполнение команд UPDATE, INSERT, DELETE.

Команды ведения данных при работе с таблицами соответствуют стандарту языка SQL.

7.4 Программирование на Transact sql. Комментарии. Переменные. Команды управления

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

Обозначение однострочного комментария: -- Однострочный комментарий

Обозначение многострочного комментария:

/* Многострочные

** комментарии*/

Переменные могут быть двух типов – локальные (начинаются с символа @) и глобальные (начинаются с двух символов @@). Локальные переменные существуют в пределах сеанса, глобальные переменные используются для получения информации о сервере в целом (иногда называют функциями). Локальные переменные объявляются командой DECLARE и значения задаются командами SELECT и SET. Например:

DECLARE @R DATETIME, @C INT

SELECT @C=1

SET @R =getdate()

SELECT @C, @R

Обычно рекомендуется для присваивания переменных использовать команду SET , а не SELECT, так как первая работает быстрее. В одной команде SELECT можно присваивать значения нескольким переменным. Команда PRINT передает сообщение длиной 1024 байта обработчику сообщений клиента.

Команды условного выполнения:

IF <логическое выражение>

{ <команда> |< блок команд>}

ELSE

{ <команда> | <блок команд>}

Например, использования команды условного выполнения выглядит так:

IF (SELECT AVG(price) from titles WHERE type = “business”) >$19.6

PRINT ” Сообщение 1”

ELSE

PRINT “ Сообщение 2”

Блок команд – множество команд в операторных скобках BEGIN .. END

Цикл WHILE:

WHILE <логическое условие>

[ <команда> |< блок команд>]

[BREAK]

[CONTINUE]

END

Например, использование цикла с предусловием:

WHILE (SELECT AVG(price) FROM titles) < $25

BEGIN

UPDATE titles SET price =price*1.05

IF (SELECT COUNT(*) FROM titles WHERE price < $15) <10)

CONTINUE

ELSE

IF (SELECT MAX(price) FROM titles) >$50

BREAK

END

Команда WAITFOR переводит запрос в состояние ожидания в течение некоторого интервала или до наступления заданного времени ( и потому называется обработчиком события).

WAITFOR {DELAY “время” | TIME “время”}

Параметр DELAY заставляет пакет или процесс сделать паузу заданной длины (максимум – 24 часа). Параметр TIME останавливает процесс до наступления заданного времени. Время задается в формате hh: mi: ss. Например: WAITFOR TIME “ 22:00:00”