Курсор - это инструмент, который позволяет перебирать записи в наборе.Он имеет понятия порядка и текущей записи .
Как правило, SQL
работает с мультимножествами: это наборы возможных повторяющихся записей в произвольном порядке, принимаемые какцелое.
Скажем, этот запрос:
SELECT *
FROM a
JOIN b
ON b.a = a.id
, работает на мультимножествах a
и b
.
Ничто в этом запросе не делает никаких предположений опорядок записей, как они хранятся, в каком порядке к ним следует обращаться и т. д.
Это позволяет абстрагироваться от деталей реализации и позволить системе попытаться выбрать наилучший из возможных алгоритмов для выполнения этого запроса.
Однако после того, как вы преобразовали все свои данные, в конечном итоге вам нужно будет получить доступ к записям упорядоченным образом и один за другим.
Вам все равно, насколько точны записителефонная книга хранится на жестком диске, но принтер требует их подачи в алфавитном порядке;и теги форматирования должны применяться к каждой записи в отдельности.
Именно здесь вступают в игру курсоры.Каждый раз, когда вы обрабатываете набор результатов на стороне клиента, вы используете курсор.Вы не получаете мегабайты несортированных данных с сервера: вы просто получаете крошечную переменную: дескриптор набора результатов и просто пишете что-то вроде этого:
while (!rs.EOF) {
process(rs);
rs.moveNext();
}
Это курсор, который реализует все это для вас.
Это, конечно, касается взаимодействия базы данных с клиентом.
Что касается самой базы данных: внутри базы данных, вам редко нужны курсоры, поскольку, как я уже говорил выше,почти все преобразования данных могут быть реализованы с помощью операций над множествами более эффективно.
Однако есть исключения:
- Аналитические операции в
SQL Server
реализованы очень плохо,Кумулятивная сумма, например, может быть вычислена с помощью курсора гораздо эффективнее, чем при использовании операций на основе набора - Обработка данных в виде фрагментов .Существуют случаи, когда операция на основе набора должна последовательно применяться к части набора, и результаты каждого блока должны фиксироваться независимо.Хотя все еще возможно сделать это с помощью операций на основе множеств, курсор часто является более предпочтительным способом сделать это.
- Рекурсия в системах, которые не поддерживают его изначально.
Вы также можете прочитать эту статью: