Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Отличие между курсорами сервера и клиента

В SQL Server доступны два типа курсоров: курсоры клиента (front-end or client cursors) и курсоры сервера (back-end or server cursors).Существующее между ними отличие имеет важное значение.

При написании приложения очень часто появляется необходимость выполнить определенную операцию на наборе данных. Для этого обычно применяется инструкция Update при изменении данных или инструкция Delete при удалении данных. Эти операции с наборами данных обычно обеспечивают высокую гибкость в приложениях, где предложение where может соответствующим образом определить требуемую задачу.

Предположим, что в базе данных Pubs вы хотите изменить почтовый индекс на 94024 для всех авторов, которые живут в Menlo Park. Для этого можно применить простую инструкцию Update, показанную ниже:

Update AUTORS

Set ZIP = '94024'

Where City = 'Menlo Park'

Go

C другой стороны, что если необходимо выполнить различные виды операций па наборе данных? Возможны два решения: можно выполнить множество операций на эксклюзивных наборах или можно получить полный набор данных и на основании величин в этом наборе выполнить требуемые операции. Второе решение является концепцией, лежащей в основе обработки с помощью курсора.

Обновлений и удалений наборов данных на сервере может быть недостаточно, так как обновления могут производиться в одной и той же строке несколько раз. В качестве альтернативы в базе данных может быть создан вид, называемый курсором.

Наибольшее преимущество обработки с помощью курсора состоит в возможности выполнить условные операции на определенной строке данных в наборе, независимо от других строк этого набора. Команды SQL выполняются на наборе данных, состоящем из одной строки. Сложные приложения часто требуют подобной детализации при обработке. Кроме того, эта детализация имеет несколько положительных моментов:

*  Производительность. Операции, основанные на наборах данных тяготеют к применению больших серверных ресурсов, чем операции курсора.

*  Лучший контроль транзакций. При обработке набора данных можно контролировать, что происходит с любой данной строкой независимо от других.

*  Специальный синтаксис. Курсоры позволяют позиционированное обновление и удаление, которые применяются к строкам, выбранным в данный момент. Такие курсоры напрямую находят строки таблицы, поэтому исчезает необходимость индексирования.

*  Эффективность. При выполнении нескольких операций на большом наборе данных, таком как вызов множества хранимых процедур, лучше, когда база данных обрабатывает данные и выполняет все действия с каждой строкой. Это более эффективно, чем выполнение каждой из задач последовательно по всему набору данных. Причины эффективности заключаются в кэшировании данных.

 

Понятие курсора клиента

Перед тем как был создан SQL Server 6.0, разработчики Microsoft пришли к выводу, что клиентам необходимо предоставить возможность обрабатывать данные и передвижение вперед и назад по результирующему набору. Пользователи нуждались в этих функциях для поддержки комплексных приложений, которые использовались при просмотре информации, выбранной из базы данных.

Корпорация Microsoft не могла включить в SQL Server более ранних версий курсоры сервера, которые поддерживают некоторые другие производители, поэтому было принято решение смоделировать некоторые из функций курсора в интерфейсе программирования клиентских приложений для базы данных SQL Server – DBLibrary.

 Корпорация Microsoft унаследовала интерфейс клиента DBLibrary, позволяющий взаимодействие с базой данных SQL Server, от Sybase. DBLibrary – это набор команд и функций, которыми можно пользоваться в среде языка программирования С для выполнения операций с базой данных. В SQL Server 6.0 и в последующих версиях разработчики Microsoft изменили интерфейс DBLibrary к базе данных на интерфейс ODBC.

Для получения подобной функциональности разработчики Microsoft добавили курсоры к наборам данных на стороне клиента.

Эти курсоры работают с помощью DВLibrary позволяющей обычное взаимодействие с базами данных: считывание информации из потока данных таблицы (Tabular Data Stream, TDS) выполняется настолько быстро, насколько требует клиент. TDS – это метод связи применяемый DBLibrary для выборки информации из базы данных. Обычно DBLibrary передает всю информацию, которая была выбрана из базы данных, приложению клиента, которое, в свою очередь, выполняет дополнительную работу. С помощью курсоров DBLibrary кэширует эти записи сама, до того, как клиент не отменит просмотр данных с помощью курсора.

Подобное кэширование имеет несколько ограничений:

*  SQL Server не обладает средством контроля или минимизирования блокировок, устанавливаемых в базе данных. Поэтому в курсоре блокировки устанавливаются на все страницы данных, а не только на те, где выполняется обновление. Это происходит потому, что SQL Server не может установить, какие еще операции, помимо инструкций select, выполняются в базе данных.

*  При работе с большими наборами данных, кэширование может очень быстро поглотить ресурсы на стороне клиента.

*  При обработке больших объемов данных кэширование неэффективно, так как все данные, участвующие в обработке, пересылаются по сети.

До момента, пока корпорация Microsoft не разработала курсоры сервера, это средство SQL Server оставалось чисто декларативным и не было предназначено для серьезного применения. Курсоры сервера обладают всеми преимуществами курсоров клиентов, но лишены характерных для них накладных расходов и ограничений. Помимо соображений обратной совместимости, других веских причин применения курсоров клиентов в приложениях SQL Server 6.5 не существует.

Применение курсоров сервера включает в себя пять состояний, описанных ниже:

 

Состояние Объяснение
DECLARE На этом этапе SQL Server проверяет, верный курсор выберет нужные для запроса данные. SQL Server создает в памяти разделяемую структуру, содержащую определение курсора, необходимое для компиляции на этапе open.
OPEN SQL Server начинает отвечать на выполнение инструкции declare. Он распознает запрос и заносит идентификаторы строк во временную рабочую область, которая будет использоваться клиентом при считывании идентифицируемых курсором строк.
FETCH В этом состоянии курсор возвращает данные, необходимые для выполнения любой требуемой операции.
CLOSE SQL Server закрывает открытый ранее курсор и освобождает любые блокировки, которые могли быть установлены в результате его открытия.
DEALLOCATE SQL Server освобождает разделяемую память, используемую инструкцией declare, не позволяя больше другим процессам выполнять инструкцию open.

 

Для работы с курсорами SQL Server необходимо следовать состояниям, описанным выше. Сначала необходимо объявить (declare) курсор. Затем вы можете его открыть (open) и считать данные (fetch). При считывании данных (состояние fetch) можно выполнить с активной строкой несколько операций. Завершив работу с курсором, вы должны закрыть (close) его и освободить память (deallocate). Это делается для того, чтобы SQL Server не расходовал ресурсы на управление ненужным курсором.

 

Практическое тестирование

На первый взгляд курсоры кажутся мощным средством программирования приложений. Конечно, они предоставляют приложениям развитую функциональность, предназначенную для просмотра данных. при этом устраняется необходимость в программировании подобных функций на стороне клиента.

Применение функций курсоров сильно сокращает время разработки приложений, но при этом сильно падает производительность системы. хотя реально производимый эффект в значительной степени зависит от конкретной реализации, включай и аппаратуру, на которой работает сервер, курсоры могут очень сильно уменьшить скорость работы приложения.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...