С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Antykus
0 / 0 / 2
Регистрация: 10.05.2014
Сообщений: 230
1

Оптимизация работы курсора

10.07.2014, 09:41. Просмотров 1008. Ответов 9
Метки нет (Все метки)

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

Создаю курсор так

SQL
1
2
3
4
5
    DECLARE c cursor 
    LOCAL 
    forward_only 
    FAST_FORWARD 
    FOR
Курсор должен идти в одном направлении и быстро. Но получается так, что памяти с каждой секунды ест всё больше и больше. Подскажите пожалуйста как правильно создать курсор в этой ситуации
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2014, 09:41
Ответы с готовыми решениями:

Оптимизация работы веб сервера и БД
Здравствуйте! Подскажите пожалуйста, вот у меня весь контент на сайте...

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

Оптимизация БД
Добрый день. Есть необходимость в оптимизации имеющейся схемы БД для учёта...

Создание курсора
Задали создать курсор, который бы открывал любой документ. Какой алгоритм...

Использование курсора
Доброго времени суток! Впервые столкнулся с курсорами и уткнулся в проблемку....

9
iap
900 / 625 / 130
Регистрация: 27.11.2009
Сообщений: 1,872
10.07.2014, 10:28 2
Цитата Сообщение от Antykus Посмотреть сообщение
Есть хранимая процедура, внутри себя запускающая последовательно пять других хранимых процедур.
Каждая из этих вложенных процедур создаёт и использует в себе курсор.
Последняя процедура самая тяжёлая, так как курсор использует данные из очень большой таблицы.
Автора этого кошмара следует вывести во внутренний двор и расстрелять!

Я серьёзно думаю, что это всё надо перепроектировать с нуля.
Обсуждать тут нечего.

Кстати, FAST_FORWARD - это и так однонаправенный курсор. Ничего другого писать не надо.
1
Начинающий
38 / 38 / 16
Регистрация: 07.08.2012
Сообщений: 187
10.07.2014, 12:06 3
А если выбрать нужные данные и занести во временную таблицу и работать уже с ними?
Все таки думаю что надо серьезно переработать базу данных, т.к. дальше будет только хуже
0
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
10.07.2014, 12:20 4
Оптимизация работы курсора обычно состоит в полном избавлении от оного. Ибо случаи, когда курсор необходим, можно пересчитать по пальцам одной руки.
Цитата Сообщение от Antykus Посмотреть сообщение
система выдаёт ошибку out of memory.
Покажите точное сообщение об ошибке. Есть подозрение, что ваш "out of memory" к серверу не относится.
0
Antykus
0 / 0 / 2
Регистрация: 10.05.2014
Сообщений: 230
10.07.2014, 13:38  [ТС] 5
Я так понял я неверным путём пошёл.
Изложу суть, для лучшего понимания.
У меня есть две таблицы, допустим А и Б.

В таблице А содержатся данные по адресным объектам, назовём эти данные чистовыми, т.к. они должны быть актуальными.
В таблице Б содержатся более свежие данные по адресным объектам.

Что я делаю: Я создаю курсор с данными из таблицы Б. И для каждой строки в таблице Б делаю проверку, есть ли такая строка в таблице А, если есть - обновляю данные, если нет - добавляю данные из таблицы Б в таблице А.

Почему шесть процедур ? - Потому что разные типы объектов. Для лучшей читаемости кода разбил на шесть разных
0
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
10.07.2014, 13:47 6
Лучший ответ Сообщение было отмечено Antykus как решение

Решение

Цитата Сообщение от Antykus Посмотреть сообщение
Что я делаю: Я создаю курсор с данными из таблицы Б. И для каждой строки в таблице Б делаю проверку, есть ли такая строка в таблице А, если есть - обновляю данные, если нет - добавляю данные из таблицы Б в таблице А.
Почему шесть процедур ? - Потому что разные типы объектов. Для лучшей читаемости кода разбил на шесть разных
Это делается одной инструкцией merge, без всяких курсоров и разбивки на кучу процедур.
1
Antykus
0 / 0 / 2
Регистрация: 10.05.2014
Сообщений: 230
10.07.2014, 13:49  [ТС] 7
Спасибо большое, буду изучать
0
NetPixie
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 21
11.07.2014, 17:26 8
<делаю проверку, есть ли такая строка в таблице А> - это же определяется конкретными полями. Назовём для примера неизменные поля ID, ID1. А поле, которое может изменяться TEXT.

Лучше избежать курсора:
1. select A.ID as ID_a, B.ID as ID_b... into ##temp_table from A full join B on A.ID = A.ID and B.ID1 = B.ID1 where A.TEXT <> B.TEXT)
2. update A set .... from ##temp_table where TEXT_A <> TEXT_B
3. insert * into A from ##temp_table where A.ID is NULL
0
Antykus
0 / 0 / 2
Регистрация: 10.05.2014
Сообщений: 230
11.07.2014, 17:29  [ТС] 9
NetPixie, спасибо, решил проблему с помощью инструкции merge
0
iap
900 / 625 / 130
Регистрация: 27.11.2009
Сообщений: 1,872
12.07.2014, 13:22 10
Цитата Сообщение от NetPixie Посмотреть сообщение
<делаю проверку, есть ли такая строка в таблице А> - это же определяется конкретными полями. Назовём для примера неизменные поля ID, ID1. А поле, которое может изменяться TEXT.

Лучше избежать курсора:
1. select A.ID as ID_a, B.ID as ID_b... into ##temp_table from A full join B on A.ID = A.ID and B.ID1 = B.ID1 where A.TEXT <> B.TEXT)
2. update A set .... from ##temp_table where TEXT_A <> TEXT_B
3. insert * into A from ##temp_table where A.ID is NULL
А если A.TEXT IS NULL, а B.TEXT IS NOT NULL или наоборот?
0
12.07.2014, 13:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2014, 13:22

Оптимизация работы с БД
Прошло 5 недель, как я перешёл на веб-разработку. У меня много вопросов...

Оптимизация работы с ТЗ
Есть две ТЗ Они, можно сказать, связаны один-к-многим При формировании...

Оптимизация Работы С Тз
Есть две ТЗ с одинаковыми колонками: Товар, Цена, День, НачО, КонО, Приход,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru