Правильность созданных индексов в таблицах бд.  SQL-запросы. Как определить необходимые индексы (для новичков)? Индекс для целочисленных полей идентификаторов

Теоретический материал

Индексы позволяют максимально эффективно находить информацию в огромных базах данных.

SQL Server 2008 поддерживает два базовых типа индексов: кластеризованные и некластеризованные. Индексы обоих типов реализуются как сбалансированное дерево (B-дерево), в котором уровень листьев находится на нижнем уровне структуры. Разница между индексами двух типов состоит в том, что кластеризованный индекс обеспечивает физическое упорядочивание данных на диске. Кластерный индекс является разреженным – указатели в листьях B-дерева ссылаются на страницу данных.

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

Кластеризованные индексы

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

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

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

Некластеризованный индекс

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

Индекс не может охватывать не более 16 столбцов;

Максимальный размер индексного ключа – 900 байт.

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

Общий синтаксис создания реляционного индекса таков:

CREATE INDEX имя_индекса

ON <объект> (column [, … n])

[ ; ]

Составной индекс

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

Фрагментация индексов

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

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

Для управления степенью фрагментации индекса обычно используют параметр, который называется коэффициентом заполнения (fill factor). Для устранения фрагментации можно так же задействовать инструкцию ALTER INDEX. Параметр fill factor - это параметр индекса, который определяет долю свободного пространства, которое резервируется на каждой странице конечного уровня при создании или перестроении индекса. Зарезервированное пространство позволяет в дальнейшем размещать дополнительные значения, снижая таким образом число разбиений страниц Коэффициент заполнения измеряется в целых процентах, например значение 75 означает, что каждая создаваемая страница конечного уровня должно содержать 25% свободного пространства для размещения будущих значений .

Дефрагментация индексов

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

ALTER INDEX { index_name | ALL }

ON

[ WITH ( [ ,...n ]) ]

