Программирование баз данных MS SQL Server (1084479), страница 87
Текст из файла (страница 87)
При этом снова извлекаются только необходимые строки. Различие между двумя способами выборки данных состоит в том, что машина выполнения запросов определяет момент достижения конца текущего искомого диапазона немного иначе, поскольку данные отсортированы. После этого может быть завершено выполнение запроса или в случае необходимости осуществлен переход к следующему диапазону определения данных. Возвратившись к тому изложению тематики запросов, которое было приведено выше в данной книге (особенно в главе 7), можно отметить, насколько отчетливо напоминают действия, выполняемые при выборке данных с помощью индекса, сам способ применения опции ЕХ1ЯТЯ.
Если в запросе задано ключевое слово ЕХ1ЯТЯ, то разрешается прекратить выполнение запроса сразу же, как только обнаруживается строка, соответствующая критериям запроса. Достигаемое благодаря этому повышение производительности при выборке данных с помощью индекса становится аналогичным или даже лучшим, чем при полном просмотре, поскольку процесс поиска данных может осуществляться по такому же принципу. Иными словами, если задано ключевое слово ЕХ1ЯТЯ, то серверу фактически дается указание, что после обнаружения хотя бы одной строки, соответствующей критериям, остальные строки не представляют больше интереса и поэтому обработка данных может быть сразу же прекращена. Но еще более значительным преимуществом использования индекса является то, что мы можем не ограничиваться ситуациями однозначного принятия решений (в которых требуется лишь определить, существует ли искомый фрагмент данных, "да" или "нет").
Иными словами, тот же подход можно применить для определения начала и конца некоторого диапазона, а возможность осуществлять выборку данных, относящихся к заданным диапазонам, предоставляет такие же препмучцества, какие достигаются при использовании индекса для поиска данных. Более того, можно осуществлять очень быстрый поиск данных (такие операции известны под названием ЯЕЕХ), а не просматривать всю таблицу. По существу, в пуедыдущем абзаце было п)зиведено сравнение вазможностей индексов и опфато)за ЕХ1БТБ, ноя не хочу ч тобы у читателя создалось впечатление, будто опеваогобЕХ1БТБ сп особен полностью заменить индексы )или наоборот).
Зти два федства обработки дан ныл не являются взаимоисключающими; индексы и опеугатоРБХ1БТБ могут использоваться совместно и часто так и используются. Речь об этих двух средствах доступа ведется в одном контекспм лить поогаиу, что индексы и оператор ЕХ1БТБ позволяют п)гинять )гпвение о том, что задание выполнено, и прекбатингь об)габотку таблицы до того, как закончится просмотр всех ст)зок таблицы. Типы индексов и переход по индексам Формально считается, что в СУБД Яь11.
Яеггег предусмотрены два типа индексов (кластеризованный и некластеризованный), но фактически индексы Я(~). Ьегчег по своему внутреннему устройству подразделяются на три различных типа, указанных ниже. ьг Кластеризованные индексы. 0 Некластеризованные индексы, которые подразделяются на следующие типы: ° некластеризованные индексы, заданные на неупоргщоченной таблице; ° некластеризованные индексы, заданные на кластеризованном индексе. Структуры памяти и индексные структуры ВЯ1. Бегтег 345 В кластеризованных и некластеризованных индексах применяются разные способы физического хранения данных. Кроме того, все три типа индексов отличаются друг от друга тем, что в них СУБД ЯО1. Яегчег по-разному осуществляет переход по В-дереву для достижения конечных данных.
Все индексы БО). Яегъег имеют страницы листового уровня и нелистовых уровней. Как уже было сказано при описании В-деревьев, листовым называется уровень, на котором хранится "ключ", идентифицирующий конкретную строку, а страницы не- листовых уровней используются в качестве указателей, направляющих к листовому уровню. Индексы создаются либо на кластеризованной таблице (таковой называется таблица, имеющая кластеризованный индекс), либо на так называемой неупорядоченной таблице (так называется таблица, не имеющая кластеризованного индекса). Кластеризоаанные таблицы Кластеризованной называется любая таблица, на которой задан кластеризованный индекс. Подробное описание кластеризованных индексов приведено далее в этой главе, но по существу применение кластеризованного индекса влечет за собой то, что данные в таблице, на которой он задан, хранятся физически в указанном порядке.
Отдельные строки в таблице однозначно идентифицируются с помощью кластеризованного ключа; так называются столбцы, которые определяют кластеризованнгай индекс. Изучение п(зиведенньгх выше данных невольно наводит на мъкль, что пРимлнениекластеРизованно индекса, не обеспечивающего уникальную идентификацию софок, может пои вести к науушению в Работе. Дело в таи, что если пласте(зизованный индекс не является уникагьным, то не можегя использоваться для однозначной идентификации строки. Решении этой пробгеиы заключается в том, что в СУБД 5ЯЬ 5егост используются некопифые механизмьь офытые от палъзоватегя. В частности, СУБД 5ДЕ 5егогт принудительно поддерживает уникальность каждого пласте(зизованного индекса, даже если он по определению не является уникальным.
К счастью, применяячъгй при этом способ нг влияет на то, как фактика ски п)зоисходит Работа с самим индексом. Пользователь по-прежнему может при желании вопавлять ст(гони с повпнфяющимися значениями индекса, а СУБД 50Ь 5егоес добавляет к ключу внутренний суффикс для обеспечения того, чтобы каждая строка имега уникальный идентификатор. Неупорядоченные таблицы Неупорядоченной таблицей называется любая таблица, на которой не задан кластеризованный индекс. При использовании таких таблиц создается уникальный идентификатор, называемый идентификатором строки (Коъв Пз — КП)). Идентификатор К1П формируется на основе использования данных об экстенте, странице и смещении строки (измеряемом в позициях от начала страницы) для данной строки. Идентификатор КП) требуется, только если отсутствует кластеризованный ключ (на таблице не задан кластеризованный индекс). Кластеризоаанные индексы Для каждой конкретной таблицы кластеризованный индекс является уникальным; на каждой таблице может быть задан только один кластеризованный индекс.
На таблице не обязательно требуется задавать кластеризованный индекс, но практика 346 Глава 9 показывает, что именно кластеризованный индекс чаще всего выбирают в качестве первого индекса самых разных таблицах по многим причинам, которые станут очевидными после изучения индексов различных типов. Отличительной особенностью кластеризованного индекса является то, что на его листовом уровне находятся действительные данные.
Иначе говоря, перед записью в таблицу данные сортируются в целях обеспечения их хранения в том физическом порядке, который определяется критериями сортировки индекса. Это означает, что после достижения листового уровня индекса поиск заканчивается, поскольку в вашем распоряжении уже находятся требуемые данные. Вставка каждой новой строки в таблицу осуществляется с учетом ее правильного физического расположения в кластеризованном индексе. При этом задача создания новых страниц решается по-разному, с учетом того, где должна быть выполнена вставка строки. В том случае, если новая строка должна быть вставлена в средней части индексной структуры, происходит обычная операция разбиения страницы.
Вторая половина строк перемещается со старой страницы на новую страницу, а новая строка записывается на новую или старую страницу, в зависимости от того, к какой из них она относится. А в том случае, если новая строка логически должна быть добавлена в конце индексной структуры, создается новая страница, но на ней записывается только новая строка (рис.
9.4). Рис. 9.4. Добавление новой сифоня в нонне индексной сжруганурм Переход по дереву Как уже было сказано, в кластеризованнгах таблицах $ЯЕ Бегсег в виде В-дерева хранятся не только индексы, но и данные. Теоретически В-деревья обеспечивают такой способ хранения данных, что под каждой ветвью дерева, исходящей из узла, всегда хранится примерно одинаковый объем информации.
На рис. 9.5 приведено графическое представление кластеризованного индекса в виде В-дерева. Структуры памяти и индексные структуры $Я1 Яегтег 347 1 53 104 410 Воь вшсе 104 вее 105 веге ' Лнетовва уровень врваетввннвт соева нтрннвну аниных 1ОЗ оееезе Рис. 9.5. 4Рагуическое нРедставление кластеРизованного индекса в виде ВдеРееа Вполне очевидно, что по своему виду В-дерево кластеризованного индекса фактически является идентичным В-деревьям более общего типа, которые рассматривались выше в данной главе.
На рис. 9.5 показано, как выполняется поиск в диапазоне значений ключа от 158 до 400 (кластеризованные индексы являются наиболее подходящими для выполнения этой операции). Для этого достаточно перейти к первой искомой строке, а затем включить в состав обрабатываемых данных все оставшиеся строки на телущей странице. То, что нам потребуется вся оставшаяся часть страницы, можно легко определить, поскольку информация из узла, находящаяся на один уровень выше, позволяет узнать, что потребуются данные из других страниц. Значения ключа в индексе представляют собой упорядоченный список, поэтому можно не сомневаться в том, что эти значения являются последовательными. Таким образом, если на следующей странице имеются строки, которые должны быть включены в область поиска, то тем более должна быть включена оставшаяся часть текущей страницы.
Поэтому мы можем приступить к обработке данных, находящихся на страницах, выявленных в процессе поиска, не задумываясь нэд тем, нужно ли проверять каждую отдельную строку. Начнем с перехода к корневому узлу. В СУБД 8Я(. 8егеег возможность найти корневой узел обеспечивается благодаря тому, что в системной таблице эуэапдехез хранится информация об этом узле. Каждому индексу, применяемому в базе данных, боответстаует одна строка 'в таблице вуэапдекез. Эта системиав таблица'входит в состав пользовательской базы данных'(а не базы данных 01аэкак). В втой таблице хранится йиформация о местонахождении"всех индексов базы данных и о том', на каких столбцах оии основаны,, Просматривая страницу, соответствующему корневому узлу, можно выяснить, какая следующая страница требует проверки (как показано на рис.
9.5, таковой является вторая страница на втором уровне). После этого процесс поиска продолжается с найденной страницы. По завершении каждого этапа поиска происходит переход ко 348 Глава 9 все более низким уровням дерева, которые охватывают все меньшие и меньшие подмножества данных. Наконец, достигается листовой уровень индекса. В рассматриваемом случае индекс является кластеризованным, поэтому переход на листовой уровень индекса равносилен также достижению требуемой строки (строк) и требуемых данных. ТФ особенность', ийастерисзеванных Нндексову к соответствии о которой полный лереход' по :индексу представляет:собой" пояймй.первход к йокгамым,даннызм" ,тшяяетоя'чрезвь)чайно, ВШКНссй, йОСКОйЬКу СПОСОботаувт ЗНаЧИтЕВЬНОМу'ПОВЫ)ОЕНИЮ,йраИЗВЕантЕЛЬНОСтИ;, йахсдЫМ,, -':фактичагскй-явйлется'етрпоемщение.п)зоизводитедьнести, 'можнй уайать, "провседтя'сравне-, ,.'ние о некяаот)еривованйымн, индексами, Разница стйй6аитси особенно кометной;-'если не'-' юиотерйзозввйный, индекс.сзовдан не осгновсе' кеастеризовайного йййрксса Некластеризоаанные индексы, заданные на неупорядоченной таблице Некластеризованные индексы, заданные на неупорядоченной таблице, во многом аналогичны кластеризованным индексам.
Тем не менее между индексами этих двух типов наблюдаются некоторые заметные различия, описанные ниже. Прежде всего, на листовом уровне некластеризованного индекса, заданного на неупорядоченной таблице, не находятся данные. Вместо этого листовой уровень применяется для получения указателя на искомые данные. Указатель представлен в форме идентификатора строки (КПЗ), который, как уже было описано выше в настоящей главе, состоит из данных об экстенте, странице и смещении строки, относящихся к конкретной строке, на которую указывает индекс.