|
Программирование >> Программирование баз данных
связь. Достаточно отметить, что теперь появилась возможность осуществлять в СУБД SQL Server выборку данных, полученных от Web-службы, и объединять эти данные с результатами запросов к базе данных. В связи с этим открываются весьма заманчивые перспективы. Возникают буквально неограниченные возможности, но это не означает, что разработчик больше не обязан тщательно продумывать свои проектные решения, связанные с разработкой приложений. В частности, внешние вызовы по-прежнему представляют угрозу для нормального функционирования системы. Ведь любая попытка привлечь к осуществлению каких-либо действий компоненты, внешние по отношению к системе, приводит к возникновению зависимости от этих компонентов. В связи с этим необходимо очень тщательно продумывать все условия применения таких вызовов. Внепшие вызовы должны рассматриваться как крайняя мера. Применение внешних вызовов приводит к повышению риска нарушения защиты (в частности, связанного с тем, что может произойти подмена подлинного внешнего источника данных фиктивным), а также может стать причиной существенного снижения производительности. Принимая решение об использовании внешних вызовов, необходимо учитывать эти соображения. Задачи повышения производительности Выше уже были приведены некоторые общие рекомендации по повышению производительности, но, как и в отношении большинства практических вопросов, этого недостаточно, чтобы добиться реального успеха. Поэтому в настоящем разделе будет приведен своего рода краткий справочник по проблемам повышения производительности запросов. Приведенные здесь указания помогут выбрать именно такие типы запросов, которые в наибольшей степени подходят для той или другой ситуации. Мы снова сталкиваемся с одной из проблем, при рассмотрении которой необходимо подвергнуть критическому анализу сложившееся положение дел. На сей раз объектом становится непродуманное использование универсальных правил. В настоящем разделе речь идет о том, как обычно складывается процесс обработки данных. В данном контексте слово *Ъбычно становится чрезвычайно выразительным. В языке SQL, как и во многом другом, лишь немногие правила можно считать безусловно истинными. Но когда дело касается повышения производительности SQL Server, необ ходимо выбирать только такие средства языка SQL, которые надежно обеспечивают достижение поставленной цели. Иначе говоря, многое зависит от того, насколько важно добиться высокой производительности данного конкретного запроса. Если производительность действительно является решающим фактором, то не ограничивайтесь использованием лишь общепринятых правил. Руководствуйтесь ими как отправной точкой, а затем снова и снова экспериментируйте и отыскивайте все более эффективные подходы. Сравнение возможностей подзапросов, соединений и других программных средств Выше в настоящей главе уже было сказано, что автор однажды участвовал в дискуссии со своим сотрудником по поводу того, какие конструкции, подзапросы или соединения (а также, с этой точки зрения, другие программные средства) являются более приемлемыми. Взглады, высказанные обоими участниками обсуждения этого вопроса, оказались прямо противоположными. Как и следовало ожидать в таких обстоятельствах, мы оба оказались в определенной степени правы (а из этого следует, что и в какой-то степени неправы). Давно сложившаяся, традиционная точка зрения на подзапросы всегда состояла в том, что вместо них при любой возможности гораздо лучше использовать соединения. Это мнение вполне оправдано, но и из этого правила есть исключения. В действительности сравнительные преимущества и недостатки различных программных средств зависят от многих факторов. В табл. 6.2 приведены сведения о том, в каких ситуациях применяются подзапросы и соединения, и даны рекомендации по выбору наиболее рационального способа организации работы. Таблица 6.2. Рекомендации по использованию подзапросов, соединений и других операций Ситуация Рекомендуемый способ организации работы Предполагается, что значение, возвращаемое подзапросом, должно быть одинаковым для каждой строки во внешнем запросе Обе таблицы являются относительно небольшими (скажем, 10 ООО строк или меньше) После проверки всех критериев в операции сравнения должно быть возвращено только одно значение После проверки всех критериев в операции сравнения должно быть возвращено относительно немного значений; на столбце поиска не задан индекс Рекомендуется предварительное выполнение запроса. Объявить переменную, а затем осуществить выборку необходимого значения в эту переменную. Это позволяет выполнить предполагаемый подзапрос только единожды, а не столько раз, сколько имеется строк во внешней таблице. В СУБД SQL Server предусмотрен достаточно мощный оптимизатор, который способен распознать ситуацию, благоприятствующую применению предварительного запроса, и автоматически подготовить такой предварительный запрос, но рассчитывать только на это не следует. Разработчику самому следует подготавливать предварительный запрос, если будет обнаружена такая необходимость, поскольку лишь в этом случае можно достичь полной уверенности в правильности работы приложения Рекомендуется применение подзапросов. Точные причины мне неизвестны, но я сам неоднократно проверял эту рекомендацию, и в каждом случае она в значительной степени оправдывалась. По-видимому, поиск требует меньших издержек по сравнению с соединением, если все данные, в которых осуществляется поиск, помещаются всего лишь на одной или двух страницах данных Рекомендуется применение подзапросов. И в этом случае гораздо меньше издержек требует поиск только одной строки и подстановка соответствующего ей значения, чем выполнение соединения по всей таблице Рекомендуется применение подзапросов. Поиск по одному или даже по нескольким столбцам обычно требует меньших затрат ресурсов, чем хешированное соединение Окончание табл. 6.2 Ситуация Рекомендуемый способ организации работы Поисковая таблица является относительно небольшой, но базовая таблица велика Выбор между связанным подзапросом и соединением Выбор между производными таблицами и другими программными средствами Выбор между операторами exists и другими программными средствами По возможности следует применять вложенные подзапросы; в ином случае соединения являются более предпочтительными, чем связанные подзапросы. При использовании подзапросов поиск осуществляется только единожды, а издержки относительно малы. С другой стороны, при использовании связанных подзапросов поиск многократно повторяется в цикле. При указанных обстоятельствах наилучшим вариантом чаще всего становится соединение Рекомендуется применение соединения. По существу, при выполнении связанного подзапроса создается вложенный цикл. Это может повлечь за собой непроизводительное расходование весьма значительных ресурсов. В большинстве ситуаций соединения обеспечивают гораздо более высокое быстродействие по сравнению с курсорами, но все равно остаются менее производительными по сравнению с другими возможными способами обработки данных Применение производных таблиц обычно влечет за собой значительное повышение издержек, поэтому, предпринимая попытку организовать с их помощью обработку данных, необходимо действовать осмотрительно. Следует помнить, что создание (или, так сказать, производство ) подобных таблиц осуществляется лишь единожды, после чего производные таблицы хранятся в памяти. Это означает, что основная часть издержек обусловлена первоначальными затратами на создание таблиц и отсутствием индексов даже на очень крупных результирующих наборах. Вообще говоря, применение производных таблиц может способствовать либо понижению, либо повышению производительности; это зависит от конкретных условий. Таким образом, прежде чем приступить к созданию основанного на них программного обеспечения, необходимо тщательно обдумать все обстоятельства Рекомендуется применение операторов exists. Операторы exists позволяют прекратить поиск после обнаружения первого же значения, соответствующего критерию поиска, и в случае необходимости перейти к выполнению следующей операции поиска. Это способствует значительному сокращению издержек В табл. 6.2 приведены лишь самые основные рекомендации. Количество возможных ситуаций и соответствующих им способов организации работы является практически бесконечным. Невозможно переоценить важность следующей рекомендации: при малертшем сомнении предусматривать достаточно полную проверку и сопоставление всех возможных решений предстоящей задачи, особенно если производительность является решающим фактором. Разумеется, чаще всего универсальные правила вполне оправдываются, но так бывает не всегда. Только тщательная проверка выбранного решения позволяет убедиться в его правильности.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |