Программирование баз данных MS SQL Server (1084479), страница 88
Текст из файла (страница 88)
Даже несмотря на то, что на листовом уровне отсутствуют действительные данные (вместо этого на этом уровне определены идентификаторы строк), для достижения искомых данных требуется пройти на один шаг больше по сравнению с той ситуацией, когда используется кластеризованный индекс; но поскольку в идентификаторе ЫГу содержится полная информация о местонахождении строки, то обеспечивается возможность перейти непосредственно к данным. Но из того, что при использовании некластеризованного индекса, заданного на неупорядоченной таблице, приходится, как было сказано выше, осуществлять "еще один шаг", не следует, что при его применении издержки увеличиваются лишь незначительно и что этот индекс обеспечивает почти такое же быстродействие, как кластеризованный индекс.
Еще раз отметим, что данные, на которых определен кластеризованный индекс, имеют физическое расположение, соответствующее последовательности ключей в индексе. Это означает, что при выборке данных, относящихся к определенному диапазону, достаточно лишь найти строку, в которой начинаются требуемые данные, после чего со всей вероятностью остальные искомые строки будут обнаружены на той же странице (иными словами, для достижения следующей строки почти не требуется усилий, поскольку все нужные строки хранятся вместе). С другой стороны, при использовании неупорядоченной таблице данные не являются связанными друг с другом каким-то иным способом, кроме как через индекс. Какая-либо физическая сортировка данных не осуществляется.
Это означает, что для чтения данных из неупорядоченной таблицы системе может потребоваться обращаться для выборки строк к любым участкам файла с данными. В действительности вполне возможно (и даже не подлежит сомнению), что в процессе работы для получения данных придет- Структуры памяти и индексные структуры ЯЯт Бегтег а4оа (!)!сводя с)тавнение нпласпиутизованных индексов, заданных на нгупо)зядоченнойт таблице, с клосте~изованными индексами, Ради сп)таведливостпи необходимо отметить следующее: весьма велики шансы того, что многие считанные стРаницьл будут оставаться в памяти (в кэше) и поэтому выборка других стРок, относящихся к этим страницам, будет осуществтлться иск.покительно быстро. Уем не менее и п)та таких обстпояотельствах для выбо)тки данных п)твходитпся выполнять нес!илько дополнительных логических опеРаций. На рис.
9.6 показана такая же процедура поиска, которая выполнялась с помощью кластеризованного индекса (см. рис. 9.97), но на этот раз с использованием некластернзованного индекса, заданного иа неупорядоченной таблице. ' !Теисктписов с'!66доебв : уе(п 1 53 104 . иееисюеов ( е 410 411 151501 141602 ! 1 476405 2 236205 :Лаетееря ',тротвь ) 52 ) 111903 100403 104 334205 157 236201 105 141604 412 102404 103 241905 0200 01 156 401 126003 236201 Н~сх 220701 яь!рп 220702 236202 ппп 220703 вп 236203 Кг1е 220704 236204 Топу 220701 236205 Вьпог Рис. 9.6. ПРоцедуРа поиска данньск с тюмощью некластеризованного индекстс заданного на неупо)зядоченной таблице При этом основная часть операций перемещения по индексу осуществляется точно так же, как и в предыдущем примере. Поиск начинается с того же корневого узла, после чего происходит переход вниз по уровням дерева, и в процессе этого перехода каждый раз обнаруживаются страницы, охватывающие все меньшую область представления данных, до тех пор, пока не достигается листовой уровень индекса.
Различия обнаруживаются только начиная с этого момента. Если используется кластеризованный индекс, то поиск может быть остановлен непосредственно в этом ся неоднократно считывать в разное время одну и ту же страницу, поскольку в СУБД БЯЕ бегтег нельзя предугадать, что снова придется обращаться к какому-то участку файла, так как между данными отсутствтет связь. С другой стороны, если применяется кластеризованный индекс. то система может определить, что данные хранятся в отсортированном порядке и поэтому получить сразу все необходимые дания!е в резьльтате чтения одной страницы. 350 Глава 9 месте, а при использовании некластеризованного индекса приходится выполнять дополнительную работу.
Если некластеризованный индекс задан на неупорядоченной таблице, то достаточно просто перейти на один уровень вниз. Для этого применяется идентификатор строки, полученный на странице индекса листового уровня, затем осуществляется переход к указанной строке,и только после этого достигается возможность обратиться к реальным данным. Некластеризоаанные индексы, заданные на кластеризоаанной таблице Если применяются некластеризоваиные индексы, заданные на кластеризованной таблице, то аналогии с кластеризованными индексами продолжаются, но обнаруживаются и свои различия. В некластеризованных индексах, заданных на кластеризованной таблице, так же, как и в некластеризованных индексах, заданных на неупорядоченной таблице, уровни индекса, отличные от листовых. во многом напоминают соответствующие уровни кластеризованного индекса. Различия обнаруживаются только после перехода к листовому уровню.
На листовом у(говне обнаруживаю ся мае баме Резкие различия по с(завнению с теми, которые обна(зуживолись между двумя д)ьугиии индексными структурами, поскольку в индексе Россмапфивоемого типа для поиска данных п(зименяется гиге один индекс. Н(зи использовании клоспиузизованных индексов после достижения листового уРовня обнсфуживаются дмь ствительные данные.
Если применяется некласпифизованный индекс, заданный на неупорядоченнойй пгаблице, на листовом у)ювне обна~ухсиваются не искомые данньы, а идентифика- тоР, позволяюший персйгти непгк(зедственно к данным (т.е. для достижения данных нужно сделать всего лишь егае один шаг). А что касается некластфизованного индекса, заданного на класвиушзованной табгице, то при его исяолыовании на листовом у(говне обно(зуживоется так называемый власте(зизованный ключ. Это позволяет получить достаточно инфо(ь мании для того, чтобы продолжить поиск, воспользовавшись класте)зизованным индексом, Действия, осуществляемые при использовании некластеризованных индексов, заданных на кластеризованной таблице, показаны на рис.
9.7. Таким образом, при использовании индекса рассматриваемого типа осуществляются две полностью разные процедуры поиска. В примере, приведенном на рис. 9.7, вначале осуществляется поиск в диапазоне. Для этого выполняется один просмотр индекса, что позволяет выполнить выборку данных с помощью некластеризованного индекса для обнаружения непрерывного участка данных, соответствующих применяемому критерию (УТКЕ ' Тч ' ). Просмотр такого рода, который позволяет перейти непосредственно к конкретному участку индекса, называется позиционированием (зеей). После этого начинается операция поиска второго типа — поиск с использованием кластеризованного индекса, Такая вторая операция поиска осуществляется с очень высоким быстродействием; единственная проблема заключается в том, что эта операция должна выполняться многократно.
Дело в том, что в СУБД 8ЯЕ Яегчег после осуществления первой операции поиска с помощью индекса формируется список (в котором находятся все имена, начинающиеся с буквы "Т"), но этот список логически не согласуется с кластеризованным ключом в виде каких-либо непрерывных участков, поэтому поиск каждой строки с данными должен выполняться отдельно. как показано на рис. 9.8. Структуры памяти и индексные структуры $9Е Берег 351 Рис.
9.7. Поиск дананге с немощью некластеризованного индекса, заданного на кластерное. ваннои таоелиие 352 Глава 9 Рис. 9.В. Поиск отдельных спфок с данными Структуры памяти и индексные структуры БЯУ Ьегчег ЗЫ Вполне очевидно, что в связи с необходимостью дважды выполнять поиск издержки становятся больше, чем в той ситуации, когда есть возможность использовать кластеризованный индекс с самого начала.
А для первой операции поиска с помощью индекса (в которой применяется некластеризованный индекс) обычно требуется осуществить лишь немного логических операций чтения. Например, если данные хранятся в таблице с длиной строки, равной 1000 байтов, и выполняется операция поиска, аналогичная показанной на рис. 9.8 (скажем, такая операция, которая должна возвратить 5 или б строк), то должно потребоваться примерно 8-10 логических операций чтения для получения информации из некластеризованного индекса. Но выполнение этих операций чтения позволяет лишь подготовиться к чтению строк с помощью кластеризованного индекса. На выполнение каждой такой операции поиска потребуется приблизительно 3-4 логических операций чтения, или 15-24 дополнительных операций чтения.
На первый взгляд кажется, что такое увеличение количества операций не имеет особого значения, поэтому рассмотрим эту ситуацию под другим углом зрения. Количество логических операций чтения увеличивается от минимального значения 3 до максимального значения 24, что соответствует увеличению объема работы, подлежащей выполнению, на 800%. А теперь предположим, что масштабы обработки данных выросли и диапазон значений, подлежащих выборке с помощью некластеризованного индекса, составляет не такое небольшое значение, как пять или шесть строк, а пять или шесть тысяч строк или пять или шесть сотен тысяч строк; в таком случае влияние указанных факторов на производительность становится просто колоссальным. Однако не следует придавать слишком большое значение тому, что применение посвисте)гизова нного индекса влечет за собой появление дополни тельных шдержек по сравнению с хластеризованным индексам. Соображения, шложенные в наопоящем разделе, не направлены на то, чтобы убедить читателя не использовать нехласте)зизованные индексы.
Тегг не менее следует учитывать то, что неслааперизованные индексы при осуществлении операгзий что ния харахпиризуются Ймее ншхой эффективностью по сравнению с класпмршованными индексами (правда, в некопифых случаях неклаппе)зизованные индексы могут обеспечивать баме вьиохую производительность п)зи выполнении опе)закай вставки). Кфоме того, каким бы не был индекс, обычно он является основой наиболее быстрых способов поиска (хотя ветре. чаюгася и исключения). Информация о том, какие индексы следует испольэовать в Разных обопоятельствах и по каким п)ленинам, приведена ниже. Создание, модификация и удаление индексов Операции создания, модификации и удаления индексов осуществляются во многом так же, как и применительно к другим объектам, таким как таблицы.