| [ PARTITION =partition_number

[ WITH (

[ PARTITION =partition_number ]

[ WITH (LOB_COMPACTION = { ON | OFF }) ]

| SET ( [ ,...n ])

При дефрагментации индексов можно выбрать параметры REBUILD или REORGANIZE.

Первый параметр перестраивает все уровни индекса и заполняет страницы в соответствии с параметром fill factor. При перестроении кластеризованного индекса перестраивается только он, однако если задать параметр ALL, будет перестроен как кластеризованный, так и все некластеризованные индексы таблицы. Перестроение индекса обновляет всю структуру сбалансированного дерева, поэтому, если не задан параметр ONLINE, таблица блокируется до завершения перестроения . Например, для того, чтобы перестроить индекс IX_BillID, таблицы BillItem, необходимо выполнить следующий запрос:

ALTER INDEX IX_BillID

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

ALTER INDEX IX_BillID

Работа с индексами в MS SQL Server Management Studio

Для того что бы посмотреть какие индексы созданы нужно, открыть вкладку Index таблицы Bill на панели Object Explorer. Полный путь до вкладки: Databases ® EducationDatabase ® Tables ® [имя таблицы] ® Indexes показан на рисунке 1.1. Согласно рисунку для данной таблицы создан один кластеризованный индекс PK_Bill.

Проверьте наличие кластеризованных индексов во всех таблицах базы данных самостоятельно.

Рисунок 1.1 – Object Explorer, раскрытая вкладка Indexes

Создадим дополнительный индекс по полю внешнего ключа BillID таблицы BillItem. Создать индекс можно двумя способами:

Выполнение запроса CREATE INDEX. Создадим запрос в новой вкладке, нажав кнопку New Query стандартной панели инструментов. Панель инструментов показана на рисунке 1.2.

Рисунок 1.2 – Панель инструментов

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

С помощью графического интерфейса Microsoft SQL Server Management Studio. В контекстном меню, вкладки Indexes выбираем пункт New Index, как показано на рисунке 1.4.

Рисунок 1.4 – Контекстное меню вкладки Indexes

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

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

1. Проверьте наличие индексов по ключевым полям таблицы. При необходимости создайте кластеризованные индексы. Для создания нового индекса воспользуйтесь командой CREATE INDEX, или в среде Microsoft SQL Management Studio в разделе Tables/имя_таблицы/Indexes используйте команду New Index…

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

3. Создайте некластеризованные индексы по информационным полям: Name и Date во всех таблицах базы данных. Объясните, для чего нужны такие индексы?

4. Для кластерного индекса и индекса по полю Date таблицы записей в чеке получите сведения о расширенных свойствах индексов. Объяснить значение информации, представленной в разделе «Fragmentation» на странице «Properties». Объясните, как вычислена глубина дерева индекса, число листьев, коэффициент фрагментации.

5. Перестройте кластеризованный индекс таблицы BillItem, используя команду ALTER INDEX или с помощью команды Rebuild в контекстном меню индекса.

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

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

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

Индекс помогает ускорить для запросов и предложения , но это замедляет ввод данных, с заявлениями UPDATE и INSERT . Индексы могут быть созданы или удалены без влияния на данные.

Создание индекса предполагает заявление CREATE INDEX , которое позволяет назвать индекс, чтобы указать таблицу и какой столбец или столбцы индексировать и указать, является ли индекс в порядке возрастания или убывания.

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

Команда CREATE INDEX

Основной синтаксис CREATE INDEX выглядит следующим образом:

CREATE INDEX index_name ON table_name;

Одноколоночные индексы

Индекс для одного столбца создается на основе только одного столбца таблицы. Базовый синтаксис выглядит следующим образом.

CREATE INDEX index_name ON table_name (column_name);

Уникальные индексы

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

CREATE UNIQUE INDEX index_name on table_name (column_name);

Составные индексы

Составной индекс является индексом для двух или более столбцов таблицы. Его основной синтаксис выглядит следующим образом.

CREATE INDEX index_name on table_name (column1, column2);

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

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

Неявные индексы

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

Команда DROP INDEX

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

Базовый синтаксис выглядит следующим образом:

DROP INDEX index_name;

Вы можете посмотреть пример ограничения INDEX , чтобы увидеть некоторые реальные примеры по индексам.

Когда следует избегать индексов?

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

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

  • Индексы не должны использоваться на небольших таблицах.
  • Таблицы, которые имеют частые большие операции обновления или вставки.
  • Индексы не должны использоваться на колонках, содержащих большое количество нулевых значений.
  • Столбцы, которыми часто манипулируют не должны быть проиндексированы.
  • 4. Обслуживание баз данных
  • Файлы операционной системы, используемые sql Server 2000:
  • Структура базы данных
  • 5. УстановкаMicrosoftSqlServer2000
  • Ограничения инсталляции sql-сервера
  • ТемаIii. Работа с базой данных создание и использова­ние индексов и ключей
  • 1. Базы данных и их свойства
  • Описание ролей, используемых для доступа к базе данных и серверу баз данных
  • Дополнительные опции настройки базы данных
  • Настройка параметров доступа к базе данных
  • 2. Таблицы базы данных.
  • 3. Типы данных, используемые в sql-сервере
  • Текстовые типы данных
  • Типы данных даты и времени
  • Типы данных для хранения больших объемов инфор­мации
  • Типы данных специального назначения:
  • 4. Основные операции с базами данных
  • 5. Восстановление бд (администрированиеSqlServer2000)
  • 6. Создание и использование индексов и ключей в сис­теме sql Server.
  • 7. Использование ограничений
  • 8. Использование диаграмм для разработки структуры базы данных
  • 9. Создание представлений (видов)
  • ТемаIv. Правила и создание значения
  • 1. Инструменты контроля целостности данных
  • 2. Создание правил и стандартных значений
  • ТемаV. Триггеры в системеSql–сервер
  • 1. Понятие триггера. Типы триггеров
  • 2. Создание триггеров
  • 3. Использование триггеров. Виды триггеров
  • ТемаVi. Оптимизация запросов и основы sql
  • 1. Оптимизация запросов
  • 2. Основные операторы sql в sql Server 2000
  • 3. Объединение таблиц в операторе select
  • From titles
  • 4. Использование директив group by иHaving
  • 5. Оператор insert
  • 6. ОператорUpdate
  • 7. ОператорDelete
  • 8. ОператорCreatetable
  • ТемаVii. Создание и работа с представлениями
  • 1. Основные сведения о представлениях
  • 2. Создание представлений. Отображение представле­ний
  • 3. Редактирование представлений. Отображение зави­симостей представлений. Создание представлений и пред­ставлений
  • 4. Переименование столбцов представлений. Переиме­нование представлений. Удаление представлений
  • 5. Изменение данных посредством представлений. Об­новление данных с помощьюSqlServerEnterpriseManager
  • ТемаViii. Создание и использование курсоров
  • 1. Понятие курсора
  • 2. Выборка данных из курсора
  • 3. Операторы и глобальные переменные для работы с курсорами
  • 4. Примеры использования курсоров
  • ТемаIx. Использование хранимых процедур
  • 1. Достоинства и недостатки хранимых процедур
  • 2.Создание хранимой процедуры
  • 3. Операторы языка управления программой. Опера­тор declare
  • 4. Операторы goto, begin…end и if…else
  • 5. Операторы waitfor, return, while, break и continue
  • 6. Операторы print и raiserror
  • 7. Использование параметров в хранимых процедурах
  • 8. Глобальные переменные. Отладка хранимых процедур
  • Тема X. Транзакции и блокировки
  • 1. Определение транзакции. Ограничения для транзакций. Уровни изоляции транзакций
  • 2. Базовая информация о блокировках. Типы блокировок
  • 3. Создание транзакций и работа с ними. Точки сохранения
  • 4.Отображение информации о блокировках. Явное задание блокировки
  • Описание параметров для явного задания блокировок
  • ТемаXi. Система безопасностиSqlServer2000
  • 1. Типы безопасности. Создание и управление бюджетами пользователей
  • Стандартные роли сервера
  • Стандартные роли базы данных
  • 2. Добавление новых пользователей. Удаление идентификаторов и пользователей
  • 3. Создание ролей. Удаление ролей
  • 4. Права доступа. Управление правами доступа
  • ТемаXii. Использование распределенных объектов управления.
  • 1.Sql-dmo. Назначение, возможности
  • 2. Экспорт данных с помощью команды вср
  • 3. Использование объектовSql-dmOв хранимых процедурах
  • ТемаXiii. Основные сведения о хранилищах данных
  • 1. Хранилища данных. Системы поддержки принятия решений (dss). Интерактивная аналитическая обработка (olap)
  • Сравнение субд и хранилища данных
  • 2. Компоненты хранилища данных. Хранилища дан­ных и магазины данных
  • 3. Преобразование данных. Метаданные
  • 4. Разработка плана хранилища данных
  • Microsoft Repository
  • ТемаXiv. Использование служб преобразования данных
  • 1. Службы преобразования данных (dts).DtSи хра­нилища данных
  • 2. СредствоDtsDataPump
  • 3. МастераDts
  • 4. ИспользованиеDtsDesigner
  • Тема XV. Службы olap Microsoft sql Server
  • 1.OlaPи многомерные данные
  • 2. Хранение данных в бдolap
  • 3. Оптимизация базы данныхOlap
  • 4. Доступ к многомерным данным
  • 6. Создание и использование индексов и ключей в сис­теме sql Server.

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

    В SQL Server данные и индексы таблиц хранятся в виде страниц следующего формата:

    В SQL Server дисковая память для таблиц и индексов раз­деляется блоками по 8 страниц, которые называются экстен­тами . После заполнения одного экстента объекту выделяется следующий (еще 8 страниц).

    Для представления индексов в SQL Server используется схема двоичного дерева:

    Уровень 1

    Уровень 0

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

    Кластерный индекс – это двоичное дерево, в котором на нулевом уровне (уровне листов) содержатся страницы актуаль­ных данных таблицы и физически информация хранится в логи­ческом порядке данного индекса. Создание кластерного индекса требует наличия в БД свободного дискового пространства  в 1,2 раза большего, чем существующий объем данных таблицы. Для каждой таблицы может существовать только один кластерный индекс.

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

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

    Для одной таблицы может быть создано до 249 некла­стерных индексов. Строка индекса не может иметь длину больше 900 Байт и не должна включать более 16 столбцов значений.

    Для любой таблицы достаточно иметь один кластерный и 2 - 6 некластерных индексов (за исключением создания хранилищ данных).

    Индексы не могут быть созданы для столбцов со следую­щими типами данных: BIT, TEXT, IMAGE. Индексы не могут создаваться для видов.

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

    Создать индекс с помощью SQL-команды CREATE IN­DEX;

    Воспользоваться возможностями утилиты SQL Server Enterprise Manager.

    Рассмотрим второй способ создания индексов. Haчальным этапом создания индекса является выбор необходи­мой базы данных и таблицы, для которой он будет определяться.

    Выполнение команды. Все задачи/ Manage Indexes меню Действие отобразит на экране диалоговое окно управления ин­дексами базы данных. Следует обратить внимание на выпадаю­щие списки данного диалогового окна Database и Table , которые позволяют перемещаться между базами данных и их таблицами. При том в списке Existing indexes отображаются имеющиеся ин­дексы для выбранных таблиц баз данных.

    В нижней части данного диалогового окна расположены управляющие кнопки, выполняющие следующие действия:

    New - создание нового индекса для выбранной таблицы БД;

    Edit - редактирование параметров существующего ин­декса;

    Delete - удаление предварительно выбранного индекса;

    Close - закрытие диалогового окна;

    Help - получение справочной информации по данному во­просу.

    Для создания нового индекса следует воспользо­ваться кнопкой New данного диалогового окна. Это действие приведет к открытию другого диалогового окна Create New In ­ dex , с помощью которого и устанавливаются параметры индекса. В поле Index name данного диалогового окна необходимо ввести имя создаваемого индекса, после чего определить пере­чень полей участвующих в индексе. Для до­бавления определенного поля в индекс следует установить фла­жок слева от его имени. Здесь также можно просмотреть сле­дующую информацию о поле: Column - имя поля, Data type - тип данных, Length - размер, Nullable - возможность использования Null-значений, Precision - точность и Scale - порядок вводимых значений. Можно менять порядок расположения полей в представленном списке.

    Группа опций Index options позволяет настроить дополни­тельные параметры создаваемого индекса:

    Unique values – при необходимости ввода в определён­ное поле только уникальных значений, следует установить дан­ную опцию. Это позволит осуществлять автоматическую про­верку уникальности при каждом добавлении новой записи. Если будет предпринята попытка ввода уже имеющегося значения в записи данного поля, будет выдано сообщение об ошибке. При этом следует обратить внимание на запрет присут­ствия NULL-значений в этом поле. При использовании NULL-значений и установке данной опции могут возникнуть ошибки. Поэтому рекомендуется установить обязательный ввод значений в поле, для которого планируется создание уникального индекса;

    Clustered index - в системе SQL-сервер имеется возмож­ность физического индексирования данных. Другими словами, использование индексов приводит к созданию отдельной струк­туры, которая связывается с физическим расположением данных в таблице. Использование этой опции позволяет произвести так называемое кластерное индексирование, в результате чего будут отсортированы данные в самой таблице согласно порядку этого индекса, и вся добавляемая информация будет приводить к изме­нению физического порядка данных. При этом нужно учитывать, что в таблице может быть определён только один кластерный ин­декс;

    Ignore duplicate values - выбор данной опции приводит к игнорированию ввода повторяющихся значений в проиндексиро­ванных полях;

    Do not recompute statistics - установка этой опции опре­деляет функцию автоматического обновления стати­стики для таблицы;

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

    Fill factor - данная возможность используется крайне редко. С помощью этой опции осуществляется настройка разбие­ния индекса на страницы. Если планируется частое изменение, удаление и добавление информации в таблице базы данных, то коэффициент FILLFACTOR следует установить как можно меньше, например, 20. Установка коэффициенту значения 100 рекомендуется при использовании больших таблиц, обращение к которым обычно происходит только для чтения;

    Pad index - опция определяет заполнение внутреннего пространства индекса и используется совместно с опцией Fill fac ­ tor ;

    Drop existing - при использовании кластерного индекса, выбор данной опции определяет его повторное создание, что по­зволяет предотвратить нежелательное обновление кластерных индексов.

    Использование кнопки Edit SQL данного диалогового окна предоставляет пользователю сгенерированную SQL-ко­манду, с помощью которой и будут выполняться произве­денные настройки. В окне имеются управляющие кнопки Parse и Execute , с помощью которых можно проанализи­ровать корректность установленных настроек (Parse), а также произвести запуск полученной SQL-команды (Execute).

    Впоследствии созданные индексы могут использо­ваться в SQL-операторах SELECT следующим образом:

    SELECT ...

    FROM <имя таблицы> (INDEX = <имя_индекса>)

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

    Рассмотрим основные различия между индексами и ключами:

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

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

    Рассмотрим процесс создания первичных ключей с помо­щью утилиты SQL Server Enterprise Manager. Первым этапом решения данной задачи будет выбор таблицы в списке объ­ектов базы данных. Выполнение команды Design Table меню Действие приведет к загрузке дизайнера таблиц, в окне которого следует выбрать необходимые поля, убрать флажок из колонки Allow Nulls для этих полей. Ус­тановка первичного ключа осуществляется с использованием кнопки Set primary key .

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

    Для создания индекса используется команда Transact-SQL.

    CREATE INDEX, общий синтаксис которой следующий:

    CREATE INDEX <имя индекса> ON <имя таблицы>(имя столбца[, имя столбца]…)

    [,] FILLFACTOR=x][[,]

    IGNORE_DUP_KEY][[,] DROP_EXISTING}[[,]

    STATISTICS_NORECOMPUTE]]

    Рассмотрим параметры этой команды:

    PAD_INDEX - это размер пространства, оставляемого от­крытым на каждой внутренней странице. По умолчанию число элементов на внутренней странице ≥2. Этот параметр использу­ется совместно с FILLFACTOR и использует процентное значе­ние этого параметра.

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

    DROP_EXISTING - при использовании этого параметра существующий кластерный индекс удаляется и создаётся заново, существующие некластерные индексы перестраиваются только после создания нового кластерного индекса

    STATISTICS_NORECOMPUTE - блокирует автоматиче­ское обновление статистических сведений по индексам.

    Рассмотрим другие операции над индексами.

    1) Просмотр индексов:

    а) в окне SQL Server Enterprise Manager выбрать БД (пикто­грамма в папке Databases );

    б) перейти во вкладку Table and indexes – здесь отобра­жаются имена всех таблиц и имена связанных с ними индексов для выбранной БД.

    2) Переименование, удаление индексов.

    Для удаления индекса используется команда Transact-SQL:

    DROP INDEX [владелец.] <имя_ таблицы>. <имя_индекса> [,[владелец.] <имя_таблицы>, <имя_индекса>]

    Переименование индекса осуществляется командой:

    sp _ rename <имя_объекта>, <новое имя> [,COLUMN | INDEX ]

    Можно также использовать окно SQL Server Enterprise Manager: открыть таблицу в дизайнере, из контекстного меню для таблицы выбрать Properties , в диалоговом окне Table Properties выбрать вкладку Indexes / Key - здесь можно переименовать ин­декс и создать новый индекс.

    Стратегия использования индексов:

    1) Следует индексировать:

      столбцы, используемые для объединения таблиц;

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

      столбцы, используемые в директивах ORD ER BY и

    GROUP BY ;

      столбцы, используемые для суммирования и подведения итогов.

    2) Не следует индексировать:

      таблицы с небольшим количеством строк;

      столбцы, имеющие широкий диапазон значений;

      столбцы, значения в которых очень длинные (>25 байт);

      столбцы, не используемые при построении запросов.

    3) Целесообразно использовать кластерные индексы для столбцов:

      если столбцы используются во многих запросах;

      если столбцы используются в ORDER BY или

      если столбцы используются для объединения таб­лиц.

    Использование функции автоматического выбора типа ин­декса:

      открыть Query Analyzer;

      в списке DB выбрать имя БД;

      ввести текст SQL-команды;

      Выбрать команду Query/Perform Index Analysis .

    SQL Server проанализирует запрос для определения, можно ли создать индекс, который будет способствовать ускоре­нию выполнения запроса. Если индекс удается обнаружить, то будет выведено окноQuery Analyzer . Для создания предлагае­мого индекса, щёлкнуть кнопку Accept .

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

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

    2) Создание индексов
    CREATE INDEX
    ON ()

    3) Изменение и удаление индексов
    Для управления активностью индекса используется оператор:
    ALTER INDEX
    Для удаления индекса используется оператор:
    DROP INDEX

    a) Правила выбора таблиц
    1. Целесообразно индексировать таблицы, в которых выбирается не более 5% строк.
    2. Следует индексировать таблицы, не имеющие дублей в разделе WHERE оператора SELECT.
    3. Нецелесообразно индексировать часто обновляемые таблицы.
    4. Нецелесообразно индексировать таблицы, занимающие не более 2-х страниц (для Oracle это менее 300 строк), поскольку её полный просмотр не дольше.

    b) Правила выбора столбцов
    1. Первичные и внешние ключи – часто используются для объединения таблиц, выборки данных и поиска. Это всегда уникальные индексы с максимальной полезностью
    2. При использовании опций ссылочной целостности всегда нужен индекс на FK.
    3. Столбцы, по которым часто производится сортировка и/или группирование данных.
    4. Столбцы, по которым часто производится поиск в разделе WHERE оператора SELECT.
    5. Не следует создавать индексов для длинных описательных столбцов.

    c) Принципы создания составных индексов
    1. Составные индексы хороши, если столбцы по отдельности имеют мало уникальных значений, а составной индекс обеспечивает большую уникальность.
    2. Если все значения, выбираемые оператором SELECT, принадлежат составному индексу, то значения выбираются из индекса.
    3. Следует создавать составной индекс, если в разделе WHERE используется два или более значений объединенных оператором AND.

    d) Не рекомендуется создавать
    Не рекомендуется создавать индексы по столбцам, включая составные, которые:
    1. Редко используются для поиска, объединения и сортировки результатов запросов.
    2. Содержат часто меняющиеся значения, что требует частого обновления индекса замедляющего производительность БД.
    3. Содержат небольшое количество уникальных значений (менее 10% м/ж) или преобладающее число строк с одним-двумя значениями (город проживания поставщика Москва).
    4. К ним в разделе WHERE применяют функции или выражение, и индекс не работает.

    e) Следует не забывать
    Следует стремиться к уменьшению количества индексов, поскольку при большом их числе снижается скорость обновления данных. Так MS SQL Server рекомендует создавать не более 16 индексов на таблицу.
    Как правило, индексы создаются для запросов и поддержки ссылочной целостности.
    Если индекс не используется для запросов, то его следует удалять, а ссылочную целостность обеспечивать с использованием триггеров.

    6. Индексы и оптимизация производительности

    Индексы в базах данных: назначение, влияние на производительность, принципы создания индексов

    6.1 Для чего нужны индексы

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

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

    Некоторые общие принципы, связанные с созданием индексов:

    · индексы необходимо создавать для столбцов, которые используются в джойнах, по которым часто производится поиск и операции сортировки. При этом необходимо учесть, что индексы всегда автоматически создаются для столбцов, на которые накладывается ограничение primary key. Чаще всего они создаются и для столбцов с foreign key (в Access - автоматически);

    · индекс обязательно в автоматическом режиме создается для столбцов, на которые наложено ограничение уникальности;

    · лучше всего индексы создавать для тех полей, в которых - минимальное число повторяющихся значений и данные распределены равномерно. В Oracle есть специальные битовые индексы для столбцов с большим количеством повторяющихся значений, в SQL Server и Access такой разновидности индексов не предусмотрено;

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

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

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