Создание и использование курсоров в СУБД MS SQL Server. Курсоры sql
НОУ ИНТУИТ | Лекция | Курсоры в Transact-SQL
Аннотация: Курсор – это особый временный объект SQL, предназначенный для использования в программах и хранимых процедурах. С его помощью можно в цикле пройти по результирующему набору строк запроса, по отдельности считывая и обрабатывая каждую его строку. В хранимых процедурах с помощью курсоров можно выполнять сложные вычисления, которые трудно выразить с помощью синтаксиса инструкции SELECT. Большой теоретический материал урока дополнен очень хорошими примерами. В частности, рассматривается применение функции CURSOR_STATUS, описание переменных @@CURSOR_ROWS и @@FETCH_STATUS, и многое другое.
Вы научитесь:
- объявлять курсор;
- открывать курсор;
- закрывать курсор;
- освобождать курсор;
- осуществлять выборку строки в переменные;
- осуществлять выборку строки по ее абсолютной позиции;
- осуществлять выборку строки по ее относительной позиции;
- выполнять позиционную модификацию;
- выполнять позиционное удаление;
- использовать глобальную переменную @@CURSOR_ROWS для определения количества строк во множестве курсора;
- использовать глобальную переменную @@FETCH_STATUS для определения результатов выполнения команды FETCH;
- использовать функцию CURSOR_STATUS для запроса статуса курсора.
Одним из характерных свойств реляционных баз данных является то, что действия выполняются над множествами строк. Множество может быть пустым, либо содержать только одну строку, но все равно оно считается множеством. Это необходимое и полезное свойство для реляционных операций, но оно порой может быть не слишком удобным для приложений.
Например, поскольку нет возможности указать на определенную строку во множестве, представление пользователю строк по одной за раз может вызвать затруднения. Даже несмотря на то, что предоставляемые Transact-SQL расширения к стандартному языку SQL позволяют реализовать гораздо большие возможности для программирования, тем не менее остаются операции, которые затруднительно, трудоемко или даже вообще невозможно выполнить на основе принципов работы с множествами.
Чтобы справиться с подобными ситуациями, в SQL предусмотрены курсоры. Курсор представляет собой объект, который указывает на определенную строку во множестве. В зависимости от сути созданного вами курсора, вы можете перемещать курсор внутри множества и модифицировать или удалять данные.
Понятие о курсорах
Microsoft SQL Server реально поддерживает два различных типа курсоров: курсоры Transact-SQL и курсоры API (курсоры программного интерфейса приложений). Курсоры API создаются внутри приложения, использующего объекты Microsoft ActiveX Data Objects (ADO), OLE DB, ODBC или DB-Library. Каждое из этих API поддерживает несколько отличающиеся функциональные возможности и использует различный синтаксис. Здесь мы не будем подробно обсуждать курсоры API; если вы планируете использовать их, обратитесь к соответствующей документации на API и языку программирования, который вы собираетесь применить.
Курсоры Transact-SQL создаются с помощью команды DECLARE CURSOR. Как объект курсора, так и множество строк, на которое он указывает, должны существовать на сервере. Подобные курсоры называются серверными курсорами. Если вы используете серверный курсор из приложения, соединенного с SQL Server через сеть, каждая операция с курсором требует двустороннего сетевого взаимодействия. Библиотеки API-курсоров, поддерживающие серверные курсоры, поддерживают также клиентский курсор, который существует в клиентской системе и кэширует строки, которые он обрабатывает на клиенте.
Множество строк, на которое указывает курсор, определяется с помощью команды SELECT. При создании курсора Transact-SQL на команду SELECT накладываются несколько ограничений:
- команда SELECT не может возвращать несколько результирующих множеств;
- команда SELECT не может содержать фразу INTO для создания новой таблицы;
- команда SELECT не может содержать фразу COMPUTE или COMPUTE BY, используемые для агрегирования результатов. (Однако, она может содержать функции агрегирования, например, AVG.)
Характеристики курсоров
Transact-SQL поддерживает несколько различных типов курсоров. Выяснение различных характеристик каждого из курсоров является довольно утомительной задачей, но ее можно облегчить, если принять во внимание для каждого типа курсора три более или менее независимых характеристики: способность отражать изменения в исходных данных, способность осуществлять прокрутку во множестве строк, а также способность модифицировать множество строк.
Отражение изменений
База данных Aromatherapy вернет четыре строки, как показано на рис. 27.1. Если в процессе использования вами курсора кто-либо добавит значение Description для элемента Bergamot, либо добавит строку для элемента Bayberry, что произойдет с множеством строк, на которое указывает ваш курсор?
При создании вашего курсора могут быть независимо определены два вида чувствительности: изменения каких строк включаются во множество (членство множества) и отражение изменений в исходных строках.
Прокрутка
Второй характеристикой курсора является способность осуществления прокрутки как вперед, так и назад, либо только вперед. Здесь имеет место извечная для программирования дилемма: скорость против гибкости. Последовательные курсоры (forward-only) работают значительно быстрее, но имеют меньшую гибкость.
Обновление
Последней характеристикой, используемой для классификации курсоров, является возможность обновления строк курсором. Опять же, курсоры "только чтение" обычно более производительны, но имеют меньшую гибкость.
www.intuit.ru
Создание и использование курсоров в СУБД MS SQL Server. — МегаЛекции
Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор – запрос к базе данных, в памяти сохраняется и строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ.
В соответствии со стандартом SQL при работе с курсорами можно выделить следующие основные действия:
- создание или объявление курсора ;
- открытие курсора, т.е. наполнение его данными, которые сохраняются в многоуровневой памяти ;
- выборка из курсора и изменение с его помощью строк данных;
- освобождение курсора, т.е. удаление курсора как объекта, поскольку его закрытие необязательно освобождает ассоциированную с ним память.
SQL Server поддерживает три вида курсоров:
- курсоры SQL применяются в основном внутри триггеров, хранимых процедур и сценариев;
- курсоры сервера действуют на сервере и реализуют программный интерфейс приложений для ODBC, OLE DB, DB_Library;
- курсоры клиента реализуются на самом клиенте. Они выбирают весь результирующий набор строк из сервера и сохраняют его локально, что позволяет ускорить операции обработки данных за счет снижения потерь времени на выполнение сетевых операций.
Управление курсором в среде MS SQL Server
Управление курсором реализуется путем выполнения следующих команд:
- DECLARE – создание или объявление курсора ;
- OPEN – открытие курсора, т.е. наполнение его данными;
- FETCH – выборка из курсора и изменение строк данных с помощью курсора;
- CLOSE – закрытие курсора ;
- DEALLOCATE – освобождение курсора, т.е. удаление курсора как объекта.
Объявление курсора
В стандарте SQL для создания курсора предусмотрена следующая команда:
::= DECLARE имя_курсора [INSENSITIVE][SCROLL] CURSOR FOR SELECT_оператор [FOR { READ_ONLY | UPDATE [OF имя_столбца[,...n]]}]При использовании ключевого слова INSENSITIVE будет создан статический курсор. Изменения данных не разрешаются, кроме того, не отображаютсяизменения, сделанные другими пользователями. Если ключевое слово INSENSITIVE отсутствует, создается динамический курсор.
При указании ключевого слова SCROLL созданный курсор можно прокручивать в любом направлении, что позволяет применять любые команды выборки. Если этот аргумент опускается, то курсор окажется последовательным, т.е. его просмотр будет возможен только в одном направлении – от начала к концу.
SELECT-оператор задает тело запроса SELECT, с помощью которого определяется результирующий набор строк курсора.
При указании аргумента FOR READ_ONLY создается курсор "только для чтения", и никакие модификации данных не разрешаются. Он отличается отстатического, хотя последний также не позволяет менять данные. В качестве курсора "только для чтения" может быть объявлен динамический курсор, что позволит отображать изменения, сделанные другим пользователем.
Создание курсора с аргументом FOR UPDATE позволяет выполнять в курсоре изменение данных либо в указанных столбцах, либо, при отсутствии аргумента OF имя_столбца, во всех столбцах.
В среде MS SQL Server принят следующий синтаксис команды создания курсора:
::= DECLARE имя_курсора CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING] FOR SELECT_оператор [FOR UPDATE [OF имя_столбца[,...n]]]При использовании ключевого слова LOCAL будет создан локальный курсор, который виден только в пределах создавшего его пакета, триггера, хранимой процедуры или пользовательской функции. По завершении работы пакета, триггера, процедуры или функции курсор неявно уничтожается. Чтобы передать содержимое курсора за пределы создавшей его конструкции, необходимо присвоить его параметру аргумент OUTPUT.
Если указано ключевое слово GLOBAL, создается глобальный курсор ; он существует до закрытия текущего соединения.
При указании FORWARD_ONLY создается последовательный курсор ; выборку данных можно осуществлять только в направлении от первой строки к последней.
При указании SCROLL создается прокручиваемый курсор ; обращаться к данным можно в любом порядке и в любом направлении.
При указании STATIC создается статический курсор.
При указании KEYSET создается ключевой курсор.
При указании DYNAMIC создается динамический курсор.
Если для курсора READ_ONLY указать аргумент FAST_FORWARD, то созданный курсор будет оптимизирован для быстрого доступа к данным. Этот аргумент не может быть использован совместно с аргументами FORWARD_ONLY и OPTIMISTIC.
В курсоре, созданном с указанием аргумента OPTIMISTIC, запрещается изменение и удаление строк, которые были изменены после открытия курсора.
При указании аргумента TYPE_WARNING сервер будет информировать пользователя о неявном изменении типа курсора, если он несовместим с запросомSELECT.
Открытие курсора
Для открытия курсора и наполнения его данными из указанного при создании курсора запроса SELECT используется следующая команда:
OPEN {{[GLOBAL]имя_курсора } |@имя_переменной_курсора}После открытия курсора происходит выполнение связанного с ним оператора SELECT, выходные данные которого сохраняются в многоуровневой памяти.
Выборка данных из курсора
Сразу после открытия курсора можно выбрать его содержимое (результат выполнения соответствующего запроса) посредством следующей команды:
FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE {номер_строки | @переменная_номера_строки} | RELATIVE {номер_строки | @переменная_номера_строки}] FROM ]{{[GLOBAL ]имя_курсора }| @имя_переменной_курсора } [INTO @имя_переменной [,...n]]При указании FIRST будет возвращена самая первая строка полного результирующего набора курсора, которая становится текущей строкой.
При указании LAST возвращается самая последняя строка курсора. Она же становится текущей строкой.
При указании NEXT возвращается строка, находящаяся в полном результирующем наборе сразу же после текущей. Теперь она становится текущей. По умолчанию команда FETCH использует именно этот способ выборки строк.
Ключевое слово PRIOR возвращает строку, находящуюся перед текущей. Она и становится текущей.
Аргумент ABSOLUTE {номер_строки | @переменная_номера_строки} возвращает строку по ее абсолютному порядковому номеру в полном результирующем наборе курсора. Номер строки можно задать с помощью константы или как имя переменной, в которой хранится номер строки. Переменная должна иметь целочисленный тип данных. Указываются как положительные, так и отрицательные значения. При указании положительного значения строка отсчитывается от начала набора, отрицательного – от конца. Выбранная строка становится текущей. Если указано нулевое значение, строка не возвращается.
Аргумент RELATIVE {кол_строки | @переменная_кол_строки} возвращает строку, находящуюся через указанное количество строк после текущей. Если указать отрицательное значение числа строк, то будет возвращена строка, находящаяся за указанное количество строк перед текущей. При указании нулевого значения возвратится текущая строка. Возвращенная строка становится текущей.
Чтобы открыть глобальный курсор, перед его именем требуется указать ключевое слово GLOBAL. Имя курсора также может быть указано с помощью переменной.
В конструкции INTO @имя_переменной [,...n] задается список переменных, в которых будут сохранены соответствующие значения столбцов возвращаемой строки. Порядок указания переменных должен соответствовать порядку столбцов в курсоре, а тип данных переменной – типу данных в столбце курсора. Если конструкция INTO не указана, то поведение команды FETCH будет напоминать поведение команды SELECT – данные выводятся на экран.
Рекомендуемые страницы:
Воспользуйтесь поиском по сайту:
megalektsii.ru
sql - Быстрые курсоры SQL Server
Чтобы ответить на оригинальные вопросы Майл...
Ускоренная перемотка вперед, только чтение, статические курсоры (ласково называемые "курсором пожарного шланга" ), как правило, такие же быстрые или быстрые, как эквивалентная таблица Temp и цикл While, поскольку такой указатель представляет собой не что иное, как таблицу Temp и Хотя цикл, который был оптимизирован немного за кулисами.
Чтобы добавить к тому, что Эрик З. Борода опубликовал в этой теме и далее ответить на вопрос...
"Все разговоры о том, что не используют курсоры, действительно об избегании использования курсоров, когда доступны основанные на наборе подходы, и использование обновляемые курсоры и т.д."
Да. За очень немногими исключениями требуется меньше времени и меньше кода для написания правильного кода на основе набора, чтобы делать то же самое, что и большинство курсоров, и имеет дополнительное преимущество при использовании гораздо меньшего количества ресурсов и обычно выполняется намного быстрее, чем курсор или цикл While. Вообще говоря, и за исключением некоторых административных задач, их действительно следует избегать в пользу правильно написанного кода на основе набора. Конечно, есть исключения для каждого "правила", но, в случае курсоров, петель и других форм RBAR, большинство людей могут считать исключения одной рукой, не используя все пальцы.; -)
Там также понятие "Скрытый RBAR". Это код, который выглядит на основе набора, но на самом деле его нет. Этот тип кода на основе набора является причиной того, что некоторые люди используют методы RBAR и говорят, что они "ОК". Например, решение текущей общей проблемы с использованием агрегированного (SUM) коррелированного подзапроса с неравенством в нем для построения текущей суммы на самом деле не основано на моей книге. Вместо этого он RBAR на стероидах, потому что для каждой вычисленной строки он должен многократно "касаться" многих других строк со скоростью N * (N + 1)/2. Это известно как "Треугольная регистрация" и по крайней мере вдвое хуже, чем полный Cartesian Join (Cross Join или "Square Join" ).
Хотя MS сделала некоторые улучшения в работе курсоров с SQL Server 2005, термин "Fast Cursor" по-прежнему является оксюмороном по сравнению с правильно написанным кодом на основе набора. Это справедливо и в Oracle. Я работал с Oracle в течение 3 лет в прошлом, но моя работа заключалась в том, чтобы улучшить производительность существующего кода. Большинство действительно существенных улучшений было реализовано, когда я преобразовал курсоры в код на основе набора. Многие задания, которые раньше выполнялись от 4 до 8 часов, сокращались до минут, а иногда и секунд.
qaru.site
Курсоры (Cursors)
Курсор – это средство извлечения данных из базы данных Oracle. Курсоры содержат определения столбцов и объектов (таблиц, представлений и т.п.) из которых будут извлекаться данные, а также набор критериев, определяющих какие именно строки должны быть выбраны.
Пользователю доступны следующие способы выполнения запроса к базе данных:
- Неявные курсоры - простой оператор SELECT ... INTO извлекает одну строку данных непосредственно в переменные локальной программы. Это удобный (и часто наиболее эффективный) способ доступа к данным, использование которого, однако, может приводить к необходимости повторного кодирования оператора SELECT (или похожих операторов) в нескольких местах программы.
- Явные курсоры - вы можете явно объявить курсов в разделе объявлений (локального блока или пакета). В этом случае курсор можно будет открывать и извлекать данные в одной или нескольких программах, причем возможности контроля будут шире, чем при использовании неявных курсоров.
- Курсорные переменные - дополнительный уровень гибкости обеспечивают курсорные переменные (объявленные на основе типа REF CURSOR), которые позволяют передавать указатель на результирующее множество, полученное по запросу из одной программы в другую. Любая программа, имеющая доступ к такой переменной, сможет открывать и закрывать курсор, а также выбирать из него данные.
- Курсорные выражения - появившиеся в версии Oracle 9i выражения CURSOR преобразуют оператор SELECT в указатель (типа REF CURSOR) на результирующее множество и могут использоваться в сочетании с табличными функциями для повышения прозводительности приложений.
Сравнение явных и неявных курсоров
В PL/SQL неявные курсоры – это курсоры, которые определяются в момент выполнения.
DECLARE V_date DATE; BEGIN SELECT order_date INTO v_date FROM orders WHERE order_number = 100; END;Явный курсор – это курсор, который определяется до начала выполнения.
DECLARE CURSOR curs_get_od IS SELECT order_date FROM orders WHERE order_number = 100; V_date DATE; BEGIN OPEN cure_get_od; FETCH curs_get_od INTO v_date; CLOSE curs_get_od; END;Ключевое преимущество явного курсора заключается в наличии у него атрибутов, облегчающих применение условных операторов.
Типичные операции над запросами
Для исполнения оператора SQL внутри программы PL/SQL выполняет одни и те же операции для всех типов курсоров. В одних случаях PL/SQL выполняет их автоматически, а в других (для явных курсоров) программисту необходимо написать соответствующий код.
- Синтаксический анализ - первым этапом обработки оператора SQL является его синтаксический анализ, который проводится для проверки корректности оператора и определения плана его выполнения.
- Связывание - это сопоставление значений из вашей программы (хост-переменных) заполнителям используемого оператора SQL. Для статического SQL такое связывание выполняет само ядро PL/SQL. Для динамического SQL программист, если он планирует использовать переменные связывания, должен явно запросить выполнение этой операции.
- Открытие - при открытии курсора, переменные связывания используются для определения результирующего множества команды SQL. Указатель активной (текущей) строки устанавливается на первой строке. В некоторых случаях явное открытие курсора не требуется; ядро PL/SQL само выполняет эту операцию (например, для неявных курсоров или встроенного динамического SQL).
- Исполнение - на этапе исполнения оператор выполняется внутри ядра SQL.
- Выборка - при выполнении запроса команда FETCH извлекает следующую строку из результирующего множества курсора. При каждой выборке PL/SQL передвигает курсор вреперд на одну строку по результирующему множеству. При работе с явными курсорами следует помнить, что в случае, когда строк для извлечения больше нет, FETCH ничего не делает (не инициирует исключение).
- Закрытие - на этом этапе курсор закрывается, освобождается используемая им память. После закрытия курсор уже не содержит результирующее множество. В некоторых случаях явное закрытие курсора не требуется, ядро PL/SQL само выполняет эту операцию (например, для неявных курсоров или встроенного динамического SQL
Повторное использование курсоров
Скомпилированная версия курсора может использоваться повторно во избежание расходов на разбор и повторную компиляцию.
Полный и частичный разбор
Процесс компиляции нового курсора называется полным разбором. Упрощенно данный процесс может быть представлен четырьмя этапами:
- Проверка – курсор проверяется на соответствие синтаксическим правилам SQL, также проверяются объекты (таблицы и столбцы), на которые он ссылается.
- Компиляция – курсор компилируется в исполняемый код и загружается в разделяемый пул сервера баз данных. Для определения местоположения курсора в разделяемом пуле используется его адрес.
- Вычисление плана выполнения – оптимизатор по стоимости (cost-based optimizer - CBO) Oracle определяет наилучший для данного курсора план выполнения и присоединяет его к курсору.
- Вычисление хеша – ASCII-значения всех символов курсора складываются и передаются в функцию хеширования. Эта функция рассчитывает значение, по которому курсор легко может быть найден при повторном обращении. Данное значение называется хеш-значением курсора.
Чтобы определить, может ли планируемый к выполнению курсор воспользоваться уже скомпилированной версией из разделяемого пула, Oracle применяет сложный алгоритм.
- 1 Рассчитать сумму ASCII – значений всех символов курсора ( исключая переменные связывания).
- 2 Применить алгоритм хеширования к полученной сумме.
- 3 Проверить наличие в разделяемом пуле курсора с таким же значением хеша.
- 4 Если такой курсор найден, он может быть исползован повторнож.
plsql.ru
Иллюстрированный самоучитель по SQL для начинающих › Курсоры [страница - 192] | Самоучители по программированию
Курсоры
В этой главе…
- Определение области действия курсора в операторе declare
- Открытие курсора
- Построчная выборка данных
- Закрытие курсора
SQL отличается от большинства наиболее популярных языков программирования тем, что в нем операции производятся одновременно с данными всех строк таблицы, в то время как процедурные языки обрабатывают данные построчно. Благодаря использованию курсоров в SQL становится возможным выводить, обновлять или же удалять выбранную строку в один прием, упрощая совместное использование SQL с другими языками программирования.
По существу, курсор является указателем на определенную строку таблицы. С его помощью можно вывести, обновить или удалить строку, на которую он ссылается.
Курсоры незаменимы, если требуется выбрать строки из таблицы, проверить их содержимое, а также выполнить различные операции на основании содержимого полей. Одного только SQL в данном случае недостаточно. С помощью SQL можно извлекать строки, однако для принятия решений на основе содержимого полей лучше использовать процедурные языки. Курсоры позволяют SQL по одной извлекать строки из таблицы и передавать их в процедурный код для обработки. Поместив код SQL в цикл, можно строка за строкой полностью обработать всю таблицу.
В случае использования встроенного SQL в общем все выглядит так:
EXEC SQL DECLARE CURSOR выражение EXEC SQL OPEN выражение Проверка достижения конца таблицы Программный код Начало цикла Программный код EXEC SQL FETCH Программный код Проверка достижения конца таблицы Конец цикла EXEC SQL CLOSE выражение Программный кодВ приведенном фрагменте кода командами SQL являются: DECLARE (объявить), OPEN (открыть), FETCH (вызвать) и CLOSE (закрыть). Каждая из этих команд детально рассматривается в этой главе.
Совет:Если для выполнения операций с выбранными строками можно обойтись обычными операторами SQL, лучше так и сделать. Используйте для построчной обработки базовый язык лишь в том случае, если обычный SQL не позволяет выполнить необходимые операции.
Объявление курсора
Чтобы использовать курсор, необходимо сначала объявить о его существовании СУБД. Это делается с помощью оператора DECLARE CURSOR. Фактически она не инициирует никакого действия, а только объявляет имя курсора для СУБД и определяет запрос, с которым будет работать курсор. Синтаксис оператора DECLARE CURSOR имеет следующий вид:
DECLARE имя_курсора [<чувствительность>] [<перемещаемость>] CURSOR [<состояние_фиксации>] [<возвращаемость>] FOR выражение_запроса [ORDER BY порядок_сортировки] [FOR разрешение_обновления];Примечание:имя курсора однозначно определяет курсор, следовательно, оно должно отличаться от любого другого имени курсора в модуле или программе.
Чтобы код был удобочитаемым, курсор следует назвать мнемонически, т.е. чтобы из названия следовало, для чего он предназначен. Название курсора должно быть связано либо с данными, определенными в запросе, либо с операциями, которые с этими данными выполняет программный код.
Совет:Чувствительность курсора может быть установлена в состояние SENSITIVE, INSENSITIVE или ASENSITIVE. Перемещаемость курсора может быть в состоянии SCROLL (с прокруткой) или NO SCROLL (без прокрутки). Состояние фиксации курсора может быть либо WITH HOLD (с фиксацией), либо WITHOUT HOLD (без фиксации), а возвращаемость – WITH RETURN (с возвратом) либо WITHOUT RETURN (без возврата).
samoychiteli.ru
sql - Почему люди так ненавидят SQL-курсоры?
"Накладные расходы" с курсорами являются лишь частью API. Курсоры - это то, как части СУРБД работают под капотом. Часто CREATE TABLE и INSERT имеют операторы SELECT, а реализация - очевидная внутренняя реализация курсора.
Использование высокоуровневых "операторов на основе набора" объединяет результаты курсора в единый результирующий набор, что означает меньше API назад и вперед.
Курсоры предшествуют современным языкам, которые предоставляют первоклассные коллекции. Старые C, COBOL, Fortran и т.д. Должны обрабатывать строки по одному, потому что не было понятия "коллекция", которое можно было бы широко использовать. Java, С#, Python и т.д. Имеют первоклассные структуры списков, которые содержат результирующие наборы.
Медленный выпуск
В некоторых кругах реляционные объединения являются загадкой, и люди пишут вложенные курсоры, а не простое соединение. Я видел действительно эпические вложенные операции цикла, написанные как много-много курсоров. Преодоление оптимизации РСУБД. И работает очень медленно.
Простые SQL переписывают, чтобы заменить вложенные петли курсора на объединения, а один, плоский курсорный цикл может сделать программы за 100 раз. [Они думали, что я бог оптимизации. Все, что я сделал, это заменить вложенные петли на объединения. Все еще используемые курсоры.]
Эта путаница часто приводит к обвинительному заключению. Однако это не курсор, это неправильное использование курсора, что проблема.
Проблема с размером
Для действительно эпических наборов результатов (т.е. демпинга таблицы в файл), курсоры необходимы. Операции, основанные на наборе, не могут материализовать действительно большие результирующие наборы как единый набор в памяти.
Альтернативы
Я стараюсь как можно больше использовать слой ORM. Но это имеет две цели. Во-первых, курсоры управляются компонентом ORM. Во-вторых, SQL отделяется от приложения в файле конфигурации. Это не то, что курсоры плохие. Это то, что кодирование всех тех, кто открывается, закрывает и выбирает, не является программированием с добавлением стоимости.
qaru.site
Курсоры (SQL Server Compact)
Запрошенная вами тема показана ниже. Однако эта тема не включена в библиотеку.
Эта документация перемещена в архив и не поддерживается.
Разработчики приложений обычно используют для управления данными преимущества самой природы SQL, основанной на связях (множествах). Однако в ряде случаев разработчикам приложений необходимо дополнительное управление построчными операциями. Для решения этой задачи подходят курсоры. В Microsoft SQL Server Compact 4.0 имеются различные типы курсоров, которые можно использовать для управления операциями, выполняемыми построчно.
Большинство курсоров можно использовать вместе с обработчиком запросов. Существуют различные поведения курсоров, такие как возможность прокрутки, обновления, а также чувствительность, что тоже влияет на выбор курсора. Дополнительные сведения см. в разделе «Поведения курсоров» в электронной документации SQL Server.
Среди преимуществ использования курсоров вместе с обработчиком запросов можно выделить следующие.
-
Эффективность. Оптимизатор запросов автоматически выбирает надлежащий план запросов, поэтому разработчику не нужно придумывать сложный алгоритм для доступа к запрашиваемым данным.
-
Адаптируемость. По мере добавления или удаления изменений данных либо индексов оптимизатор запросов автоматически адаптирует поведение курсоров с помощью альтернативных планов.
-
Меньшее количество ошибок. Разработчику больше не требуется обрабатывать данные и алгоритмы в приложении, поскольку необходимые операции поддерживаются в собственном коде компонента SQL Server Compact 4.0Database Engine.
Для запроса курсора в SQL Server Compact 4.0 достаточно функций интерфейсов API.
msdn.microsoft.com