ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Статические курсорыКурсоры
Одним из характерных свойств реляционных баз данных является то, что действия выполняются над множествами строк. Курсор представляет собой объект, который указывает на определённую строку во множестве. Множество строк, на которое указывает курсор, определяется с помощью команды SELECT. Существуют два типа курсоров: курсоры Transact SQL и курсоры API (курсоры программного интерфейса приложения). Мы будем изучать курсоры Transact SQL. Курсоры создаются с помощью команды DECLARE CURSOR. Рассмотрим три основные характеристики курсоров: § способность отражать изменения в исходных данных (чувствительность), § способность осуществлять прокрутку во множестве строк (как вперёд, так и назад или только вперёд), § способность модифицировать множество строк (возможность обновления строк или «только для чтения»). Transact SQL поддерживает 4 типа курсоров: § статические. Делается как бы моментальный снимок данных, задаваемых оператором SELECT, которые хранятся в базе данных tempdb. Такие курсоры «не чувствуют» изменений в структуре или в значениях данных. § ключевые. В базу данных tempdb копируются только те столбцы, которые уникально идентифицируют каждую строку. § динамические. Они ведут себя так, как если бы при каждом обращении к строке повторно выполнялся оператор SELECT. § курсоры быстрого доступа или «пожарные». Это специальная оптимизированная форма непрокручиваемого курсора, допускающая только чтение. Статические курсоры При открытии статического курсора (static cursor), или, как его еще называют, курсора моментального снимка (snapshot cursor), сервер выполняет соответствующий запрос и сохраняет полученный набор данных в системной базе данных tempdb. Таким образом, в распоряжении пользователя получается копия данных, с которой можно работать посредством курсора. Следствием такого подхода является то, что набор данных в статическом курсоре не изменяется. Если другие пользователи в исходной таблице будут изменять данные, включенные в курсор, эти изменения не будут отражаться в статическом курсоре. Строки данных могут быть даже удалены, но и это никак не отразится в статическом курсоре. Пользователь даже не получит сообщения о внесенных изменениях. Кроме того, в курсоре никак не будут отражены строки, добавленные после его открытия, даже если они удовлетворяют критериям выборки, используемым для наполнения курсора. Итак, статические курсоры никак не связаны с исходными данными. Поэтому при работе со статическими курсорами нельзя выполнять изменение исходных данных. Это связано еще и с тем, что нет гарантии в существовании и неизменности строк данных, на основе которых построен курсор. Поэтому статический курсор всегда открывается в режиме «только для чтения». Как уже было сказано, все данные статического курсора сохраняются в системной базе данных tempdb. Поэтому при интенсивном использовании курсоров этого типа, особенно если они содержат большие объемы данных, следует позаботиться о наличии достаточного количества свободного пространства в базе данных tempdb. Следует быть внимательным при разработке хранимых процедур (триггеров, функций и т. д.), работающих со статическими курсорами. В целях избежания переполнения базы данных tempdb следует освобождать курсоры сразу же после того, как они станут ненужными, а не дожидаться автоматического освобождения и удаления курсора после завершения работы хранимой процедуры (триггера, функции и т. д.).
Ключевые курсоры Курсоры, зависящие от набора ключей (Keyset-driven Cursors), или ключевые курсоры, построены на основе использования уникальных идентификаторов. Множество всех уникальных идентификаторов (ключей) исходных строк таблиц называется набором ключей (keyset). Ключевой курсор представляет собой набор ключей, идентифицирующих строки результирующего набора курсора. В качестве ключа выбирается набор столбцов, уникально идентифицирующий строку исходной таблицы. Если в таблице определен первичный ключ, то он и будет использоваться при работе с ключевыми курсорами. Тем не менее, при отсутствии в таблице первичного ключа сервер может использовать и другие столбцы. ВНИМАНИЕ Если таблица, на основе которой строится ключевой курсор, не содержит ключевых значений, которые могли быть использованы для идентификации строк таблицы, то сервер выполняет неявное преобразование типа курсора. В итоге будет создан не ключевой курсор, а статический. Ключевым значением может стать первичный ключ, уникальный индекс или столбец (столбцы), для которого установлено ограничение целостности UNIQUE. Таким образом, физически ключевой курсор представляет собой набор ссылок на исходные строки, сохраненных в определенной последовательности. Когда пользователь обращается к какой-то строке курсора, сервер считывает из набора ключей соответствующее ключевое значение, находит с помощью него нужную строку в исходной таблице, считывает из нее необходимые данные и возвращает их пользователю. Как и при работе со статическими курсорами, для хранения данных ключевого курсора используется системная база данных tempdb. Отметим, что объем хранимой в этой базе данных информации для ключевых курсоров в общем случае значительно меньше, чем для статических. Сервер блокирует строки исходных таблиц только на время составления таблицы ключей. СОВЕТ Можно добиться повышения производительности работы ключевого курсора за счет использования в таблицах первичных ключей небольшой длины. После открытия курсора сервер больше не обновляет набор ключей. Следствием этого является то, что часть строк, на которые имеется ссылка в наборе ключей, могут быть недоступны вследствие их удаления из исходной таблицы или изменения значений в ключевых столбцах. Такие строки будут помечаться как поврежденные (row missing). Кроме того, в ключевом курсоре не будут отображаться строки, удовлетворяющие критериям выборки, но вставленные в исходные таблицы после открытия курсора. Тем не менее, в ключевых курсорах будут отображаться изменения всех неключевых полей исходных таблиц. Ключевые курсоры могут быть использованы для изменения и удаления данных в исходных таблицах.
Не нашли, что искали? Воспользуйтесь поиском:
|