Программирование баз данных MS SQL Server (1084479), страница 103
Текст из файла (страница 103)
Яеггег, предназначенных для разработки и опробования кода, не допускалось в системах производственного назначения). Но после выпуска программы Я1ь Яеггег 2005 индексированные представления поддерживаются во всех версиях. Представления 405 Если представление используется в запросе, то код определения представления встраивается в код вызывающего запроса. К сожалению, это означает, что происходит значительное усложнение кода вызывающего запроса. Фактически дополнительные издержки, связанные с тем, что в СУБД приходится динамически анализировать действия, предусмотренные в представлении (и определять, на какие данные распространяются эти действия), могут становиться весьма значительными. Более того, часто обнаруживается, что операции соединения таблиц, предусмотренные в определении представления, вызывают необходимость выполнения дополнительных операций соединения таблиц в запросе.
Индексированные представления позволяют устранять причины этих недостатков заранее, еще до вызова запроса на выполнение. Индексированное представление — это такое представление, к которому относится набор уникальных значений, "материализованный" в форме кластеризованного индекса. Преимущество использования индексированных представлений состоит в том, что они обеспечивают очень быстрый поиск благодаря тому, что информация, лежащая в основе представления, уже собрана заранее. После создания на представлении первого индекса (который должен представлять собой кластеризованный индекс, сформированный на уникальном наборе значений) для СУБД ЯО1. Яегчег появляется также возможность создавать на этом представлении дополнительные индексы; при этом в качестве справочной информации используется кластеризованный ключ из первого индекса. Несмотря на то, что эти возможности весьма привлекательны, за них также приходится платить, поскольку при рассмотрении возможности создания индексов на представлениях необходимо учитывать некоторые требования, перечисленные ниже (список этих требований довольно велик).
(3 Представление должно быть создано с использованием опции БСНЕМАВ1МВ1НЯ. О Если в представлении имеется ссылка на какие-либо пользовательские функции (дополнительная информация на эту тему приведена ниже), то эти функции также должны быть связанными со схемой. ~2 Представление не должно ссылаться на какие-либо другие представления; допускается использование только ссылок на таблицы и пользовательские функции.
С) Имена всех таблиц и пользовательских функций, на которые имеется ссылка в представлении, должны быть основаны на применении соглашения об именовании, предусматривающего двухкомпонентную структуру имен, например сНза. Сизсотегэ, В111уВоЬ. ЯожеВВГ (не допускаются даже обычные трех- и четырехкомпонентные имена); кроме того, эти объекты должны иметь того же владельца, что и представление.
О Определение представления должно находиться в той же базе данных, что и все объекты, на которые имеется ссылка в представлении. С) Ко времени создания всех основополагающих таблиц самого представления опциям АНЯ1 НВЕЕЯ и СВОТЕР 1ВЕНТХГ1ЕН должно быть присвоено значение оп (с помощью команды БЕТ). 11 Все функции, на которые ссылается представление, должны быть детерминированными. 406 Г а10 Прежде чем перейти к рассмотрению примера индексированного представления, внесем некоторые изменения в объект СпяговегОгбегз чм, который был создан ранее в этой главе: АЬТЕВ ЧТЕМ Спзповегогбега чч М1ТН ЯСНЕМАВ1МОТМО АЯ ЯЕЬЕСТ сп.Сов ап Маве р у о.огбег1О, п.огбегоасе, пб.Ргпбпсп1Р, р.ргобпспнаве, об.ОпапСТГу, об.ппТСРг1се РВОМ бпо.Спаповега АЯ сп 1ММЕВ ЯО1М с]Ьо.огбега АЯ о ОМ сп.спаппвег1О = о.спзповег1О 1ММЕВ 101М бЬо.[огбег Оесаг1а] АЯ об ОМ о.огбег1О = об.огбег1О 1ММЕВ 301М бпп.Ргобпсгз АЯ р ОМ пб.Ргобпеп1О = р.Ргпбпсп1О Ниже перечислены основные изменения, на которые следует обратить внимание в этом коде.
0 Представление создается с опцией ЯСНЕВ]АВ1М01МБ. С] Чтобы иметь возможность использовать опцию ЯСНЕМАЕ1М01МС, бьы осуществлен переход к применению двухкомпонентной схемы именования всех объектов, на которые ссылается представление (в данном случае всех таблиц). Из определения представления пришлось удалить вычисленный столбец; безусловно, создание индексированных представлений с выражениями, не требующими агрегирования данных, допускается, но оптимизатор запросов их игнорирует. Но фактически выполнение этого оператора представляет собой лишь первый шаг, поскольку он еще не приводит к созданию индексированного представления. Вместо этого было получено представление, которое может быть индексировано. А когда мы приступим к созданию индексов, необходимо учитывать, что первый индекс, созданный на представлении, должен быть одновременно и кластеризованным, и уникальным: СВЕАТЕ ОМ1ООЕ СЬОЯТЕВЕО 1МРЕХ Тчспаповегогбегз ОМ Спаповегогбега чч[Соврапунаве, Огбег1О, Ргобпсп1О] После вызова на выполнение этого оператора представление становится кластеризованным.
Но к этому моменту появляется небольшая проблема, которая вскоре станет очевидной. Проверим полученное представление, применив к нему простой оператор ЯЕЬЕСТ: ЯЕЬЕСт * РВОМ Спаповегогбега чч После вызова этого оператора на выполнение из командной строки создается впечатление, что все в порядке, но при попытке сформировать графический план запроса, как показано на рис. 10.7, обнаруживается проблема (пиктограмма получения гра- Представления 407 фического плана запроса обозначается всплывающей подсказкой Рйэр1ау ЕэС1юагеб Ехеспгйоп Р1ап и находится примерно в середине панели инструментов).
'КГ с и с Бс с тцси с сь с Пю: сдсс ~ -.',) — '3 - -й сй= ч~,; ~й„,числ,ь,!".сс с с с ' ж ч ~с ч с смж с с В м с" ссь с с.с с н*с : с с Рис. 10.7. Графический план мпфоса Признаки небольшой проблемы, о которой шла речь выше, обнаруживается в графическом плане запроса, показанном на рис. 10.7. Дело в том, что ни одна часть этого плана не показывает, что в каком-либо виде используется созданный нами индекс! Но фактически эта проблема обусловлена лишь небольшими размерами применяемых нами таблиц.
Дело в том, что в базе данных Иогпвнйпй нет достаточного количества данных. Этот пример показывает, что оптимизатор находит компромисс, опредеяяя, сколько времени потребуется на выполнение первого найденного им плана, и какой объем работы должен быть им выполнен для поиска лучшего плана.
Например, имеет ли смысл затрачивать еще две секунды на составление лучшего плана, если план, который уже известен, может быть выполнен за одну секунду! В рассматриваемом примере оптимизатор СУБД БЯЬ Ьегчег рассматривает основополагающую таблицу, обнаруживает, что в ней не так уж много данных, и решает, что полученный план уже "достаточно хорош", поэтому нет смысла продолжать исследование для определения того, не будет ли более быстродействующим план, в которолс используется индекс, созданный на представлении.
Ожчеспим, что оптимизатор, принимая ртаение о том, следует ли продолжать поиск лучтего плана, учитывает количество строк в танские, рассматривая любви индекс, а не талька индекс, заданный на представлении. Если набф данных невелик, то вероятность полного игнорирования индекса оптимизатором 5ЯЕ Зеспст в пользу пфвого же обнаруженного плана становится весьма значительной.
В подобных случаях приходится нести издфжки, связанные с сопровождением индекса ~что вьфажается в замедлении вы пол нгния операторов ПЗЕЕЕт, 0РР ДтЕ и 0ЕЕЕтЕ), не получая никаких пРеимуществ в фоРме ускоРенного выполнения опеРозпфов ЕЕЕЕЕт. Тем не менее, чтобы ознакомиться с возможностями, которые предоставляют индексированные представления, создадим базу данных, имеющую достаточный объем данных для того, чтобы индекс стал более привлекательным для оптимизатора. Читатель может загрузить с сопровождающего узла книги и выполнить сценарий заполнения базы данилах, называемый сгеаседпоьоас1иогспн1пс)Вп1)с. эс)1.
408 Глава 10 Следует учитывать, что если по умолчанию выполняется зафузка того количества данных, котсфое нфедусиотРено в этом сценаРии, то длл базы данных Иог 1)) н1 и с]В и 1)с потреб)зевса онаго 55 Мбайт дискового пространства. Болеетого, омдует имеов в виду, что на выполнение этого сценария заполнения йиы данньсх может нозфебоваться значительное времгс так как с его номтаью ф<фмируются и зафужаются тысячи и тысячи стф и данных.
После этого достаточно просто снова создать представление и индекс в новой базе данных МогСЬМ1пбВи1)с, как показано ниже. ОЯЕ Могхпн1пбви11 60 СВЕАТЕ Ч1ЕИ СизсоиегОгбегз ин М1ТН ЯСНЕМАВ1МО1МО АБ БЕЬЕСТ си.Сои ап Мане р у о. Огбег10, о.Огбегоасе, об.Ргобисс10, р.ргобиссмаие, об. Оиапххи у, сб.ипхГРгхсе РВОМ бьо.сизгонегз АБ си 1ММЕВ Ю01М бЬо.Огбегз АБ о ОМ си.сизхоиег10 = о.сизхонег10 1ММЕВ З01М с]Ьо.]Огбег Оесаг1з] АЯ об ОМ о.Огбег10 = об.огбег10 1ММЕВ З01М бЬо.Ргобиссз РЯ р ОМ об.Ргобись10 = р.РгобисГ10 сВеАте ОН100е сьпзтеВеО 1мпех 1исизгоиегОгбегз ОМ СизхоиегОгбегз чн(Соарапунзие, Огбег10, Ргобис110) На этот раз повторно вызовем на выполнение первоначальный запрос, но применительно к базе данных МогспнйпбВи1ус ОБЕ Могспи1пбВи1Х БЕЬЕСТ * РВОМ СизсоиегОгбегз чн Проверим новый план запроса (рис.
10.8). гине. 10.8. План занфоса, сфо~мгфованный с ученым индекса Представления 409 На этот раз оптимизатору СУБД ЕЯ. Ьеггег приходится иметь дело с объемом данных, достаточным для более тщательного составления плана запроса. В данном случае оптимизатор принимает во внимание наличие индексированного представления, которое определено на рассматриваемой таблице. Теперь общая производительность этого представления становится намного выше (в расчете на отдельную строку) по сравнению с предыдущим вариантом его использования. Резюме Практика показывает, что во многих базах данных представления применяются либо слишком широко, либо недостаточно полно. В частности, есть такие разработчики, которые, по-видимому, стремятся оформить в виде представлений весь код доступа к базе данных (не учитывая того, что в результате происходит переход на более высокий уровень абстракции и количество промежуточных этапов доступа к данным увеличивается).
Встречаются и такие специалисты по базам данных, которые, очевидно, вообще забывают о существовании таких средств обработки данных, как представления. Сам автор считает, что представления, как и все прочие программные средства, должны применяться исключительно исходя из того, насколько они подходят для решения конкретной задачи, не в большей, не в меньшей степени. При использовании представлений необходимо учитывать приведенные ниже соображения.
С) Не рекомендуется создавать представления на основе других представлений. Вместо этого во вновь создаваемое представление необходимо включить соответствуюп~ую информацию запроса из исходного представления. П Следует помнить, что представления, в которгях используется опция Х1ТН СНЕСК ОРТ10Х, предоставляют определенные функциональные возможности, которые не могут быть реализованы с помощью обычного ограничения СНЕСК. С1 Представления, исходный код которых не должен становиться доступным для просмотра посторонними, могут быть зашифрованы. Решение о шифровании представлений обычно принимается с учетом того, имеет ли создаваемь1й программный продукт коммерческое назначение, или исходя из общих соображений обеспечения защиты информации.