<<На Главную         <В  Советы по MS SQL Server

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

 

 

Прежде чем переходить к чисто прикладному вопросу - Как создать индексы в MS SQL Server Express Edition, логично   дать для начала кое-какие элементарные сведения.

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

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

Приведём ещё несколько примеров информационных систем, в которых индексировать таблицы по уникальному ключу следует как отче наш. Предположим, вы создаёте базу данных клиентов и сделанных ими заказов. В такой системе у вас будут две основные 'оперативные' таблицы - таблица Клиенты и таблица Заказы. При занесении нового клиента в базу, ваша система должна автоматически присваивать ему уникальный ID. Как правило, все современные СУБД имеют тип поля автоинкремент, созданного как раз для автоматической генерации уникального идентификатора записи. Так вот, для данного случая не подлежит сомнению тот факт, что необходимо индексировать таблицу Клиенты по полю ID. Или другой случай. Вы создаете информационную систему для страховки автомобилей - объектов страхового случая. Вполне естественной в такой базе данных будет  присутствие оперативной таблицы застрахованных автомобилей. И в этом случае при занесении нового автомобиля, система должна присваивать ему уникальный ID и выстраивать для него соотв. индекс.

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

В общем, я думаю, что логику вы уловили ...

 

 

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

 

Наша учебная таблица Zakazy имеет сл. структуру:

  1. ZakazID - уникальный идентификатор (код) заказа

  2. Number - обозначение заказа

  3. Data- дата заказа

  4. CustomerID - код заказчика, оформившего заказ

  5. Summa - цена вопроса :-) - сумма заказа

В соответствии с изложенной выше теорией, первичным ключом таблицы Zakazy имеет смысл сделать поле ZakazID . Для этого в SQL Server Management Studio становимся на нужную таблицу и по правой кнопке выбираем в контекстном меню Создать столбец:

 

 

Попадаем в настройки структуры таблицы. Становимся на  поле ZakazIDправая кнопка мыши и выбираем Задать первичный ключ:

 

После такой манипуляции структура таблицы примет сл. вид - обратите внимание на значок ключа в ZakazyID:

 

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

 

Select * From Zakazy Where CustomerID=?

 

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

 

 

... и попадаем в форму создания индекса:

 

 

На форме выше кликаем по кнопке Добавить и в сл. форме выбираем  поле (столбец) таблицы для индексации - CustomerID для нашего случая:

 

Создать индекс MS SQL Server

 

В форме задания опций индекса выбираем тип индекса (некластеризованный) и задаём имя индекса:

 

 

Жмём на форме выше OK, на ветке Индексы в контекстном меню Обновить и видим наш вновь созданный индекс CustID:

 

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

Simashkov.2013

24.01.2013 г.

Назад