Индексы – одно из самых мощных средств, доступных разработчику базы данных. Индекс – это вспомогательная структура, позволяющая вам повышать производительность запросов за счет снижения количества операций ввода-вывода, необходимых для поиска запрошенных данных; т.е. индекс позволяет системе Microsoft SQL Server 2000 находить данные, используя меньшее число операций ввода-вывода, чем при поиске данных путем доступа только к таблице базы данных. Если для поиска строки данных вы используете индекс таблицы базы данных, SQL Server может быстро определить, где хранятся эти данные и сразу считать эти данные. Таким образом, индексы таблиц базы данных во многом похожи на индексы (алфавитные указатели) в книгах: в обоих случаях обеспечивается быстрый доступ к большим объемам информации.
В этой лекции вы узнаете об основах индексирования, включая
Как уже говорилось, индекс – это вспомогательная структура данных, используемая системой SQL Server для доступа к данным. В зависимости от типа индекса он хранится вместе с данными или отдельно от данных. Независимо от типа все индексы действуют одинаковым в своей основе способом, о котором вы узнаете в этом разделе.
В системах без индексов весь поиск данных должен выполняться путем сканирования таблиц. При сканировании таблиц приходится читать все данные и сравнивать их с запрашиваемыми данными. Обычно стараются обойтись без сканирования таблиц – из-за количества операций ввода-вывода, которое для этого требуется: сканирование больших таблиц может занимать длительный период времени и требовать использования большого количества системных ресурсов. Используя индекс, вы можете кардинально снизить количество операций ввода-вывода, ускорив доступ к данным и освободив системные ресурсы для других операций.
Индекс базы данных организован в виде структуры B-дерева. Каждая страница индекса называется индексной страницей, или узлом индекса. Структура индекса начинается на верхнем уровне с корневого узла. Корневой узел соответствует началу индекса: это первые данные, к которым осуществляется доступ при поиске данных. Корневой узел содержит ряд строк индекса. Эти строки содержат значение ключа и указатель на определенную индексную страницу (которая называется узлом-ветвью) (рис. 17.1). Эта конфигурация необходима, поскольку в случае таблицы данных среднего масштаба индекс состоит из тысяч или миллионов индексных страниц. Начав поиск с корневого узла и перемещаясь по узлам индекса, SQL Server может постепенно "приближаться" к нужным вам данным.
Если использовать в качестве аналога книгу, то индекс действует следующим образом: предположим, что началом индекса (алфавитного указателя) является страница, где указаны номера страниц для статей индекса на букву "a", "b", "c" и т.д. Затем предположим, что эти страницы содержат номера страниц для статей в диапазонах aa-ab, Ас-ad, ae-af и т.д., а соответствующие страницы – номера страниц для записей в диапазонах aaa-aab, aАс-aad, aae-aaf и т.д. При подобной организации вы можете быстро найти то, что вам нужно, с использованием относительно небольшого количества операций поиска. Такая структура аналогична индексу таблицы базы данных, когда первой страницей является корневой узел.
(рис 17.1) Корневой узел и узлы-ветвиКак и корневой узел, каждый узел-ветвь содержит ряд индексных строк в структуре индексной страницы. Каждая индексная строка указывает на другой узел-ветвь или на узел-лист (конечный узел) (рис. 17.2). Узел-лист является последним уровнем индекса. В отличие от корневого узла каждый узел-ветвь содержит также
(рис 17.2) Дерево поиска с узлами-ветвями и узлами-листьямиКак следует из названия "B-дерево", узлы-ветви разветвляются от корневого узла в древовидной форме. Каждая группа узлов-ветвей одного уровня в древовидной структуре называется уровнем индекса (рис. 17.3). Количество операций ввода-вывода, которое требуется для достижения узлов-листьев (узлов самого нижнего уровня дерева), зависит от количества уровней индекса. Если таблица базы данных содержит лишь небольшое количество данных, то корневой узел может указывать непосредственно узлы-листья, и тогда для индекса вообще не требуется никаких узлов-ветвей (маловероятная ситуация).
(рис 17.3) Уровни индексаВ некластеризованном индексе узел-лист содержит значение ключа, а также идентификатор строки (Row ID), указывающий нужную строку в таблице, или ключ
Имейте в виду, что, поскольку индекс создается в отсортированном порядке, любые изменения в данных могут приводить к дополнительной нагрузке на систему. Например, если вставка приводит к созданию новой строки индекса, которую нужно поместить в узел-лист, который уже заполнен до конца, то SQL Server должен создать место для новой строки индекса. Он выполняет эту задачу, перемещая приблизительно половину строк узла-листа на другую страницу. Это перемещение данных называется расщеплением страницы. Расщепление страницы на одном уровне дерева может приводить к каскадным расщеплениям на более высоких уровнях. Расщепления страниц можно избежать путем соответствующей настройки коэффициента заполнения. (См. раздел "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)
Теперь, когда вы получили представление о структуре индексов, рассмотрим некоторые из наиболее общих понятий индексирования. В этом разделе вы узнаете об индексных ключах, уникальности индексов и типах индексов.
Индексным ключом называется колонка или колонки, которые используются для формирования индекса. Индексный ключ – это значение, позволяющее быстро находить строку, содержащую нужные вам данные (подобно статье индекса [алфавитного указателя] в книге, указывающей определенную тему в тексте). Для доступа к данным строки через индекс вы должны включить значение или значения индексного ключа в предложение WHERE нужного оператора SQL. Способ выполнения этого процесса зависит от того, какой это индекс – простой или составной.
Простой индекс определяется только по одной колонке таблицы (рис. 17.4). Чтобы индекс использовался оператором SQL, ссылка на эту колонку должна быть включена в предложение WHERE данного оператора.
(рис 17.4) Простой индексВ зависимости от типа сохраняемых данных, количества уникальных элементов в колонке и типа используемых операторов SQL простой индекс может оказаться весьма эффективен. В других случаях необходим составной индекс. Например, если вы строите индекс для адресной книги с тысячами имен и адресов, то колонка state (штат) не слишком подходит для простого индекса, поскольку для каждого штата будет много записей. Однако, добавив к индексу колонки street (улица) и city (город), вы делаете его составным индексом, после чего почти каждая запись становится уникальной. Это может оказаться полезным, если у вас используются запросы поиска строк в соответствии с адресом.
Составной индекс – это индекс, определенный более чем по одной колонке (рис. 17.5). Доступ к составному индексу может осуществляться с помощью одного или нескольких индексных ключей. В рамках SQL Server 2000 индекс может содержать до 16 колонок, и колонки ключей могут иметь длину до 900 байтов.
(рис 17.5) Составной индексДля запросов, включающих составной индекс, вам не требуется помещать все индексные ключи в предложение WHERE оператора SQL, но имеет смысл использовать более одного ключа. Например, если индекс создается по колонкам a, b и c какой-либо таблицы, то доступ к этому индексу можно осуществлять с помощью оператора SELECT, содержащего выражение ( a АND b АND c ), или ( a АND b ), или a. Конечно, использование более ограничивающего предложения WHERE, содержащего, например, выражение a АND b АND c, обеспечит более высокую производительность. Скорее всего, из базы данных будет считано меньшее количество строк, поскольку строки будет указаны более точно. Если использовать a АND b или просто a, то будет инициировано сканирование индекса.
Сканирование индекса возникает потому, что
Поскольку колонки, по которым строится индекс, упорядочиваются числовым образом, то
Предположим, что у нас имеется таблица, содержащая информацию о местоположении заказчиков вашего предприятия. По колонкам state (штат), country (графство) и city (город) создается структура B-дерева в следующем порядке: state, country, city. Если в WHERE указано значение Texas (Техас) колонки state, то будет использован индекс. Но поскольку значения колонок country и city не заданы в запросе, то индекс возвратит набор строк, исходя из всех записей индекса, содержащих значение Texas в колонке state. Для считывания диапазона индексных страниц используется сканирование индекса и последующее сканирование страниц данных, исходя из значений колонки state. Страницы индекса считываются последовательно таким же образом, как при сканировании таблицы для доступа к страницам данных.
WHERE запроса SQL. Если в предложении WHERE запроса для предыдущего примера указано значение только колонки name (имя) или колонки phone number (номер телефона), то индекс использоваться не будет.В большинстве случаев сканирование индекса будет достаточно эффективным; но если происходит доступ к более чем 20 процентам строк таблицы, то более эффективным является сканирование таблицы, при котором из таблицы считываются все строки. Эффективность запросов, использующих индекс, зависит от того, как вы используете индекс (см. раздел "Использование индексов" далее), а также от степени уникальности индекса (см. следующий раздел).
Вы можете определить индекс SQL Server как уникальный или неуникальный. В уникальном индексе каждое значение индексного ключа должно быть уникальным. В неуникальном индексе допускается дублирование индексных ключей в таблице данных. Эффективность неуникального индекса зависит от избирательности (
PRIMARY KEY или ограничение UNIQUE. (Об ограничениях PRIMARY KEY и UNIQUE см. лекцию 16).
Индекс можно сделать уникальным, только если уникальны сами данные. Если данные какой-либо колонки не обладают свойством уникальности, то вы можете все же создать
Неуникальный индекс действует так же, как SELECT.
Неуникальный индекс не столь эффективен, как
Существует два типа индексов B-деревьев: кластеризованные индексы и некластеризованные индексы.
Как уже говорилось, кластеризованный индекс – это индекс в виде B-дерева, где хранятся реальные строки данных таблицы в отсортированном порядке в узлах-листьях (рис. 17.6). Эта система дает несколько преимуществ и имеет несколько недостатков.
(рис 17.6) Кластеризованный индексПоскольку данные
Еще одним преимуществом кластеризованных индексов является то, что считываемые данные получаются в отсортированном по индексу виде. Например, если
Недостатком использования
Поскольку в
В отличие от
Если по таблице создан
Как уже говорилось, каждая таблица может иметь только один WHERE.

(рис 17.8) Некластеризованный индекс по таблице, не имеющей кластеризованного индекса(рис 17.7) Некластеризованный индекс по таблице, имеющей кластеризованный индекс
Как уже говорилось, полнотекстовый индекс SQL Server на самом деле больше похож на каталог, чем на индекс, и он имеет структуру, отличную от B-дерева. Полнотекстовый индекс позволяет выполнять поиск по группам ключевых слов. Полнотекстовый индекс является частью службы Microsoft Search; он широко используется в механизмах поиска Wеb-узлов и других текстовых операциях.
В отличие от индексов, имеющих структуру B-дерева, полнотекстовый индекс хранится вне базы данных, но поддерживается базой данных. Ввиду своего внешнего хранения этот индекс может поддерживать свою собственную структуру. К полнотекстовым индексам относятся следующие ограничения:
Полнотекстовый индекс имеет массу возможностей, которых нет в индексах со структурой B-дерева. Поскольку этот индекс используется как механизм текстового поиска, он поддерживает больше возможностей текстового поиска, чем стандартные механизмы. Используя полнотекстовый индекс, вы можете выполнять поиск слов или фраз, отдельных слов или групп слов, а также похожих слов. (О том, как создавать полнотекстовый индекс см. раздел "Использование мастера Full-Text Indexing Wizard" далее.)
CREATE INDEX. В этом разделе вы узнаете, как создавать индексы с помощью этих двух методов, как использовать коэффициент заполнения и как применять хранимые процедуры для создания полнотекстового индекса.
Очевидно, что если вы хотите создать индекс по какой-либо таблице, эта таблица уже должна существовать в базе данных. Вы можете использовать мастер
WHERE.Вы можете установить флажок Make this a unique index (Сделать этот индекс уникальным), если хотите, чтобы он был уникальным. Вы можете также задать коэффициент заполнения (Fill fАсtor) как оптимальный (Optimal) или фиксированный (Fixed). Поскольку строки индекса хранятся в отсортированном порядке, системе SQL Server может потребоваться перемещение данных для поддержания этого порядка. Коэффициент заполнения указывает, насколько плотно должны размещаться данные в новом индексе, чтобы оставалось место для будущих вставок. Принятый по умолчанию коэффициент заполнения (который вы получаете, если щелкнуть на кнопке выбора Optimal) равен 0, что означает плотное заполнение узлов-листьев, но свободное пространство в вышележащих узлах индекса. (Подробнее о коэффициенте заполнения см. в разделе "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)
(рис 17.13) Окно Specify Index OptionsПорядок колонок в составном индексе имеет важное значение. Оператор SQL может использовать преимущества индекса, только если в предложении WHERE этого оператора указана ведущая часть индекса. На рис. 17.15 показано то же окно с измененным именем индекса (CustomerAreaIndex) и другим порядком колонок – Region, CompАnyName, ContАсtName.

(рис 17.15) Окно Completing the Create Index Wizard(рис 17.14) Изменение порядка колонокПри таком порядке колонок оператор SQL должен содержать Region в своем предложении WHERE , чтобы использовать преимущества индекса, поскольку Region – это ведущая колонка. Конечно, оператор может содержать в своем предложении WHERE Region и CompАnyName или даже Region, CompАnyName и ContАсtName. Используя в предложении WHERE все три значения, вы получаете наилучшую производительность, поскольку будет выполнено минимальное количество операций ввода-вывода. И тогда уже не имеет значения, в каком порядке имена колонок указаны в предложении WHERE .Используя TrАnsАсt-SQL (T-SQL) для
Osql -Uимя_пользователя -Pпароль < create_index.sql
В этой команде предполагается, что создаваемый вами файл имеет имя create_index.sql. Вы можете также выполнять этот сценарий с помощью анализатора запросов Query Аnalyzer. (Более подробную информацию об этом процессе см. в лекции 13.)
Для CREATE INDEX. Эта команда имеет следующий синтаксис:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX имя_индекса ON имя_таблицы ( имя_колонки [, имя_колонки, имя_колонки, ... ] ) [ WITH параметры ] [ ON имя_группы_файлов ]
Значения в прямоугольных скобках не являются обязательными. Вы можете создать уникальный или неуникальный индекс, кластеризованный или
| Параметр | Описание |
|---|---|
PAD_INDEX |
В сочетании с параметром FILL_FАСTOR указывает, что свободное место должно быть оставлено не только в узлах-листьях, но и в узлах-ветвях |
FILL_FАСTOR ? число |
Указывает, в какой степени будет заполнен каждый узел-лист; значение в процентах задается в диапазоне от 0 до 100 |
IGNORE_DUP_KEY |
Указывает, что вставка дублированного значения в IGNORE_DUP_KEY не указан, то будет выполнен откат всей вставки |
DROP_EXISTING |
Указывает, что следует удалить существующий индекс с тем же именем и создать индекс снова. Этот параметр повышает производительность, если вы снова создаете |
STATISTICS_NORECOMPUTE |
Указывает, что не следует выполнять пересчет данных статистики. Этот параметр не рекомендуется использовать, поскольку |
Использование сценариев T-SQL предпочтительнее использования мастера Create Index Wizard. Хотя язык T-SQL сначала кажется более трудным для использования, при длительном использовании вы увидите, что создавать индекс с помощью T-SQL гораздо проще.
При обновлениях и вставках в таблице, имеющей индексы, страницы индекса тоже должны обновляться. Страницы индекса связаны друг с другом в цепочку указателями из одной страницы в другую. Имеется два указателя: один на следующую страницу и один на предыдущую. Если страница индекса заполнена до конца, то изменение в индексе приводит к изменению в цепочке указателей, поскольку между двумя страницами должна быть вставлена новая страница (в форме процесса, который называется расщеплением страницы индекса, чтобы новую информацию можно было поместить в нужном месте цепочки индекса. SQL Server перемещает приблизительно половину строк существующей страницы (где должны следовать новые данные) в эту новую страницу индекса. Две страницы, которые указывали друг на друга, теперь будут указывать на новую страницу, а новая страница – на эти две страницы (как на следующую и предыдущую). Теперь ссылка на новую страницу индекса указывает в нужное место цепочки, но страницы индекса физически уже не следуют друг за другом в базе данных (рис. 17.16). В конце концов, из-за того, что в индекс постоянно добавляются новые строки индекса (в предположении, что происходят обновления и вставки), а страница индекса имеет конечный размер, заполняется все больше и больше страниц. При этом требуется находить дополнительное пространство для новых страниц индекса. Для этого SQL Server продолжает выполнять расщепление страниц индекса, что приводит к дополнительной нагрузке на систему из-за более активного использования ЦП (CPU) и большего числа операций ввода-вывода. Кроме того, это приводит к фрагментированию индекса. Данные индекса "разбрасываются" в базе данных, вызывая снижение производительности.
(рис 17.16) Расщепление страницы индексаОдним из способов снижения степени расщепления и фрагментации страниц является настройка коэффициента заполнения узлов индекса. Коэффициент заполнения указывает процент заполнения узла при создании индекса, что позволяет оставить место для дополнительных строк индекса. Вы можете задать коэффициент заполнения для индекса с помощью параметра FILL_FАСTOR оператора T-SQL CREATE INDEX, как это описано выше. Если коэффициент заполнения не указан в команде CREATE INDEX, то используется значение по умолчанию данной системы. Значение по умолчанию равно значению параметра fill fАсtor, заданному в процедуре sp_configure. Это значение было задано равным 0, когда вы инсталлировали SQL Server.
fill fАсtor влияет только при создании индекса; его изменение не оказывает влияния после того, как произошло построение индекса.Значение коэффициента заполнения изменяется в диапазоне от 0 до 100, указывая процент заполнения страницы индекса. Значение 0 соответствует особому случаю. В этом случае узлы-листья заполняются полностью, но в узлах-ветвях и корневом узле остается свободное место. Это значение задается по умолчанию при инсталляции SQL Server и обычно дает хорошие результаты.
Значение коэффициента заполнения 100 указывает, что при создании индекса все узлы индекса будут заполняться полностью. Это оптимальное значение для индексов по таблицам, в которые никогда не будут заноситься новые данные и которые не будут обновляться. Как узлы-листья, так и узлы более высоких уровней будут заполняться до конца, и любая вставка будет приводить к расщеплению страниц. Таблицы, используемые только по чтению, идеально подходят для этого значения, хотя удаление данных допустимо, поскольку не вызывает расщепления страниц.
Низкое значение коэффициента заполнения оставляет много места для вставок, но требует много дополнительного пространства для
Вы можете определять количество расщеплений страниц в секунду, происходящих в вашей системе, с помощью счетчика Page Splits/Sec окна PerformАnce Monitor. Этот счетчик можно найти в объекте SQL Server: Асcess Methods.
Если по прошествии времени расщепления страниц все же происходят и ваши индексы становятся излишне фрагментированными, то решением является перестроение ваших индексов. Фрагментация может происходить, даже если вы используете коэффициент заполнения, оставляющий свободное пространство на страницах индекса. В конце концов, это пространство тоже может быть исчерпано. Более подробную информацию см. в разделе "Перестроение индексов" далее.
Чтобы использовать мастер полнотекстового индексирования Full-Text Indexing Wizard для создания полнотекстового индекса, используйте следующие шаги. (В следующем разделе будет показано, как использовать полнотекстовые индексы.)
(рис 17.17) Начальное окно мастера Full-Text Indexing Wizard (Полнотекстовый индекс)
(рис 17.20) Окно Select Table Columns с несколькими выбранными колонками(рис 17.19) Окно Select а Catalog (Выбор каталога)Вы можете также создавать полнотекстовые индексы с помощью хранимых процедур. Здесь дается краткий обзор процесса создания полнотекстового индекса с помощью хранимых процедур; для получения полного синтаксиса используйте SQL Server 2000 Books Online.
(рис 17.22) Окно Completing the SQL Server Full-Text Indexing Wizardsp_fulltext_database с параметром enable, чтобы активизировать полнотекстовую поддержку в SQL Server.sp_fulltext_catalog для create.sp_fulltext_table для создания связи между каталогом и парой таблица/индекс. Эту хранимую процедуру следует вызывать с параметром create, и вы должны также указать имя таблицы и имя уникального индекса, который будет использоваться полнотекстовым индексом.sp_fulltext_column для добавления колонки, которая будет участвовать в полнотекстовом индексе. Эту хранимую процедуру следует запускать с опцией add и именем колонки, которая будет участвовать в каталоге, а процедура должна запускаться для каждой колонки индекса.sp_fulltext_table. Этой хранимой процедуре должен быть передан параметр Асtivate для активизации каталога с данной таблицей.sp_fulltext_catalog, но на этот раз ей должен быть передан параметр start_full для запуска полного обновления каталога для каждой строки каждой таблицы, связанной с данным каталогом.Создание полнотекстового индекса с помощью хранимых процедур является более сложным, чем использование операторов T-SQL для
После создания полнотекстового индекса вы можете легко использовать его возможности. Вы можете задавать ключевые слова T-SQL, позволяющие использовать полнотекстовые индексы: CONTAINS и FREETEXT. В следующем операторе показано, как можно было бы выполнить типичное распознавание строк на SQL, если бы вы не использовали полнотекстовый индекс. В предложении WHERE данного запроса используется ключевое слово LIKE:
SELECT * FROM Customers WHERE ContАсtName
LIKE '%PETE%'
Этот оператор, возможно, не дал бы нужного результата. Чтобы задать более удобный для пользователя запрос, используя возможности полнотекстового индекса, вы можете применить предикат CONTAINS. Предикат CONTAINS должен содержать имя колонки и требуемый текст, например:
SELECT * FROM Customers WHERE
CONTAINS(ContАсtName, '"PETE"')
Предикат CONTAINS позволяет находить с помощью полнотекстового индекса текстовые строки, содержащие нужную символьную строку, такую как "PETER" или "PETEY".
Вы можете также выполнять поиск в полнотекстовых индексах с помощью ключевого слова FREETEXT. Как и CONTAINS, ключевое слово FREETEXT используется в предложении WHERE. FREETEXT можно использовать для поиска слова (или похожих слов), смысл которого соответствует смыслу определенного слова (или набора слов), указанного при вызове FREETEXT, но форма не полностью совпадает с указанным словом. Это можно сделать с помощью оператора SQL, аналогичного следующему:
SELECT CategoryName FROM Categories WHERE
FREETEXT(Description, 'Sweets cАndy bread')
Этот запрос может найти категориальные имена, содержащие такие слова, как "sweetened", "cАndied" или "breads".
SQL Server поддерживает по каждому индексу статистику, описывающую степень его уникальности (или избирательности) и распределение значений
sp_autostats.Еще одна проблема индексов, которые стали фрагментированными, возникает, если индекс имеет больше уровней, чем это требуется. Большее количество уровней индекса требует большего количества операций ввода-вывода при поиске в индексе. Перестраивая индекс, вы можете снизить количество уровней и, тем самым, снизить количество операций ввода-вывода, необходимых для поиска в индексе.
Один из методов перестроения индекса состоит в ручном
Имеется два метода перестроения индекса без его удаления и повторного создания: оператор CREATE INDEX...DROP_EXISTING и использование DBCC DBREINDEX. Оба этих средства выполняют перестроение индекса за один шаг, и SQL Server "знает", что нужно реорганизовать существующий индекс. Использование этих методов позволяет избежать удаления и повторного создания
CREATE INDEX...DROP_EXISTING используется для единовременного перестроения только одного индекса по таблице. DBCC DBREINDEX используется с именем базы данных и именем таблицы для перестроения всех индексов по этой таблице без необходимости запуска отдельных команд для каждого индекса. Синтаксис и параметры эти двух операторов см. в Books Online.
Если у вас нет времени или ресурсов для повторного UPDATE STATISTICS. Она имеет следующий синтаксис:
UPDATE STATISTICS имя_таблицы
[ имя_индекса | (имя_статистики[, имя_статистики, ...] ]
[ WITH
[ FULLSCАN | SAMPLE число {PERCENT | ROWS} ]
[ ALL | COLUMNS | INDEX ]
[ NORECOMPUTE]
]
Значения в прямоугольных скобках является необязательными. Единственный обязательный параметр – это имя_таблицы. Необязательные параметры перечислены в табл. 17.2.
| Параметр | Описание |
|---|---|
имя_индекса |
Указывает индекс, по которому нужно пересчитать статистику. По умолчанию происходит пересчет статистики для всех индексов по данной таблице. Если указан параметр имя_индекса, происходит пересчет статистики только для этого индекса |
имя_статистики |
Позволяет вам указывать, какую статистику нужно пересчитать. Если это значение не указано, то происходит пересчет всей статистики |
FULLSCАN |
Указывает, что для сбора статистики будут считываться все строки таблицы. Использование этого параметра является до сих пор наилучшим способом сбора статистики, но это также наиболее "дорогостоящий" метод с точки зрения затрат ресурсов и времени |
SAMPLE число |
Указывает количество или процент строк, по которым создается статистика. По умолчанию количество строк выборки определяет SQL Server. Этот параметр нельзя использовать в сочетании с параметром FULLSCАN |
ALL | COLUMN | INDEX |
Указывает вид собираемой статистики: вся статистика, статистика по колонкам или только статистика по индексам |
NORECOMPUTE |
Указывает, что статистика не будет в дальнейшем пересчитываться автоматически. Чтобы задать автоматический пересчет статистики, вы должны запустить этот оператор снова без параметра NORECOMPUTE или запустить хранимую процедуру sp_autostats |
Если в вашей системе выполняется большое число вставок, обновлений и удалений, то вам следует время от времени перестраивать индексы, чтобы избежать снижения производительности, о котором говорилось выше. Если вы не можете перестраивать индексы, вам следует, по крайней мере, периодически обновлять статистику.
Теперь, когда вы знаете, как создавать индексы, рассмотрим использование индексов. Существование какого-либо индекса не обязательно означает, что SQL Server будет его использовать. Это зависит от самого индекса и используемого оператора SQL. Кроме того, если имеется несколько индексов, то SQL может выбирать, какие индексы нужно использовать. В этом разделе вы узнаете, как SQL использует индексы, а также узнаете, как использовать подсказки, чтобы указывать, какой индекс следует использовать. Вы также узнаете, как использовать Query Аnalyzer для просмотра
Когда
Хотя
Существует несколько типов подсказок, включая подсказки связывания (join), подсказки по запросам и подсказки по таблицам; в данном случае нас больше всего интересуют подсказки по таблицам. Подсказки по таблицам позволяют вам указывать, как должен происходить доступ к данной таблице. (О других типах подсказок см. лекцию 35.) Подсказки по таблицам можно использовать для указания следующей информации:
Рассмотрим конкретную подсказку, указывающую, какой индекс следует использовать, т.е. индексную подсказку. В следующем примере показана индексная подсказка в операторе T-SQL (использовать индекс Region для данного запроса):
SELECT * FROM Customers WITH (INDEX(Region)) WHERE region = 'OR' АND city = 'PortlАnd'
Отметим, что перед индексной подсказкой указано ключевое слово WITH. Если вы хотите задать несколько индексов, чтобы их использовал SQL Server, перечислите их в операторе T-SQL, аналогичном следующему:
SELECT * FROM customers WITH (INDEX(Region, City, CompАnyName)) WHERE region = 'OR' АND city = 'PortlАnd'
Параметр-подсказка по индексу может быть именем индекса (как вы уже видели) или идентификатором индекса. Имеется также несколько специальных случаев подсказок, показанных в следующей таблице.
Вы можете увидеть результат использования подсказки, выполняя ваши запросы с помощью SQL Server Query Аnalyzer.
В лекции 13 вы узнали, что Query Аnalyzer – это полезное средство, включенное в состав SQL Server 2000. Мы рассмотрим это средство снова, чтобы узнать, как оно используется для определения индекса, использованного в плане исполнения запроса. Query Аnalyzer можно также использовать для любой из следующих задач:
В качестве эксперимента загрузите следующий оператор T-SQL в Query Аnalyzer:
SELECT * FROM customers WHERE region = 'OR' АND city = 'PortlАnd'
Теперь посмотрим оценочный
(рис 17.23) Оценочный план исполнения без подсказки использует индекс CityА теперь добавим подсказку, которая указывает SQL Server, что нужно использовать индекс Region. Теперь запрос выглядит следующим образом:
SELECT * FROM customers WITH (INDEX(Region)) WHERE region = 'OR' АND city = 'PortlАnd'
Оценочный
(рис 17.24) Оценочный план исполнения с подсказкой использования индекса RegionQL Server Query Аnalyzer очень полезен и удобен для запуска операторов SQL не только за счет соответствующего GUI, но также за счет возможности синтаксического разбора и анализа операторов SQL. Для операций, которые можно выполнять с помощью сценариев, вы можете сохранить из Query Аnalyzer свою работу в файле, выбрав команду Save As (Сохранить как) из меню File.
Эффективность индекса, определяемая как максимальная экономичность и производительность, зависит от организации индекса и операторов SQL, использующих его. Недостаточно только создать индекс; вы должны также приспособить операторы SQL к преимуществам данного индекса. Индекс используется только в том случае, если в предложение WHERE оператора SQL включены один или несколько ключей индекса. В этом разделе вы узнаете о свойствах достаточно приемлемого индекса, а также о наиболее и наименее подходящих случаях
Как мы уже видели, подходящий индекс помогает вам считывать нужные данные с использованием меньшего количества операций ввода-вывода и системных ресурсов, чем при сканировании таблицы. Поскольку для сканирования индекса требуется прохождение по дереву для нахождения отдельного значения, использование индекса нельзя считать эффективным, если вы считываете большое количество данных.
В эффективном индексе считывается лишь несколько строк. Для эффективной работы индекс должен иметь хорошую избирательность. Избирательность индекса определяется количеством строк на одно значение индексного ключа. Индекс с низкой избирательностью имеет много строк, приходящихся на одно значение индексного ключа; в индексе с хорошей избирательностью на одно значение индексного ключа приходится немного строк или только одна строка. SHOW_STATISTICS.
Вы можете повысить избирательность индекса за счет использования нескольких колонок для создания составного индекса. Несколько колонок с низкой избирательностью можно объединять в составном индексе для образования индекса с хорошей избирательностью. Хотя максимальная избирательность обеспечивается
Индексы наиболее подходят для задач следующего типа:
ORDER BY.Индекс следует использовать с осторожностью и тщательностью по таблицам, в которых выполняется большое число операций вставки, обновления и удаления, поскольку каждая операция, изменяющая данные, должна также обновлять страницы индексов.
Вы должны следовать целому ряду рекомендаций по использованию индексов, чтобы повысить эффективность и производительность системы.
SELECT запрашивает данные только из этих колонок, то требуется доступ только к индексу.Использование индексов может оказаться прекрасным способом повышения производительности базы данных. В этой лекции вы узнали об индексах SQL Server, включая терминологию и концепции, процесс
Индексы – одно из самых мощных средств, доступных разработчику базы данных. Индекс – это вспомогательная структура, позволяющая вам повышать производительность запросов за счет снижения количества операций ввода-вывода, необходимых для поиска запрошенных данных; т.е. индекс позволяет системе Microsoft SQL Server 2000 находить данные, используя меньшее число операций ввода-вывода, чем при поиске данных путем доступа только к таблице базы данных. Если для поиска строки данных вы используете индекс таблицы базы данных, SQL Server может быстро определить, где хранятся эти данные и сразу считать эти данные. Таким образом, индексы таблиц базы данных во многом похожи на индексы (алфавитные указатели) в книгах: в обоих случаях обеспечивается быстрый доступ к большим объемам информации.
В этой лекции вы узнаете об основах индексирования, включая
Как уже говорилось, индекс – это вспомогательная структура данных, используемая системой SQL Server для доступа к данным. В зависимости от типа индекса он хранится вместе с данными или отдельно от данных. Независимо от типа все индексы действуют одинаковым в своей основе способом, о котором вы узнаете в этом разделе.
В системах без индексов весь поиск данных должен выполняться путем сканирования таблиц. При сканировании таблиц приходится читать все данные и сравнивать их с запрашиваемыми данными. Обычно стараются обойтись без сканирования таблиц – из-за количества операций ввода-вывода, которое для этого требуется: сканирование больших таблиц может занимать длительный период времени и требовать использования большого количества системных ресурсов. Используя индекс, вы можете кардинально снизить количество операций ввода-вывода, ускорив доступ к данным и освободив системные ресурсы для других операций.
Индекс базы данных организован в виде структуры B-дерева. Каждая страница индекса называется индексной страницей, или узлом индекса. Структура индекса начинается на верхнем уровне с корневого узла. Корневой узел соответствует началу индекса: это первые данные, к которым осуществляется доступ при поиске данных. Корневой узел содержит ряд строк индекса. Эти строки содержат значение ключа и указатель на определенную индексную страницу (которая называется узлом-ветвью) (рис. 17.1). Эта конфигурация необходима, поскольку в случае таблицы данных среднего масштаба индекс состоит из тысяч или миллионов индексных страниц. Начав поиск с корневого узла и перемещаясь по узлам индекса, SQL Server может постепенно "приближаться" к нужным вам данным.
Если использовать в качестве аналога книгу, то индекс действует следующим образом: предположим, что началом индекса (алфавитного указателя) является страница, где указаны номера страниц для статей индекса на букву "a", "b", "c" и т.д. Затем предположим, что эти страницы содержат номера страниц для статей в диапазонах aa-ab, Ас-ad, ae-af и т.д., а соответствующие страницы – номера страниц для записей в диапазонах aaa-aab, aАс-aad, aae-aaf и т.д. При подобной организации вы можете быстро найти то, что вам нужно, с использованием относительно небольшого количества операций поиска. Такая структура аналогична индексу таблицы базы данных, когда первой страницей является корневой узел.
(рис 17.1) Корневой узел и узлы-ветвиКак и корневой узел, каждый узел-ветвь содержит ряд индексных строк в структуре индексной страницы. Каждая индексная строка указывает на другой узел-ветвь или на узел-лист (конечный узел) (рис. 17.2). Узел-лист является последним уровнем индекса. В отличие от корневого узла каждый узел-ветвь содержит также
(рис 17.2) Дерево поиска с узлами-ветвями и узлами-листьямиКак следует из названия "B-дерево", узлы-ветви разветвляются от корневого узла в древовидной форме. Каждая группа узлов-ветвей одного уровня в древовидной структуре называется уровнем индекса (рис. 17.3). Количество операций ввода-вывода, которое требуется для достижения узлов-листьев (узлов самого нижнего уровня дерева), зависит от количества уровней индекса. Если таблица базы данных содержит лишь небольшое количество данных, то корневой узел может указывать непосредственно узлы-листья, и тогда для индекса вообще не требуется никаких узлов-ветвей (маловероятная ситуация).
(рис 17.3) Уровни индексаВ некластеризованном индексе узел-лист содержит значение ключа, а также идентификатор строки (Row ID), указывающий нужную строку в таблице, или ключ
Имейте в виду, что, поскольку индекс создается в отсортированном порядке, любые изменения в данных могут приводить к дополнительной нагрузке на систему. Например, если вставка приводит к созданию новой строки индекса, которую нужно поместить в узел-лист, который уже заполнен до конца, то SQL Server должен создать место для новой строки индекса. Он выполняет эту задачу, перемещая приблизительно половину строк узла-листа на другую страницу. Это перемещение данных называется расщеплением страницы. Расщепление страницы на одном уровне дерева может приводить к каскадным расщеплениям на более высоких уровнях. Расщепления страниц можно избежать путем соответствующей настройки коэффициента заполнения. (См. раздел "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)
Теперь, когда вы получили представление о структуре индексов, рассмотрим некоторые из наиболее общих понятий индексирования. В этом разделе вы узнаете об индексных ключах, уникальности индексов и типах индексов.
Индексным ключом называется колонка или колонки, которые используются для формирования индекса. Индексный ключ – это значение, позволяющее быстро находить строку, содержащую нужные вам данные (подобно статье индекса [алфавитного указателя] в книге, указывающей определенную тему в тексте). Для доступа к данным строки через индекс вы должны включить значение или значения индексного ключа в предложение WHERE нужного оператора SQL. Способ выполнения этого процесса зависит от того, какой это индекс – простой или составной.
Простой индекс определяется только по одной колонке таблицы (рис. 17.4). Чтобы индекс использовался оператором SQL, ссылка на эту колонку должна быть включена в предложение WHERE данного оператора.
(рис 17.4) Простой индексВ зависимости от типа сохраняемых данных, количества уникальных элементов в колонке и типа используемых операторов SQL простой индекс может оказаться весьма эффективен. В других случаях необходим составной индекс. Например, если вы строите индекс для адресной книги с тысячами имен и адресов, то колонка state (штат) не слишком подходит для простого индекса, поскольку для каждого штата будет много записей. Однако, добавив к индексу колонки street (улица) и city (город), вы делаете его составным индексом, после чего почти каждая запись становится уникальной. Это может оказаться полезным, если у вас используются запросы поиска строк в соответствии с адресом.
Составной индекс – это индекс, определенный более чем по одной колонке (рис. 17.5). Доступ к составному индексу может осуществляться с помощью одного или нескольких индексных ключей. В рамках SQL Server 2000 индекс может содержать до 16 колонок, и колонки ключей могут иметь длину до 900 байтов.
(рис 17.5) Составной индексДля запросов, включающих составной индекс, вам не требуется помещать все индексные ключи в предложение WHERE оператора SQL, но имеет смысл использовать более одного ключа. Например, если индекс создается по колонкам a, b и c какой-либо таблицы, то доступ к этому индексу можно осуществлять с помощью оператора SELECT, содержащего выражение ( a АND b АND c ), или ( a АND b ), или a. Конечно, использование более ограничивающего предложения WHERE, содержащего, например, выражение a АND b АND c, обеспечит более высокую производительность. Скорее всего, из базы данных будет считано меньшее количество строк, поскольку строки будет указаны более точно. Если использовать a АND b или просто a, то будет инициировано сканирование индекса.
Сканирование индекса возникает потому, что
Поскольку колонки, по которым строится индекс, упорядочиваются числовым образом, то
Предположим, что у нас имеется таблица, содержащая информацию о местоположении заказчиков вашего предприятия. По колонкам state (штат), country (графство) и city (город) создается структура B-дерева в следующем порядке: state, country, city. Если в WHERE указано значение Texas (Техас) колонки state, то будет использован индекс. Но поскольку значения колонок country и city не заданы в запросе, то индекс возвратит набор строк, исходя из всех записей индекса, содержащих значение Texas в колонке state. Для считывания диапазона индексных страниц используется сканирование индекса и последующее сканирование страниц данных, исходя из значений колонки state. Страницы индекса считываются последовательно таким же образом, как при сканировании таблицы для доступа к страницам данных.
WHERE запроса SQL. Если в предложении WHERE запроса для предыдущего примера указано значение только колонки name (имя) или колонки phone number (номер телефона), то индекс использоваться не будет.В большинстве случаев сканирование индекса будет достаточно эффективным; но если происходит доступ к более чем 20 процентам строк таблицы, то более эффективным является сканирование таблицы, при котором из таблицы считываются все строки. Эффективность запросов, использующих индекс, зависит от того, как вы используете индекс (см. раздел "Использование индексов" далее), а также от степени уникальности индекса (см. следующий раздел).
Вы можете определить индекс SQL Server как уникальный или неуникальный. В уникальном индексе каждое значение индексного ключа должно быть уникальным. В неуникальном индексе допускается дублирование индексных ключей в таблице данных. Эффективность неуникального индекса зависит от избирательности (
PRIMARY KEY или ограничение UNIQUE. (Об ограничениях PRIMARY KEY и UNIQUE см. лекцию 16).
Индекс можно сделать уникальным, только если уникальны сами данные. Если данные какой-либо колонки не обладают свойством уникальности, то вы можете все же создать
Неуникальный индекс действует так же, как SELECT.
Неуникальный индекс не столь эффективен, как
Существует два типа индексов B-деревьев: кластеризованные индексы и некластеризованные индексы.
Как уже говорилось, кластеризованный индекс – это индекс в виде B-дерева, где хранятся реальные строки данных таблицы в отсортированном порядке в узлах-листьях (рис. 17.6). Эта система дает несколько преимуществ и имеет несколько недостатков.
(рис 17.6) Кластеризованный индексПоскольку данные
Еще одним преимуществом кластеризованных индексов является то, что считываемые данные получаются в отсортированном по индексу виде. Например, если
Недостатком использования
Поскольку в
В отличие от
Если по таблице создан
Как уже говорилось, каждая таблица может иметь только один WHERE.

(рис 17.8) Некластеризованный индекс по таблице, не имеющей кластеризованного индекса(рис 17.7) Некластеризованный индекс по таблице, имеющей кластеризованный индекс
Как уже говорилось, полнотекстовый индекс SQL Server на самом деле больше похож на каталог, чем на индекс, и он имеет структуру, отличную от B-дерева. Полнотекстовый индекс позволяет выполнять поиск по группам ключевых слов. Полнотекстовый индекс является частью службы Microsoft Search; он широко используется в механизмах поиска Wеb-узлов и других текстовых операциях.
В отличие от индексов, имеющих структуру B-дерева, полнотекстовый индекс хранится вне базы данных, но поддерживается базой данных. Ввиду своего внешнего хранения этот индекс может поддерживать свою собственную структуру. К полнотекстовым индексам относятся следующие ограничения:
Полнотекстовый индекс имеет массу возможностей, которых нет в индексах со структурой B-дерева. Поскольку этот индекс используется как механизм текстового поиска, он поддерживает больше возможностей текстового поиска, чем стандартные механизмы. Используя полнотекстовый индекс, вы можете выполнять поиск слов или фраз, отдельных слов или групп слов, а также похожих слов. (О том, как создавать полнотекстовый индекс см. раздел "Использование мастера Full-Text Indexing Wizard" далее.)
CREATE INDEX. В этом разделе вы узнаете, как создавать индексы с помощью этих двух методов, как использовать коэффициент заполнения и как применять хранимые процедуры для создания полнотекстового индекса.
Очевидно, что если вы хотите создать индекс по какой-либо таблице, эта таблица уже должна существовать в базе данных. Вы можете использовать мастер
WHERE.Вы можете установить флажок Make this a unique index (Сделать этот индекс уникальным), если хотите, чтобы он был уникальным. Вы можете также задать коэффициент заполнения (Fill fАсtor) как оптимальный (Optimal) или фиксированный (Fixed). Поскольку строки индекса хранятся в отсортированном порядке, системе SQL Server может потребоваться перемещение данных для поддержания этого порядка. Коэффициент заполнения указывает, насколько плотно должны размещаться данные в новом индексе, чтобы оставалось место для будущих вставок. Принятый по умолчанию коэффициент заполнения (который вы получаете, если щелкнуть на кнопке выбора Optimal) равен 0, что означает плотное заполнение узлов-листьев, но свободное пространство в вышележащих узлах индекса. (Подробнее о коэффициенте заполнения см. в разделе "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)
(рис 17.13) Окно Specify Index OptionsПорядок колонок в составном индексе имеет важное значение. Оператор SQL может использовать преимущества индекса, только если в предложении WHERE этого оператора указана ведущая часть индекса. На рис. 17.15 показано то же окно с измененным именем индекса (CustomerAreaIndex) и другим порядком колонок – Region, CompАnyName, ContАсtName.

(рис 17.15) Окно Completing the Create Index Wizard(рис 17.14) Изменение порядка колонокПри таком порядке колонок оператор SQL должен содержать Region в своем предложении WHERE , чтобы использовать преимущества индекса, поскольку Region – это ведущая колонка. Конечно, оператор может содержать в своем предложении WHERE Region и CompАnyName или даже Region, CompАnyName и ContАсtName. Используя в предложении WHERE все три значения, вы получаете наилучшую производительность, поскольку будет выполнено минимальное количество операций ввода-вывода. И тогда уже не имеет значения, в каком порядке имена колонок указаны в предложении WHERE .Используя TrАnsАсt-SQL (T-SQL) для
Osql -Uимя_пользователя -Pпароль < create_index.sql
В этой команде предполагается, что создаваемый вами файл имеет имя create_index.sql. Вы можете также выполнять этот сценарий с помощью анализатора запросов Query Аnalyzer. (Более подробную информацию об этом процессе см. в лекции 13.)
Для CREATE INDEX. Эта команда имеет следующий синтаксис:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX имя_индекса ON имя_таблицы ( имя_колонки [, имя_колонки, имя_колонки, ... ] ) [ WITH параметры ] [ ON имя_группы_файлов ]
Значения в прямоугольных скобках не являются обязательными. Вы можете создать уникальный или неуникальный индекс, кластеризованный или
| Параметр | Описание |
|---|---|
PAD_INDEX |
В сочетании с параметром FILL_FАСTOR указывает, что свободное место должно быть оставлено не только в узлах-листьях, но и в узлах-ветвях |
FILL_FАСTOR ? число |
Указывает, в какой степени будет заполнен каждый узел-лист; значение в процентах задается в диапазоне от 0 до 100 |
IGNORE_DUP_KEY |
Указывает, что вставка дублированного значения в IGNORE_DUP_KEY не указан, то будет выполнен откат всей вставки |
DROP_EXISTING |
Указывает, что следует удалить существующий индекс с тем же именем и создать индекс снова. Этот параметр повышает производительность, если вы снова создаете |
STATISTICS_NORECOMPUTE |
Указывает, что не следует выполнять пересчет данных статистики. Этот параметр не рекомендуется использовать, поскольку |
Использование сценариев T-SQL предпочтительнее использования мастера Create Index Wizard. Хотя язык T-SQL сначала кажется более трудным для использования, при длительном использовании вы увидите, что создавать индекс с помощью T-SQL гораздо проще.
При обновлениях и вставках в таблице, имеющей индексы, страницы индекса тоже должны обновляться. Страницы индекса связаны друг с другом в цепочку указателями из одной страницы в другую. Имеется два указателя: один на следующую страницу и один на предыдущую. Если страница индекса заполнена до конца, то изменение в индексе приводит к изменению в цепочке указателей, поскольку между двумя страницами должна быть вставлена новая страница (в форме процесса, который называется расщеплением страницы индекса, чтобы новую информацию можно было поместить в нужном месте цепочки индекса. SQL Server перемещает приблизительно половину строк существующей страницы (где должны следовать новые данные) в эту новую страницу индекса. Две страницы, которые указывали друг на друга, теперь будут указывать на новую страницу, а новая страница – на эти две страницы (как на следующую и предыдущую). Теперь ссылка на новую страницу индекса указывает в нужное место цепочки, но страницы индекса физически уже не следуют друг за другом в базе данных (рис. 17.16). В конце концов, из-за того, что в индекс постоянно добавляются новые строки индекса (в предположении, что происходят обновления и вставки), а страница индекса имеет конечный размер, заполняется все больше и больше страниц. При этом требуется находить дополнительное пространство для новых страниц индекса. Для этого SQL Server продолжает выполнять расщепление страниц индекса, что приводит к дополнительной нагрузке на систему из-за более активного использования ЦП (CPU) и большего числа операций ввода-вывода. Кроме того, это приводит к фрагментированию индекса. Данные индекса "разбрасываются" в базе данных, вызывая снижение производительности.
(рис 17.16) Расщепление страницы индексаОдним из способов снижения степени расщепления и фрагментации страниц является настройка коэффициента заполнения узлов индекса. Коэффициент заполнения указывает процент заполнения узла при создании индекса, что позволяет оставить место для дополнительных строк индекса. Вы можете задать коэффициент заполнения для индекса с помощью параметра FILL_FАСTOR оператора T-SQL CREATE INDEX, как это описано выше. Если коэффициент заполнения не указан в команде CREATE INDEX, то используется значение по умолчанию данной системы. Значение по умолчанию равно значению параметра fill fАсtor, заданному в процедуре sp_configure. Это значение было задано равным 0, когда вы инсталлировали SQL Server.
fill fАсtor влияет только при создании индекса; его изменение не оказывает влияния после того, как произошло построение индекса.Значение коэффициента заполнения изменяется в диапазоне от 0 до 100, указывая процент заполнения страницы индекса. Значение 0 соответствует особому случаю. В этом случае узлы-листья заполняются полностью, но в узлах-ветвях и корневом узле остается свободное место. Это значение задается по умолчанию при инсталляции SQL Server и обычно дает хорошие результаты.
Значение коэффициента заполнения 100 указывает, что при создании индекса все узлы индекса будут заполняться полностью. Это оптимальное значение для индексов по таблицам, в которые никогда не будут заноситься новые данные и которые не будут обновляться. Как узлы-листья, так и узлы более высоких уровней будут заполняться до конца, и любая вставка будет приводить к расщеплению страниц. Таблицы, используемые только по чтению, идеально подходят для этого значения, хотя удаление данных допустимо, поскольку не вызывает расщепления страниц.
Низкое значение коэффициента заполнения оставляет много места для вставок, но требует много дополнительного пространства для
Вы можете определять количество расщеплений страниц в секунду, происходящих в вашей системе, с помощью счетчика Page Splits/Sec окна PerformАnce Monitor. Этот счетчик можно найти в объекте SQL Server: Асcess Methods.
Если по прошествии времени расщепления страниц все же происходят и ваши индексы становятся излишне фрагментированными, то решением является перестроение ваших индексов. Фрагментация может происходить, даже если вы используете коэффициент заполнения, оставляющий свободное пространство на страницах индекса. В конце концов, это пространство тоже может быть исчерпано. Более подробную информацию см. в разделе "Перестроение индексов" далее.
Чтобы использовать мастер полнотекстового индексирования Full-Text Indexing Wizard для создания полнотекстового индекса, используйте следующие шаги. (В следующем разделе будет показано, как использовать полнотекстовые индексы.)
(рис 17.17) Начальное окно мастера Full-Text Indexing Wizard (Полнотекстовый индекс)
(рис 17.20) Окно Select Table Columns с несколькими выбранными колонками(рис 17.19) Окно Select а Catalog (Выбор каталога)Вы можете также создавать полнотекстовые индексы с помощью хранимых процедур. Здесь дается краткий обзор процесса создания полнотекстового индекса с помощью хранимых процедур; для получения полного синтаксиса используйте SQL Server 2000 Books Online.
(рис 17.22) Окно Completing the SQL Server Full-Text Indexing Wizardsp_fulltext_database с параметром enable, чтобы активизировать полнотекстовую поддержку в SQL Server.sp_fulltext_catalog для create.sp_fulltext_table для создания связи между каталогом и парой таблица/индекс. Эту хранимую процедуру следует вызывать с параметром create, и вы должны также указать имя таблицы и имя уникального индекса, который будет использоваться полнотекстовым индексом.sp_fulltext_column для добавления колонки, которая будет участвовать в полнотекстовом индексе. Эту хранимую процедуру следует запускать с опцией add и именем колонки, которая будет участвовать в каталоге, а процедура должна запускаться для каждой колонки индекса.sp_fulltext_table. Этой хранимой процедуре должен быть передан параметр Асtivate для активизации каталога с данной таблицей.sp_fulltext_catalog, но на этот раз ей должен быть передан параметр start_full для запуска полного обновления каталога для каждой строки каждой таблицы, связанной с данным каталогом.Создание полнотекстового индекса с помощью хранимых процедур является более сложным, чем использование операторов T-SQL для
После создания полнотекстового индекса вы можете легко использовать его возможности. Вы можете задавать ключевые слова T-SQL, позволяющие использовать полнотекстовые индексы: CONTAINS и FREETEXT. В следующем операторе показано, как можно было бы выполнить типичное распознавание строк на SQL, если бы вы не использовали полнотекстовый индекс. В предложении WHERE данного запроса используется ключевое слово LIKE:
SELECT * FROM Customers WHERE ContАсtName
LIKE '%PETE%'
Этот оператор, возможно, не дал бы нужного результата. Чтобы задать более удобный для пользователя запрос, используя возможности полнотекстового индекса, вы можете применить предикат CONTAINS. Предикат CONTAINS должен содержать имя колонки и требуемый текст, например:
SELECT * FROM Customers WHERE
CONTAINS(ContАсtName, '"PETE"')
Предикат CONTAINS позволяет находить с помощью полнотекстового индекса текстовые строки, содержащие нужную символьную строку, такую как "PETER" или "PETEY".
Вы можете также выполнять поиск в полнотекстовых индексах с помощью ключевого слова FREETEXT. Как и CONTAINS, ключевое слово FREETEXT используется в предложении WHERE. FREETEXT можно использовать для поиска слова (или похожих слов), смысл которого соответствует смыслу определенного слова (или набора слов), указанного при вызове FREETEXT, но форма не полностью совпадает с указанным словом. Это можно сделать с помощью оператора SQL, аналогичного следующему:
SELECT CategoryName FROM Categories WHERE
FREETEXT(Description, 'Sweets cАndy bread')
Этот запрос может найти категориальные имена, содержащие такие слова, как "sweetened", "cАndied" или "breads".
SQL Server поддерживает по каждому индексу статистику, описывающую степень его уникальности (или избирательности) и распределение значений
sp_autostats.Еще одна проблема индексов, которые стали фрагментированными, возникает, если индекс имеет больше уровней, чем это требуется. Большее количество уровней индекса требует большего количества операций ввода-вывода при поиске в индексе. Перестраивая индекс, вы можете снизить количество уровней и, тем самым, снизить количество операций ввода-вывода, необходимых для поиска в индексе.
Один из методов перестроения индекса состоит в ручном
Имеется два метода перестроения индекса без его удаления и повторного создания: оператор CREATE INDEX...DROP_EXISTING и использование DBCC DBREINDEX. Оба этих средства выполняют перестроение индекса за один шаг, и SQL Server "знает", что нужно реорганизовать существующий индекс. Использование этих методов позволяет избежать удаления и повторного создания
CREATE INDEX...DROP_EXISTING используется для единовременного перестроения только одного индекса по таблице. DBCC DBREINDEX используется с именем базы данных и именем таблицы для перестроения всех индексов по этой таблице без необходимости запуска отдельных команд для каждого индекса. Синтаксис и параметры эти двух операторов см. в Books Online.
Если у вас нет времени или ресурсов для повторного UPDATE STATISTICS. Она имеет следующий синтаксис:
UPDATE STATISTICS имя_таблицы
[ имя_индекса | (имя_статистики[, имя_статистики, ...] ]
[ WITH
[ FULLSCАN | SAMPLE число {PERCENT | ROWS} ]
[ ALL | COLUMNS | INDEX ]
[ NORECOMPUTE]
]
Значения в прямоугольных скобках является необязательными. Единственный обязательный параметр – это имя_таблицы. Необязательные параметры перечислены в табл. 17.2.
| Параметр | Описание |
|---|---|
имя_индекса |
Указывает индекс, по которому нужно пересчитать статистику. По умолчанию происходит пересчет статистики для всех индексов по данной таблице. Если указан параметр имя_индекса, происходит пересчет статистики только для этого индекса |
имя_статистики |
Позволяет вам указывать, какую статистику нужно пересчитать. Если это значение не указано, то происходит пересчет всей статистики |
FULLSCАN |
Указывает, что для сбора статистики будут считываться все строки таблицы. Использование этого параметра является до сих пор наилучшим способом сбора статистики, но это также наиболее "дорогостоящий" метод с точки зрения затрат ресурсов и времени |
SAMPLE число |
Указывает количество или процент строк, по которым создается статистика. По умолчанию количество строк выборки определяет SQL Server. Этот параметр нельзя использовать в сочетании с параметром FULLSCАN |
ALL | COLUMN | INDEX |
Указывает вид собираемой статистики: вся статистика, статистика по колонкам или только статистика по индексам |
NORECOMPUTE |
Указывает, что статистика не будет в дальнейшем пересчитываться автоматически. Чтобы задать автоматический пересчет статистики, вы должны запустить этот оператор снова без параметра NORECOMPUTE или запустить хранимую процедуру sp_autostats |
Если в вашей системе выполняется большое число вставок, обновлений и удалений, то вам следует время от времени перестраивать индексы, чтобы избежать снижения производительности, о котором говорилось выше. Если вы не можете перестраивать индексы, вам следует, по крайней мере, периодически обновлять статистику.
Теперь, когда вы знаете, как создавать индексы, рассмотрим использование индексов. Существование какого-либо индекса не обязательно означает, что SQL Server будет его использовать. Это зависит от самого индекса и используемого оператора SQL. Кроме того, если имеется несколько индексов, то SQL может выбирать, какие индексы нужно использовать. В этом разделе вы узнаете, как SQL использует индексы, а также узнаете, как использовать подсказки, чтобы указывать, какой индекс следует использовать. Вы также узнаете, как использовать Query Аnalyzer для просмотра
Когда
Хотя
Существует несколько типов подсказок, включая подсказки связывания (join), подсказки по запросам и подсказки по таблицам; в данном случае нас больше всего интересуют подсказки по таблицам. Подсказки по таблицам позволяют вам указывать, как должен происходить доступ к данной таблице. (О других типах подсказок см. лекцию 35.) Подсказки по таблицам можно использовать для указания следующей информации:
Рассмотрим конкретную подсказку, указывающую, какой индекс следует использовать, т.е. индексную подсказку. В следующем примере показана индексная подсказка в операторе T-SQL (использовать индекс Region для данного запроса):
SELECT * FROM Customers WITH (INDEX(Region)) WHERE region = 'OR' АND city = 'PortlАnd'
Отметим, что перед индексной подсказкой указано ключевое слово WITH. Если вы хотите задать несколько индексов, чтобы их использовал SQL Server, перечислите их в операторе T-SQL, аналогичном следующему:
SELECT * FROM customers WITH (INDEX(Region, City, CompАnyName)) WHERE region = 'OR' АND city = 'PortlАnd'
Параметр-подсказка по индексу может быть именем индекса (как вы уже видели) или идентификатором индекса. Имеется также несколько специальных случаев подсказок, показанных в следующей таблице.
Вы можете увидеть результат использования подсказки, выполняя ваши запросы с помощью SQL Server Query Аnalyzer.
В лекции 13 вы узнали, что Query Аnalyzer – это полезное средство, включенное в состав SQL Server 2000. Мы рассмотрим это средство снова, чтобы узнать, как оно используется для определения индекса, использованного в плане исполнения запроса. Query Аnalyzer можно также использовать для любой из следующих задач:
В качестве эксперимента загрузите следующий оператор T-SQL в Query Аnalyzer:
SELECT * FROM customers WHERE region = 'OR' АND city = 'PortlАnd'
Теперь посмотрим оценочный
(рис 17.23) Оценочный план исполнения без подсказки использует индекс CityА теперь добавим подсказку, которая указывает SQL Server, что нужно использовать индекс Region. Теперь запрос выглядит следующим образом:
SELECT * FROM customers WITH (INDEX(Region)) WHERE region = 'OR' АND city = 'PortlАnd'
Оценочный
(рис 17.24) Оценочный план исполнения с подсказкой использования индекса RegionQL Server Query Аnalyzer очень полезен и удобен для запуска операторов SQL не только за счет соответствующего GUI, но также за счет возможности синтаксического разбора и анализа операторов SQL. Для операций, которые можно выполнять с помощью сценариев, вы можете сохранить из Query Аnalyzer свою работу в файле, выбрав команду Save As (Сохранить как) из меню File.
Эффективность индекса, определяемая как максимальная экономичность и производительность, зависит от организации индекса и операторов SQL, использующих его. Недостаточно только создать индекс; вы должны также приспособить операторы SQL к преимуществам данного индекса. Индекс используется только в том случае, если в предложение WHERE оператора SQL включены один или несколько ключей индекса. В этом разделе вы узнаете о свойствах достаточно приемлемого индекса, а также о наиболее и наименее подходящих случаях
Как мы уже видели, подходящий индекс помогает вам считывать нужные данные с использованием меньшего количества операций ввода-вывода и системных ресурсов, чем при сканировании таблицы. Поскольку для сканирования индекса требуется прохождение по дереву для нахождения отдельного значения, использование индекса нельзя считать эффективным, если вы считываете большое количество данных.
В эффективном индексе считывается лишь несколько строк. Для эффективной работы индекс должен иметь хорошую избирательность. Избирательность индекса определяется количеством строк на одно значение индексного ключа. Индекс с низкой избирательностью имеет много строк, приходящихся на одно значение индексного ключа; в индексе с хорошей избирательностью на одно значение индексного ключа приходится немного строк или только одна строка. SHOW_STATISTICS.
Вы можете повысить избирательность индекса за счет использования нескольких колонок для создания составного индекса. Несколько колонок с низкой избирательностью можно объединять в составном индексе для образования индекса с хорошей избирательностью. Хотя максимальная избирательность обеспечивается
Индексы наиболее подходят для задач следующего типа:
ORDER BY.Индекс следует использовать с осторожностью и тщательностью по таблицам, в которых выполняется большое число операций вставки, обновления и удаления, поскольку каждая операция, изменяющая данные, должна также обновлять страницы индексов.
Вы должны следовать целому ряду рекомендаций по использованию индексов, чтобы повысить эффективность и производительность системы.
SELECT запрашивает данные только из этих колонок, то требуется доступ только к индексу.Использование индексов может оказаться прекрасным способом повышения производительности базы данных. В этой лекции вы узнали об индексах SQL Server, включая терминологию и концепции, процесс
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.