Программирование баз данных MS SQL Server (1084479), страница 93
Текст из файла (страница 93)
А в некоторых обстоятельствах лучше всего ограничиться созданием индексов с учетом требований поддержки транзакций, наиболее важных для прикладной системы, в которых используется рассматриваемая таблица. При этом необходимо учитывать, имеется ли в коде транзакции конструкция ымеее, какой столбец (столбцы) в ней используется, и требуется ли сортировка. Определение условий применения кластеризованного индекса Следует учитывать, что на таблице может быть задан только один кластеризованный индекс, поэтому выбирать его нужно очень тщательно. По умолчанию во время создания кластеризованного индекса создается также первичный ключ.
Чаще всего такое сочетание определений кластеризованного индекса и первичного ключа является наиболее приемлемым, но так бывает не всегда (а в некоторых случаях реализация такого решения может привести к заметному снижению производительности). Если в подобных ситуациях не будут проведены определенные действия, то окажется, что кластеризованный индекс больше нельзя применить для каких-либо других целей. В этом случае лучше всего отказаться от использования решения, предусмотренного по умолчанию.
Иными словами, следует исходить из того, какой первичный ключ является наиболее приемлемым, и оценить, действительно ли он должен быть создан на основе кластеризованного индекса. Если будет обнаружено, что должен быть действительно принят другой подход, иначе говоря, если будет определено, что первичный ключ не должен быть задан на кластеризованной таблице, достаточно ввести ключевое слово МОМСЬЕЯТЕЕЕ0 при создании таблицы, например, следующим образом; СВЕДХЕ тдВЬЕ Мутаь1ехеуххаяр1е ( СоХпяп2 РпСХПЕМтттХ РЕХмдех кех момсьзятевеп, Со1птп2 Рпп ) После создания индекса единственный способ внести в него изменения состоит в том, чтобы удалить его и снова сформировать, поэтому необходимо стремиться к тому, чтобы можно бьио с самого начала правильно задать используемый индекс.
Следует учитывать, что после внесения изменений в столбец (столбцы), на котором определен кластеризованный индекс, в СУБД Я~(. Бегхег может потребоваться выполнение полной пересортировки всей таблицы (напомним, что при использовании кластеризованного индекса порядок сортировки строк таблицы н расположения строк кластеризованного индекса являются одинаковыми). Итак, если предположить, что кластеризованный индекс задан на таблице, которая состоит из строк длиной 5000 символов и включает в себя миллион строк, то становится очевидно, что иногда объем данных, требующих переупорядочения, становится колоссальным.
В связи с этим необходимо найти ответ на несколько приведенных ниже вопросов. Структуры памяти и индексные структуры за. Яегчег 367 11 Много ли времени потребуется для переупорядочения данных в таблице? Для выполнения этой операции может потребоваться много времени, но удобный способ оценки затрат времени на выполнение указанной операции фактически отсутствует. 0 Имеется ли достаточный объем свободного пространства? Следует учитывать, что для переупорядочения таблицы с кластеризованным индексом в среднем требуется дополнительный объем, превышающий в 1,2 раза объем пространства, которое в настоящее время занимает таблица (при этом учитывается необходимость распределения рабочего пространства и нового индекса). Поэтому, если обрабатывается очень большая таблица, то может потребоваться весьма существенный объем дополнительного пространства, поэтому нужно будет подготовить место для его распределения.
Между прочим, все названные операции осуществляются в самой базе данных, поэтому возможность переупорядочения любой кластеризованной таблицы определяется тем, какие значения опций максимального размера и роста заданы для базы данных. 0 Следует ли использовать опцию ЯОВТ 1Н ТЕМРРВ? Если предусмотрено размещение базы данных сежрсй> на физическом жестком диске, отличном от того, где находится основная база данных, и на этом жестком диске имеется достаточный объем пространства, то ответ на этот вопрос, по-видимому, должен быть положительным. Преимущества кластеризованны|к индексов Кластеризованные индексы целесообразно задавать на таких таблицах, в которых рассматриваемый столбец (столбцы) часто применяется в таких запросах, которые охватывают целый ряд строк.
Отличительной особенностью подобных запросов является то, что в них используются операции ВЕТХЕЕВ или операции сравнения < и >. Характерными примерами запросов, в которых осуществляется доступ к целому ряду строк, поэтому для их выполнения хорошо подходят кластеризованные индексы, являются такие запросы, в которых применяются конструкции ОВООР ВХ и агрегирующие функции МАХ, м1н и ОООНТ. Кластеризация способствует успешному выполнению этих запросов, поскольку обеспечивается возможность начать поиск с определенной строки в составе хранимых данных, затем продолжать чтение до тех пор, пока остаются в силе условия, по которым должна быть выполнена выборка данных, а после этого прекратить обработку данных. Такая организация доступа к данным является чрезвычайно эффективной.
Кроме того, кластеризованные индексы обеспечивают исключительно высокую производительность, если данные должны быть получены в отсортированном виде с помощью конструкции ОВОЕВ ВХ, в которой используется кластеризованный ключ. Недостатки кластеризованных индексов Создание кластеризованного индекса на каком-то определенном столбце (столбцах) может стать нецелесообразным по двум описанным ниже причинам.
Основная причина вполне очевидна — наличие лучшего места для его использования. Необходимо еще раз отметить, что не следует задавать кластеризованный индекс на том или ином столбце лишь потому, что такое решение на первый взгляд кажется целесообразным (практика показывает, что чаще всего без раздумий принимают решение о 368 Глава 9 создании кластеризованного индекса на столбце первичного ключа). Следует вначале убедиться в том, что действительно выбран наиболее подходящий столбец. Но, по-видимому, гораздо более серьезной причиной отказа от использования кластеризованных индексов является перспектива того, что в таблице будет применяться большое количество таких операций вставки, в которых строки не заданы последовательно.
Напомним, что при этом повышается вероятность возникновения разбиений страниц, а выполнение таких операций связано со значительными затратами времени. Рассмотрим описанную ниже ситуацию. Предположим, что ведется разработка системы бухгалтерского учета и принято решение использовать номер транзакции (термин тВаязакиия в данном контексте обозначает ряд взаимосвязанных бухгалтерских операций) в качестве первичного ключа в таблице учета транзакций.
Тем не менее в процессе разработки системы обнаруживается, что желательно было бы предусмотреть включение в номера транзакций каких-либо обозначений, позволяющих узнать, к какой категории относится транзакция (к тому же применение таких обозначений может существенно помочь бухгалтерам, эксплуатирующим систему, при выявлении ошибок). Поэтому разработчик вносит предложение — вводить во все номера транзакций префикс, указывающий, к какой подсистеме относится данная транзакция. В конечном итоге номера транзакций принимают примерно такой внд, где ХХХХХХ представляет собой последовательное числовое значение: Аосоппгз Весе1уаЫе Тгапзасгзопз Оепега1 Ьеедег Тгапзаопзопз Аосоппгз Рауао1е Тгапзаог1опз АРХХХХХХ ОЬХХХХХХ АРХХХХХХ Разработчик находит эту идею великолепной и приступает к ее реализации,не пересматривая применяемую по умолчанию опцию, согласно которой кластеризованный индекс задается на первичном ключе.
На первый взгляд решение о применении ключа с указанной структурой кажется вполне приемлемым. Все строки в таблице будут обозначаться уникальными ключами, а бухгалтеры смогут с успехом использовать возможность извлекать дополнительную информацию из номера транзакции. Кроме того, кажется приемлемым кластеризованный индекс, поскольку он позволяет успешно выполнять часто применяемые запросы. в которых предусмотрена обработка ряда последовательных значений номеров транзакций. В действительности применение указанной структуры номеров транзакций приводит отнюдь не к таким благоприятным последствиям.
Достаточно лишь рассмотреть, как будут выполняться операции вставки. Кластеризованный индекс с самого начала предназначается для использования в качестве превосходного механизма, позволяющего избежать возникновения основной части издержек, связанных с разбиением страниц. Ведь если вставка новой строки должна осуществляться так, что ее место расположения будет находиться вслед за последней строкой в таблице. то дюкс в случае разбиения страницы на новую страницу должна переходить единственная, вновь вставляемая строка, поэтому в СУБД БЯ). Бегуег не приходится осуществлять какие- либо попытки перемещения существующих данных.
Но при использовании указанной организации данных возникает иная картина. Новые строки, относящиеся к главной книге (Сепега! (.ес1~ег — С1.), действительно будут записываться вслед за последней строкой таблицы (поскольку префикс С1. занимает после сортировки по алфавиту последнее место в списке префиксов, а но- Структуры памяти и индексные структуры ЯЯЕ Ьегчег оо69 мера транзакций возрастают последовательно).
Но при вводе данных, относящихся к транзакциям типа АК и АР, возникают серьезные проблемы, поскольку нарушается последовательный порядок вставки. После перехода к выполнению, допустим, операции вставки данных по транзакции с ключом АР000025, в СУБД 5Ог. Яегчег обнаруживается, что на соответствующей странице недостаточно места, после чего СУБД находит в таблице строку с ключом АК000001 и определяет, что операция вставки не является последовательной. Прежде чем появится возможность выполнить операцию вставки данных с ключом АР000025, необходимо скопировать половину строк со старой страницы на новую страницу. Возникающие при этом издержки могут оказаться колоссальными.