Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Временная таблица в курсоре  [new]
avm76
Member

Откуда:
Сообщений: 11
В хранимой процедуре есть код вида

SET @str = 'DECLARE lc_sp CURSOR FOR SELECT t1.id FROM t1 INNER JOIN #t2 ON t1.id = #t2.id WHERE ... '

EXEC sp_executesql @str
OPEN lc_sp
FETCH FROM lc_sp INTO @l_id
WHILE (@@FETCH_STATUS <>-1) BEGIN
....
FETCH FROM lc_sp INTO @l_id
END


при выполнении этой процедуры все виснет на OPEN lc_sp


если убрать join на временную таблицу #t2, то все хорошо проходит
если этот кусок выполнить в QA в виде селекта (без курсора) - то тоже запрос выполняется моментально

если БД поставить на другой сервер, то все выполняется нормально и с временной таблицей

есть какие-нибудь мысли?
1 сен 09, 09:32    [7601064]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
есть какие-нибудь мысли?


Ага!


после того, как

автор
все виснет на OPEN lc_sp


посмотреть, что творится с блокировками.

И, непонятно, зачем здесь динамика?!
1 сен 09, 09:49    [7601172]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
0) слово "виснет" непонятно
1) не вижу причины, по которой Вы использовали динамический SQL
2) не вижу причины, по которой Вы использовали курсор
1 сен 09, 09:52    [7601197]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
avm76
Member

Откуда:
Сообщений: 11
К сожалению проблема возникла у клиента - человеческого доступа туда нет. Так что посмотреть тяжело, по крайней мере в течение раб. дня. Если базу ставить на другой сервер, то проблемы нет. Тема создана в расчете на то, что кто-то может сталкивался с подобной проблемой.

На самом деле запрос сложнее и динамика там нужна - запрос изменяется в зависимости от фильтров и сортировок
1 сен 09, 09:53    [7601203]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
avm76
запрос изменяется в зависимости от фильтров и сортировок
Возможно, Вам просто еще не довелось прочесть следующие статьи:
Переменное число критериев отбора в запросе
Переменное число критериев сортировки результатов
1 сен 09, 09:56    [7601218]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
avm76
Member

Откуда:
Сообщений: 11
Паганель,

"Виснет" в данном контексте, значит что не переходит к следующему оператору. Если убрать join на временную таблицу, то все отрабатывает быстро: 1-2 секунды

Зачем dyn. sql - написал в пред. посте

Курсор нужен, потому что на самом деле это отчет с построчным выводом данных. Вот они внутри цикла и выводятся.
1 сен 09, 09:56    [7601219]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
avm76
К сожалению проблема возникла у клиента - человеческого доступа туда нет.
А какой доступ есть?
1 сен 09, 09:58    [7601238]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
avm76
Member

Откуда:
Сообщений: 11
Паганель
avm76
запрос изменяется в зависимости от фильтров и сортировок
Возможно, Вам просто еще не довелось прочесть следующие статьи:
Переменное число критериев отбора в запросе
Переменное число критериев сортировки результатов



Если честно, то мне кажется что использование дин. sql
1. удобнее
2. легче в поддержке, так как меньше текста
3. быстрее в работе
4. имеется 92 отчета написанных таким образом - переписать их нереально

Давай те все-таки вернемся к главному вопросу в теме
вопрос не в том, "почему используется дин. sql" или "давайте уберем дин. sql"
вопрос в том, почему возникает такая странность
1 сен 09, 10:02    [7601261]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
avm76
Member

Откуда:
Сообщений: 11
Паганель
avm76
К сожалению проблема возникла у клиента - человеческого доступа туда нет.
А какой доступ есть?


Есть доступ по RDP, но так как сервер live - то ставить эксперименты на нем нереально.
Можно по чуть-чуть ночью, но если это будет мешать работе, то получится совсем не ice
1 сен 09, 10:04    [7601277]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
avm76
почему возникает такая странность
могу предположить только два варианта
а) запрос не работает, а чего-то ждет
б) запрос работает, но по какой-то причине тормозит (ресурсов там не хватает, статистика старая...)
1 сен 09, 10:06    [7601285]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
avm76
так как сервер live - то ставить эксперименты на нем нереально.
не ставьте экспериментов
посмотрите что с блокировками
1 сен 09, 10:08    [7601303]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
avm76
Member

Откуда:
Сообщений: 11
Паганель
avm76
так как сервер live - то ставить эксперименты на нем нереально.
не ставьте экспериментов
посмотрите что с блокировками


Сейчас у клиента стоит правленная версия процедуры - временная таблица убрана из курсора.
Они же должны как-то работать :)

Чтобы посмотреть блокировки - нужно ставить обратно старую процедуру и ломать работоспособность программы.

Непонятно откуда растут ноги, а переписать остальные отчеты очень сложно. Вот хотелось бы понять причину, перед тем как это вылезет еще где-нибудь
1 сен 09, 10:19    [7601374]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Давайте зайдем с другой стороны

Допустим, Вы каким-то образом определили проблему и устранили ее
Вам ведь надо будет перед внедрением протестировать - действительно ли она устранена
То есть запустить старый запрос и новый (исправленный) запрос и сравнить
Но где и как Вы будете это делать?

Имхо нужен стенд
А где вы его возьмете?
Попросите у заказчика бэкап его БД?
Может, попросит сейчас?
1 сен 09, 10:28    [7601445]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
искать конкретную причину почему именно на этом сервере именно этот код вызывает затруднения на мой взгляд непродуктивно
т.е конечно может оно и найдется и сколько то времени на это можно потратить
но слишком там все запутано и кривизны там тоже хватает
(просто сталкивался я с подобным)
категорически рекомендую попробовать распрямить тут логику
лучше бы вообще избавится от динамического sql как тут уже советовали
я по первости тоже динамил но потом убедился что статический код позволяет делать то же самое
ну если не хотите то попробовать например динамикой залить результаты во временную таблицу
а потом уже назлить на нее курсор но уже без динамики
если сам курсор тормозит то можно циклом по результатам пробежаться...
1 сен 09, 10:38    [7601534]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в курсоре  [new]
aleks2
Guest
avm76
В хранимой процедуре есть код вида

SET @str = 'DECLARE lc_sp CURSOR FOR SELECT t1.id FROM t1 INNER JOIN #t2 ON t1.id = #t2.id WHERE ... '

EXEC sp_executesql @str
OPEN lc_sp
FETCH FROM lc_sp INTO @l_id
WHILE (@@FETCH_STATUS <>-1) BEGIN
....
FETCH FROM lc_sp INTO @l_id
END


при выполнении этой процедуры все виснет на OPEN lc_sp


есть какие-нибудь мысли?

Есть вопрос: а теоретически это должно работать?
Ить
Note  If neither GLOBAL or LOCAL is specified, the default is controlled by the setting of the default to local cursor database option
1 сен 09, 10:53    [7601668]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить