Как работает база данных «курсор»? - PullRequest
13 голосов
/ 18 февраля 2011

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

Я предполагаю, что база данных выполняет что-то вроде:

  1. Запускает запрос.
  2. Готовит результат, сохраняет его в оперативной памяти?
  3. Возвращает курсор для результата клиенту.

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

Однако я не уверен, действительно ли это правильно.Одна вещь, которая вводит меня в заблуждение, заключается в том, что если клиент базы данных и сервер базы данных находятся на разных узлах и обмениваются данными через сеть, разве это не медленно?Действительно ли он использует такой ленивый подход?Имеет смысл не возвращать все данные, но есть ли какой-то промежуточный путь, который требуется?

Ответы [ 2 ]

9 голосов
/ 18 февраля 2011

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

Предполагается вызвать в воображении изображение курсора в текстовом редакторе. Это (в некоторых контекстах) заполнитель для того места, где указатель (курсор) находится в данном наборе данных. Строка (то есть строка) возвращается с помощью cursor.fetchone (), и курсор перемещается к началу следующей строки / строки.

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

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

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

4 голосов
/ 18 февраля 2011

База данных отправляет полный набор результатов за один раз.Курсор / итератор находится в драйвере на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...