Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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). Кроме того, в ключевом курсоре не будут отображаться строки, удовлетворяющие критериям выборки, но вставленные в исходные таблицы пос­ле открытия курсора. Тем не менее, в ключевых курсорах будут отображаться из­менения всех неключевых полей исходных таблиц. Ключевые курсоры могут быть использованы для изменения и удаления данных в исходных таблицах.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных