Программирование баз данных MS SQL Server (1084479), страница 89
Текст из файла (страница 89)
В данном разделе рассматривается каждая из этих операций, начиная с операции создания. Для создания индексов применяются два указанных ннлсе способа. 1д Создание индекса с помощью явно заданной команды скеАте 111гзех. О Неявное создание индекса как обязательного объекта в резулыате ввода в действие некоторого ограничения. 354 Глава 9 Каждый из указанных способов имеет свои особенности, касающиеся того, что может или не может быть осуществлено с его помощью, поэтому рассмотрим каждый из них отдельно. Оператор свжлте пюжх Оператор СВЕАТЕ 1МОЕХ осуществляет действие, полностью соответствующее его смыслу, — создает на указанной таблице или представлении индекс, основанный на заданных столбцах. Синтаксическая структура оператора создания индекса является довольно разнообразной, и в ней используются некоторые элементы, которые фактически до сих пор не рассматривались в данной книге: СВЕАТЕ [НМ1ООЕ) [СЬОЯТЕВЕП(МОМСЬОБТЕВЕО) 1МРЕХ <1паех паве> ОМ <ГаЬ1е сг о1ен паве>(<сс1пвп пате> (АяС)ОЕБС] [,...и]) 1МСЬПВЕ (<сс1пвп пате> [, ...и]) [М1ТН [РАО 1МОЕХ = ( ОМ ) ОГГ )) [[,) Г1ЬЬГАСТОВ = <Ш11асссг>) [[,) 16МОВЕ ООР КЕХ = ( ОМ ! ОГГ ]] [[,] ОВОР ЕХ1БТ1М6 = ( ОМ ! ОГГ )] [[,] ЯТАТ1БТ1СЯ МОВЕСОМРОТЕ = ( ОМ ! ОГГ )] [[,] ЯОВТ 1М ТЕМРПВ = ( ОМ ) ОГГ )] [[,] ОМ11МЕ = ( ОМ ! ОГГ [[,) А11ОИ ВОМ 1ОСКЯ = ( ОМ ! ОГГ ) [[,] АЬЬОИ РАБЕ ЬОСКБ = ( ОМ ) ОГГ ] [[,] ИАХООР = <тахгвпт с)есгее сГ рага11е11зт> ) (ОМ (<Шецгспр> 1 <рзгГЬГЬсп зспете паве> ! ОЕГАОЬТ )] В последней версии 5(~® 5егоег многие опции синтаксической конструкции операню)за создания индекса изменились, поэтому варианты, применявшиеся в предыдуших версиях, теперь рассматриваются как устаревшие тем не менее во многих разработках встречактся случаи применения устаревшего синтаксиса в целях обеспечения совместимости с предыдуозими вг)(> сиями 5ЯЬ 5егоег.
Однако уст<к>евшие варианты синтаксических консюРукций больше не поддерживаются и со временем их применение будет запртцеко, поэтому авоюр настоятельно рекомендувп п)зи любой возможности ст))емиться использовать более новый синтаксис. Дяя ЕОЯдЕНИЕ.:Ь(НдЕКСОВ.Т()цй. игр|И(яФНяв(ря Е|МЕяЕГМЧМйй СИНтахснй, Кгцррийе ТЕМ'.ИЕ:МЕНЕЕ, : имеет еущеегеемЙь)е етл))цдкж ийФюгее((ия по етой(теме приеедеее|е хенце даецесог Рездеж Вообще говоря, синтаксическая структура оператора создания индекса соответствует такому же общему образцу, СВЕАТЕ <ОЬБ есс Суре> <оЬ5 есг пате>, как и многие другие операторы создания объектов, рассматривавшиеся до сих пор (а также напоминает те операторы создания объектов, о которых еще будет идти речь в настоящей книге). Специфика оператора создания индекса состоит в том, что в нем используется несколько промежуточных параметров, которые не встречаются в других операторах.
Так же как и в операторах создания представлений, которые будут рассматриваться в следующей главе, в операторе создания индекса приходится вводить дополни- Структуры памяти и индексные структуры БЯЬ Беггег 355 тельную конструкцию с учетом того факта, что индекс в действительности не представляет собой автономный объект. Индекс относится к некоторой таблице или к некоторому представлению, поэтому должно быть указано, к какому объекту относится столбец (столбцы), на котором задан индекс, с помощью ключевого слова "ОЕ". Обязательной является только конструкция РЕ <СаЬ1е ог чйеи паве> (<со1пвп папе>), а все остальные конструкции, которые следуют за ней, являются необязательными. Элементы синтаксического определения оператора создания индекса могут применяться в самых разных сочетаниях.
Многие из этих элементов используются редко, а другие (такие как Г11РГАСТОЕ) могут оказывать существенное влияние на производительность системы и действия, осуществляемые в системе, поэтому ниже приведено последовательное описание различных опций. Опция ляс/РеБС Ключевые слова АЯС и РЕЯС позволяют указывать, должен ли применяться в индексе порядок сортировки по возрастанию или по убыванию. По умолчанию применяется ключевое слово АЯС (сокращение от азсепсйпя), которое, как и следовало ожидать, означает порядок сортировки по возрастанию. На первый взгляд может показаться, что от выбора порядка сортировки по возрастанию или по убыванию мало что зависит, поскольку СУБД БОЬ Яеггег позволяет просто выполнять просмотр в индексе в обратном порядке, если для поиска данных потребуется применение противоположного порядка сортировки.
Тем не менее на практике выбор того или иного порядка сортировки влечет за собой более важные последствия. Просмотр индекса в обратном порядке осуществляется вполне успешно, если при этом приходится рассматривать только один столбец или если во всех используемых столбцах порядок сортировки остается всегда одинаковым, а если применяется индекс, в котором разные столбцы отсортированы по-разному, то ситуация изменяется. Иными словами, дела обстоят совсем иначе, если для поиска данных требуется, чтобгя один столбец был отсортирован по возрастанию, а другой — по убыванию. Данные столбцов, включенных в состав индекса, хранятся вместе, поэтому переход к способу просмотра индекса для одного столбца в обратном порядке приводит также к изменению порядка следования данных в дополнительных столбцах на противоположный.
Если же будет явно указано, что один столбец отсортирован по возрастанию, а другой — по убыванию, после чего произойдет изменение порядка следования данных во втором столбце на противоположный непосредственно в физически хранимых данных, то внезапно исчезает сама причина, по которой следовало бы перейти к использованию другого способа доступа к данным. В качестве краткого примера рассмотрим такое задание по составлению отчета, по условиям которого необходимо упорядочить список служащих по дате найма на работу, начиная с принятого на работу в самую последнюю очередь (в порядке по убыванию), но требуется упорядочить этот список по фамилиям (в порядке по возрастанию).
При использовании предыдущих версий ЯОЬ Яеггег потребовалось бы выполнить две операции, относящиеся к первому и ко второму столбцам. А поскольку современная версия позволяет управлять порядком сортировки физически хранимых данных, обеспечивается свобода выбора способа комбинирования столбцов, применяемых в процессе обработки. Вообще говоря, обычно не рекомендуется использовать опцию АЯС/РЕЯС (поскольку и в этом случае приходится учитывать проблемы обратной совместимости). 356 Глава 9 Тем не менее ниже указаны ситуации, в которых обычно приходится отступать от этой рекомендации.
С1 Существует необходимость в использовании разных вариантов порядка сортировки по возрастанию и по убыванию в различных столбцах. С3 Проблема обеспечения обратной совместимости не является актуальной. Опция ЕНСА(ШЕ Опция 1ьгСЕУРЕ представляет собой одно из самых удобных нововведений, впервые предложенных в версии Я11. Яегчег 2005. Назначение этой опции состоит в обеспечении лучшей поддержки так называемых охваченных запросов. Опция 1ьгСЬРРЕ позволяет указывать определенные столбцы в конструкции 1ЯСРУРЕ, а не указывать их только в конструкции Рьг. В таком случае СУБД ЯЯ1.
Яегчег переносит содержимое указанных столбцов на листовой уровень индекса. Как уже было сказано, каждая строка на листовом уровне индекса соответствует строке данных, поэтому применение опции 1МСЬУРЕ по существу равнозначно перемещеншо части исходных данных на листовой уровень индекса. Безусловно, изучение возможной области применения опции 1ггСРУРЕ позволяет сделать вывод, что в действительности эту опцию имеет смысл применять только при создании некластеризованных индексов (кластеризованные индексы уже содержат данные на листовом уровне, поэтому для них нет смысла использовать рассматриваемую опцию). Преим)щдеств, которые могут быть получены при использовании опции 1ггСРУРЕ, обусловлены тем, что в СУБД ЯО). Ьегчег применяется принцип, в соответствии с которым выполнение любой текущей операции прекращается сразу после того, как фактически достигается цель этой операции (о чем еще не раз будет идти речь в настоящей книге).
Поэтому, если в СУБД ЬЯ1. Зегчег в процессе обработки индекса обнаруживается, что все необходимые данные могут быть получены без перехода к строке с действительными данными, то переход к выполнению операции чтения строки данных не выполняется (так как это бессмысленно). Включая в индекс конкретный столбец с помощью опции 1лгсеУРе, можно "охватить" тот запрос. в котором используется данный конкретный индекс на листовом уровне, и обойтись без применения для перехода к странице с данными операций ввода-вывода, связанных с использованием указателя индекса.
Сыдует учитывать, что п)еменение опции 1Л1СЬУРЕ гфиводит и к от)гицательным последствиям! Включение данных из отдельных сонибцов в индекс с помощью опции 1ИСЬУРЕ влечет зо собой увеличение )газмфов спфок индекса листового у)говня. Это вызывает умен ьшение количества софов индекса, которыеэгосут быть(газлмщены на одной ст)ганиче, поэтому для вибо)гки одного и того же количеапва ст)гок может пот)гебоватьсл выполнение большего количества опфаций ввода- вывода. В )гягулътате может ок озатьгя, что попытка ) схсфи т ь выпазнение одного загфоса пфиведет к снижению быст)годействил п)за выполнении фупгх загфосов. Поэтому необходимо выдфживать )гавновесие. Подумайпм о тан, кагсое влияние окажет п)пгменение опции 1ЛгСЬ УРЕ на все компоненты ваиий системы, а не т ольха на тот котфетный загфос, котгфыи вы ст)гелгитесь)ггализовать в текущий маненпг Опция ЛЕТН Опция и11В не требует особых пояснений, поскольку она применяется лишь для передачи СУБД КО1.