|
Программирование >> Программирование баз данных
Метод выборки данных, применяемый в СУБД SQL Server для выполнения конкретного запроса, зависит от состава доступных индексов, от того, в каких столбцах находятся требуемые данные, какого рода соединения выполняются и какие размеры имеют таблицы. Использование полного просмотра таблицы Процесс полного просмотра таблицы является довольно несложным. При осуществлении полного просмотра таблицы СУБД SQL Server начинает свою работу с физического начала таблицы, после чего считывает каждую строку таблицы. После обнаружения строк, соответствующих критериям запроса, СУБД включает эти строки в результирующий набор. Широко распространено такое мнение, что операции выборки данных с помощью полного просмотра таблицы характеризуются существенными недостатками. Такое мнение соответствует действительности. Тем не менее операции с полным просмотром таблицы могут фактически оказаться в некоторых обстоятельствах самым быстрым методом доступги Как пргшило, именно это происходит при выборке данных из относетель-но небольших таблиц. Точные данные о размерах таблицы, при которых способ выборки данных с полным просмотром становится наиболее быстродействующим, в основном зависят от размеров строк таблицы и от характерных особенностей самого запроса. Попытайтесь сами определить, почему применение оператора EXISTS в конструкции WHERE запроса оказывает такое влияние на производительность при переходе от одного способа выборки к другому. Дело в том, чтю при использовании оператора EXISTS поиск данных в СУБД SQL Server прекращается сразу после обнаружения хотя бы одной строки, соответствующей критериям поиска. Если ведется обработка таблицы, состоящей из миллихта строк, и строка, соответствующая критериям, обнаруживается на третьем месте, то использование опции EXISTS позволяет исключить необходимость чтения 999 997 строк! Опция NOT EXISTS действует в основном по такому же принципу. Использование индексов Если планировщик запросов SQL Server принимает решение об использовании индексов, то процесс выборки данных осуществляется во многом аналогично тому, как происходит полный просмотр таблицы, с учетом определенных способов сокращения. В процессе оптимизации запроса программа-оптимизатор просматривает все доступные индексы и выбирает из них наилучший (при этом в основном используется информация, заданная в операциях соединения и в конструкции WHERE, в сочетании со статистической информацией об устройстве индекса, которая ведется в СУБД SQL Server). После выбора применяемого индекса СУБД SQL Server переходит по древовидной структуре к тому узлу индекса, который указывает на данные, соответствующие установленным критериям. При этом снова извлекаются только необходимые строки. Различие между двумя способами выборки данных состоит в том, что машина выполнения запросов определяет момент достижения конца теьсущего искомого диапазона немного иначе, поскольку данные отсортированы. После этого может быть завершено выполнение запроса или в случае необходимости осутцествлен переход к следующему диапазону определения данных. Возвратившись к тому изложению тематики запросов, которое было приведено выше в данной книге (особенно в главе 6), можно отметить, насколько отчетливо напоминают действия, выполняемые при выборке данных с помощью индекса, сам способ применения опции EXISTS. Если в запросе задано ключевое слово EXISTS, то разрешается прекратить вьшолнение запроса сразу же, как только обнаруживается строка, соответствующая критериям запроса. Достигаемое благодаря этому повышение производительности при выборке данных с помощью индекса становится аналогичным или даже лучшим, чем при полном просмотре, поскольку процесс поиска данных может осуществляться по такому же принципу. Иными словами, если задано ключевое слово EXISTS, то серверу фактически дается указание, что после обнаружения хотя бы одной строки, соответствующей критериям, остальные строки не представляют больше интереса и поэтому обработка данных может быть сразу же прекращена. Но еще более значительным преимуществом использования индекса является то, что мы можем не ограничиваться ситуациями однозначного принятия решений (в которых требуется лишь определить, существует ли искомый фрагмент данных, да или нет ). Другими словами, тот же подход можно применить для определения начала и конца некоторого диапазона, а возможность осуществлять выборку данных, относящихся к заданным диапазонам, предоставляет такие же преимущества, какие достигаются при использовании индекса для поиска данных. Более того, можно осуществлять очень быстрый поиск данных (такие операции известны под названием SEEK), а не просматривать всю таблицу. По существу, в предыдущем абзаце было приведено сравнение возможностей индексов и оператора EXISTS, но я не хочу, чтобы у читателя создалось впечатление, будто оператор EXISTS способен полностью заменить индексы (или наоборот). Эти два средства обработки данных не являются взаимоисключающими; индексы и оператор EXISTS могут использоваться совместно и часто так и используются. Речь об этих двух средствах доступа ведется в одном контексте лишь потому, что индексы и оператор EXISTS позволяют принять решение о том, что задание выполнено, и прекратить обработку таблицы до того, как закончится просмотр всех строк таблицы. Типы индексов и переход по индексам Формально считается, что в СУБД SQL Server предусмотрены два типа индексов (кластеризованный и некластеризованный), но по своему внутреннему устройству индексы SQL Server подразделяются на три типа, указанных ниже. Кластеризованные индексы. Некластеризованные индексы, которые подразделяются на следующие типы: □ некластеризованные индексы, заданные на неупорядоченной таблице; □ некластеризованные индексы, заданные на кластеризованном индексе. В кластеризованных и некластеризованных индексах применяются разные способы физического хранения данных. Кроме того, все три типа индексов отличаются друг от друга тем, что в них СУБД SQL Server по-разному осуществляет переход по В дереву для достижения конечных данных. Все индексы SQL Server имеют страницы листового уровня и нелистовых уровней. 1Сак уже было сказано при описании В-деревьев, листовым называется уровень, на котором хранится ключ , идентифицирующий конкретную строку, а страницы нелистовых уровней используются в качестве указателей, направляющих поиск к листовому уровню. Индексы создаются либо на кластеризованной таблице (таковой называется таблица, имеющая кластеризованный индекс), либо на так называемой неупорядоченной таблице (так называется таблица, не имеющая кластеризованного индекса). Кластеризованной называется любая таблица, на которой задан кластеризованный индекс. Подробное описание кластеризованных индексов приведено далее в этой главе, но по существу применение кластеризованного индекса влечет за собой то, что данные в таблице, на которой он задан, хранятся физически в указанном порядке. Отдельные строки в таблице однозначно идентифицируются с помощью кластеризованного ключа; так называются столбцы, которые определяют кластеризованный индекс. Изучение приведенных выше данных невольно наводит на мысяь, что применение кластеризованного индекса, не обеспечивающего уникальную идентификацию строк, может привести к наруилению в работе. Дело в том, что если кластеризованный индекс не является уникальным, то не может использоваться для однозначной идентификации строки. Решение этой проблемы заключается в том, что в СУБД SQL Server используются некоторые механизмы, скрытые от пользователя. В частности, СУБД SQL Server принудительно поддерживает уникальность каждого кластеризованного индекса, даже если он по определению не является уникальным. К счастью, применяемый при этом способ не влияет на то, как фактически происходит работа с самим индексом. Пользователь по-прежнему может при желании вставлять строки с повторяющимися значениями индекса, а СУБД SQL Server добавляет к ключу внутренний суффикс для обеспечения того, чтобы каждая строка имела уникальный идентификатор. Неупорядоченной таблицей называется любая таблица, на которой не задан кластеризованный индекс. При использовании таких таблиц создается уникальный идентификатор, называемый идентификатором строки (Row ID- RID). РТдентификатор RID формируется на основе использования данных об экстенте, странице и смещении строки (измеряемом в позициях от начала страницы) для данной строки. Идентификатор RID требуется, только если отсутствует кластеризованный ключ (на таблице не задан кластеризованный индекс). Кластеризованные индексы Для каждой конкретной таблицы кластеризованный индекс является уникальным; на каждой таблице может быть задан только один кластеризованный индекс. На таблице не обязательно требуется задавать кластеризованный индекс, но практика показывает, что именно кластеризованный индекс чаще всего выбирают в качестве первого индекса самьгх разньгх таблицах по многим причинам, которые станут очевидными после изучения индексов различньгх типов. Отличительной особенностью кластеризованного индекса является то, что на его листовом уровне находятся действительные данные. Иначе говоря, перед записью в таблицу данные сортируются в целях обеспечения их хранения в том физическом порядке, который определяется критериями сортировки индекса. Это означает, что после достижения листового уровня индекса поиск заканчивается, поскольку в вашем распоряжении уже находятся требуемые данные. Вставка каждой новой строки в таблицу осуществляется с учетом ее йравильного физического расположения в кластеризованном индексе. При этом задача создания новых страниц решается по-разному, с учетом того, где должна быть выполнена вставка строки.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |