Прерывание запроса MS SQL 2000
От: eagle_sw  
Дата: 17.03.05 13:22
Оценка:
Привет всем!

Столкнулся с весьма странной проблемой при отмене долгого запроса. Двухдневный поиск ничего не дал.

Итак, есть хранимая процедура, вызывающая хранимую процедуру на связанном сервере:

EXEC [LINKED_SERVER]...sp_test


Если при её работе в Query Analyzer'e нажать "Cancel", то запрос остаётся бесконечно "висеть" в состоянии runnable на связанном сервере.
При некотором кол-ве таких повисших запросов сервер впадет в кому...

После этого, все процедуры, которые используют связанный сервер в запросах вида

select * from main_server.test_table
inner join openquery([LINKED_SERVER],"....")"


перестают работать и в том же Query Analyzer'e выдают следующие ошибки:

1. Could not start a transaction for OLE DB provider 'SQLOLEDB'.
[OLE/DB provider returned message: Cannot create new transaction because capacity was exceeded.]

2. [OLE/DB provider returned message: Connection is busy with results for another command]

3. И ещё что-то про manual or distributed transaction.

Что это и как это побороть?

Заранее спасибо.
Re: Прерывание запроса MS SQL 2000
От: Smirnov.Anton Россия  
Дата: 17.03.05 13:48
Оценка:
Здравствуйте, eagle_sw, Вы писали:
а если попробовать закрыть окошечко?

здесь
Re[2]: Прерывание запроса MS SQL 2000
От: eagle_sw  
Дата: 17.03.05 13:58
Оценка:
Здравствуйте, Smirnov.Anton, Вы писали:

SA>а если попробовать закрыть окошечко?

Не помогает даже реконнект. Всё проходит само по истечении какого-то таймаута на сервере.
Примерно 10 минут.

SA>здесь

Ответ там не впечатляет.
Как же всё-таки грамотно грохнуть запрос так, чтобы умерло всё с ним связанное?
Re[3]: Прерывание запроса MS SQL 2000
От: Merle Австрия http://rsdn.ru
Дата: 17.03.05 14:14
Оценка:
Здравствуйте, eagle_sw, Вы писали:

_>Как же всё-таки грамотно грохнуть запрос так, чтобы умерло всё с ним связанное?

Kill { <spid — коннекта> | <UOW — распределенной транзакции> }
Вообще почитай про эту комманду, там много любопытного.
... [ RSDN@Home 1.1.4 rev 302 ]
Мы уже победили, просто это еще не так заметно...
Re[4]: Kill мне не поможет.
От: eagle_sw  
Дата: 17.03.05 14:24
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, eagle_sw, Вы писали:


_>>Как же всё-таки грамотно грохнуть запрос так, чтобы умерло всё с ним связанное?

M>Kill { <spid — коннекта> | <UOW — распределенной транзакции> }
M>Вообще почитай про эту комманду, там много любопытного.

Сабж. Пример с Query Analyzer'ом — надуманный,
воспроизводящий проблему прерывания запроса из моей программы.

Хотелось бы узнать общий подход к отмене распределённой транзакции.
Re[5]: Kill мне не поможет.
От: Merle Австрия http://rsdn.ru
Дата: 17.03.05 14:58
Оценка:
Здравствуйте, eagle_sw, Вы писали:

_>Сабж. Пример с Query Analyzer'ом — надуманный,

_>воспроизводящий проблему прерывания запроса из моей программы.
В чем проблема запустить kill из программы?
... [ RSDN@Home 1.1.4 rev 302 ]
Мы уже победили, просто это еще не так заметно...
Re[6]: Неужели это единственный способ?
От: eagle_sw  
Дата: 18.03.05 07:38
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, eagle_sw, Вы писали:


_>>Сабж. Пример с Query Analyzer'ом — надуманный,

_>>воспроизводящий проблему прерывания запроса из моей программы.
M>В чем проблема запустить kill из программы?

Это общепринятая практика?
Re[7]: Неужели это единственный способ?
От: Merle Австрия http://rsdn.ru
Дата: 18.03.05 08:14
Оценка:
Здравствуйте, eagle_sw, Вы писали:

_>Это общепринятая практика?

Общепринятая практика заключается в том, чтобы не выполнять запросов требующих отмены. То есть, скорее всего это проблема дизайна приложения, а не недостаток средств сиквела...
В крайнем случае можно настроить query governor на отмену запросов выполняющихся больше какого-то времени..
... [ RSDN@Home 1.1.4 rev 302 ]
Мы уже победили, просто это еще не так заметно...
Re[7]: Неужели это единственный способ?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.03.05 08:23
Оценка:
Здравствуйте, eagle_sw, Вы писали:

_>Это общепринятая практика?

Нет. Общепринятая практика — не прерывать запросов
... << RSDN@Home 1.1.4 beta 4 rev. 347>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Неужели это единственный способ?
От: Igor Trofimov  
Дата: 18.03.05 19:07
Оценка:
M>Общепринятая практика заключается в том, чтобы не выполнять запросов требующих отмены. То есть, скорее всего это проблема дизайна приложения, а не недостаток средств сиквела...

Да что ж это все за правила такие?! Откуда это все? Общепринятая практика — не выполнять ad-hoc запросов для анализа годичных данных?
Re[9]: Неужели это единственный способ?
От: Merle Австрия http://rsdn.ru
Дата: 19.03.05 10:20
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Да что ж это все за правила такие?!

А вот такие.

iT> Общепринятая практика — не выполнять ad-hoc запросов для анализа годичных данных?

Общепринятая практика — применять ad-hoc запросы исключительно в административных целях, а возможность анализа годичных данных закладывать в начальный дизайн систеы. Да и вообще это OLAP задача по большему счету.
... [ RSDN@Home 1.1.4 rev 303 ]
Мы уже победили, просто это еще не так заметно...
Re[10]: Неужели это единственный способ?
От: Igor Trofimov  
Дата: 19.03.05 11:04
Оценка:
iT>> Общепринятая практика — не выполнять ad-hoc запросов для анализа годичных данных?
M>Общепринятая практика — применять ad-hoc запросы исключительно в административных целях, а возможность анализа годичных данных закладывать в начальный дизайн систеы. Да и вообще это OLAP задача по большему счету.

Ну, в общем, да, конечно. Запрос на анализ годичных данных к OLTP отнести сложно. Тут не поспоришь.
И что из того?
Если это OLAP-задача — то ее не надо решать?
Никаким начальным дизайном не получится сделать так, чтобы ad-hoc запросы выполнялись быстро на произвольных объемах данных.
Re[11]: Неужели это единственный способ?
От: Merle Австрия http://rsdn.ru
Дата: 19.03.05 11:43
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Если это OLAP-задача — то ее не надо решать?

Где я такое сказал? Это значит, что решать ее надо средствами OLAP и для этого есть Analisys Servises и куча паттернов по оптимизации, и по живой базе, в любом случае, такой запрос пол-дня не выполняется, да еще так, чтобы была насущная необходиость его отменять.

iT>Никаким начальным дизайном не получится сделать так, чтобы ad-hoc запросы выполнялись быстро на произвольных объемах данных.

Стоп, давай опять разберемся с терминологией... ad-hoc запросы, в моем понимании, это запросы не предусмотренные в системе. Естественно, твое утверждение верно, но какое отношение имеют ad-hoc запросы к поднятой теме?
Автору топика требуется отменять не ad-hoc, а вполне прогнозируемые запросы, и рекомендация, соответственно, писать эти самые запросы таким образом, чтобы отменять не приходилось, что вообщем-то не rocket science, хотя, конечно, от задачи зависит...
Или опять моя категоричность не устраивает?
... [ RSDN@Home 1.1.4 rev 303 ]
Мы уже победили, просто это еще не так заметно...
Re[12]: Неужели это единственный способ?
От: Igor Trofimov  
Дата: 19.03.05 18:08
Оценка:
M>Где я такое сказал? Это значит, что решать ее надо средствами OLAP и для этого есть Analisys Servises и куча паттернов по оптимизации, и по живой базе, в любом случае, такой запрос пол-дня не выполняется, да еще так, чтобы была насущная необходиость его отменять.

Необходимость отменять естественным образом появляется из-за
а) длительности запроса
б) любой степени интерактивности
Юзер ошибся, спросил не то, что хотел и конечно, лучше запрос прервать, чем попусту грузить сервак.

Что же касается специальных OLAP-средств, то иногда требования к системе таковы, что ad-hoc запросы должны выполняться именно на живой базе — т.е. на самых последних данных. Ведь существует такая ниша как гибридные OLAP/OLTP системы.

А может быть и так, что анализа в системе очень мало, чтобы ради него разрабатывать OLAP-часть, но этот анализ есть и оптимальнее выходит производить его именно в той же базе (например, раз в месяц какие-то отчеты считаются).

Я это все к тому, что чистая OLTP-система — это очень хорошо, но на практике встречается редко.

iT>>Никаким начальным дизайном не получится сделать так, чтобы ad-hoc запросы выполнялись быстро на произвольных объемах данных.

M>Стоп, давай опять разберемся с терминологией... ad-hoc запросы, в моем понимании, это запросы не предусмотренные в системе. Естественно, твое утверждение верно, но какое отношение имеют ad-hoc запросы к поднятой теме?

Да, каюсь, это я не в ту степь ушел.
У него длинная процедура, тоже небось отчет какой-то, но, ты прав, это можно попытаться оптимизировать различными средствами.

Правда, все равно не факт, что это можно соптимизировать до такой степени, что не захочется отменять.
И вполне может оказаться, что обеспечить возможность прерывания таких длинных запросов обойдется дешевле, чем разрабатывать средства кардинального улучшения производительности этой (и, возможно, других подобных) процедуры.
Re[13]: Неужели это единственный способ?
От: Merle Австрия http://rsdn.ru
Дата: 19.03.05 20:51
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Необходимость отменять естественным образом появляется из-за

iT>а) длительности запроса
Не должно быть таких запросов, и не надо говорить, что это невозможно... Все зависит от лени разработчика и оправданности оптимизации. Если лень, всегда есть kill и QG, но "правильная" система обходится без таких запросов.

iT>б) любой степени интерактивности

Интерактивности во время запроса? Отказать...

iT>Что же касается специальных OLAP-средств, то иногда требования к системе таковы, что ad-hoc запросы должны выполняться именно на живой базе — т.е. на самых последних данных.

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

iT>Ведь существует такая ниша как гибридные OLAP/OLTP системы.

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

iT>А может быть и так, что анализа в системе очень мало, чтобы ради него разрабатывать OLAP-часть, но этот анализ есть и оптимальнее выходит производить его именно в той же базе (например, раз в месяц какие-то отчеты считаются).

Бога ради и их можно с оптимизировать так, чтобы юзер не заскучал.

iT>Я это все к тому, что чистая OLTP-система — это очень хорошо, но на практике встречается редко.

Никто не спорит, степень OLTP'шности определяется конкретной задачей.

iT>Правда, все равно не факт, что это можно соптимизировать до такой степени, что не захочется отменять.

Факт. Вопрос необходимости и затраченых усилий...

iT>И вполне может оказаться, что обеспечить возможность прерывания таких длинных запросов обойдется дешевле, чем разрабатывать средства кардинального улучшения производительности этой (и, возможно, других подобных) процедуры.

Вполне. Только вопрос-то был "как правильно" и по моему, возможно не очень скромному мнению, "правильно" с оптимизировать систему на столько, чтобы юзер до кнопки отмены дотянуться не успевал, а не придумывать способы отмены запросов. А уж на сколько такая оптимизация будет оправдана в каждом конкретном случае — совсем другой вопрос.
... [ RSDN@Home 1.1.4 rev 303 ]
Мы уже победили, просто это еще не так заметно...
Re[14]: Неужели это единственный способ?
От: Igor Trofimov  
Дата: 20.03.05 10:12
Оценка:
M>Не должно быть таких запросов, и не надо говорить, что это невозможно... Все зависит от лени разработчика и оправданности оптимизации. Если лень, всегда есть kill и QG, но "правильная" система обходится без таких запросов.
M>Ни вапрос, промежуточную агрегацию и другую оптимизацию еще никто не отменял, "самые последние" данные чудным образом высчитываются с любой необходимой скоростью, а остальное выгребается из OLAP если есть такая необходимость.

Лень тут не при чем вообще. Промежуточная аггрегация может быть малоэффективна, если возможных аналитических признаков много и заранее неизвестны группировки, которые потребуются. Объем данных за счет предварительной аггрегации по всем измерениям в этом случае может снизиться очень незначительно, а выделить только "нужные" — может не получиться.

iT>>б) любой степени интерактивности

M>Интерактивности во время запроса? Отказать...

Нет конечно, имеется в виду, что пользователь тем или иным образом задает параметры запроса, а значит, может ошибиться и понять это через секунду после нажатия на кнопку "Посчитать". Если запрос будет выполняться хотя бы пару минут, это уже повод, чтобы сделать возможность прерывания и вовсе НЕ повод, чтобы пытаться этот запрос оптимизировать в несколько раз (что может быть очень нетривиальной задачей, влекущей за собой существенную переделку базы).

iT>>А может быть и так, что анализа в системе очень мало, чтобы ради него разрабатывать OLAP-часть, но этот анализ есть и оптимальнее выходит производить его именно в той же базе (например, раз в месяц какие-то отчеты считаются).

M>Бога ради и их можно с оптимизировать так, чтобы юзер не заскучал.

Да, но сколько это будет стоить? Зачем делать мощнейшую (в разы или на порядки) оптимизацию, если можно все существующие проблемы решить проще? Замечу — сама длительность выполнения в рассматриваемом случае не является проблемой.

iT>>И вполне может оказаться, что обеспечить возможность прерывания таких длинных запросов обойдется дешевле, чем разрабатывать средства кардинального улучшения производительности этой (и, возможно, других подобных) процедуры.

M>Вполне. Только вопрос-то был "как правильно" и по моему, возможно не очень скромному мнению, "правильно" с оптимизировать систему на столько, чтобы юзер до кнопки отмены дотянуться не успевал, а не придумывать способы отмены запросов. А уж на сколько такая оптимизация будет оправдана в каждом конкретном случае — совсем другой вопрос.

Ну вот а мне кажется, что это "правильное" решение может очень дорого встать. И проблемы надо решать существующие и предполагаемые, а не надуманные.

Вот аналогия тебе: надо тебе фильм переписать с компакта на винт. И вдруг — ОБА — оштбся и перетащил файл на сетевой диск. Блиииин! Он же туда час копироваться будет. А кнопки "Отмена" — нету. Звонишь ты в M$ и происходит такой разговор:
-- Почему нельзя прервать копирование? Что за фигня?
-- Ну мы постараемся ускорить копирование на сетевой диск.
-- Нет, просто сделайте кнопку "Отмена"
-- Это неправильно, любой процесс не должен давать пользователю заскучать. Мы проведем мега-оптимизацию, файл будет предварительно в фоновом режиме сжиматься и частично копироваться во все возможные свободные места, но будет невидимым, а потом когда юзер и правда захочет скопировать — мы в десять раз быстрее отрапортуем, что все сделано.
-- Да нахрена??? Не проще будет "Отмену" сделать?
-- А мы ленивых разработчиков не держим!
-- Но тогда мне надо не в десять раз быстрее копировать, а в тысячи — он же час копируется! А я хочу за секунду отменить!
-- Ох.. Ну, оптимизацией тысечекратный рост скорости копирования все-же сделать не получится, тут специальное железо нужно, называется OLFP, Online file processing, как раз для ваших случаев — сверх-быстрой обработки файлов гигабайтного размера.
-- Да я лучше кабель выдерну сетевой!!!
-- Ну что вы.. Это грязный хакинг, всякие kill'ы... Для неквалифицированного пользователя это не подходит.
-- Ну так встройте их в систему, чтобы подходило
-- Это неправильно. И вообще, правильная система обходится без таких длинных операций, которые надо прерывать! так что будем оптимизировать!

Re[15]: Неужели это единственный способ?
От: Merle Австрия http://rsdn.ru
Дата: 20.03.05 21:58
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Лень тут не при чем вообще.

Причем-причем...

iT>Да, но сколько это будет стоить?

Да какая разница? Вопрос-то ни в стоимости, а в том, что такая система все равно будет "правильнее".

iT>Зачем делать мощнейшую (в разы или на порядки) оптимизацию,

Да ни каких порядков..

iT>Ну вот а мне кажется, что это "правильное" решение может очень дорого встать.

Еще раз, вопрос стоимости мы не рассматриваем, это отдельная тема.

iT>И проблемы надо решать существующие и предполагаемые, а не надуманные.

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

iT>Вот аналогия тебе:

Давай вот только без ложных аналогий..
... [ RSDN@Home 1.1.4 rev 303 ]
Мы уже победили, просто это еще не так заметно...
Re[8]: Неужели это единственный способ?
От: _d_m_  
Дата: 21.03.05 02:19
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, eagle_sw, Вы писали:


_>>Это общепринятая практика?

S>Нет. Общепринятая практика — не прерывать запросов

Я бы сказал не так — не писать таких запросов, которые было-бы необходимо прерывать
Re[16]: Неужели это единственный способ?
От: Igor Trofimov  
Дата: 21.03.05 19:05
Оценка:
iT>>Зачем делать мощнейшую (в разы или на порядки) оптимизацию,
M>Да ни каких порядков..

Конечно, на порядки. Если процедура час выполняется?

iT>>Ну вот а мне кажется, что это "правильное" решение может очень дорого встать.

M>Еще раз, вопрос стоимости мы не рассматриваем, это отдельная тема.

То есть ты предлагаешь делать только "правильно" не взирая на последствия в стоимости? Имхо, ты не прав. Если эта оптимизация потребует переделать половину базы, усложнит все последующие доработки в разы, приведет из-за этого к большому количеству ошибок и, в конечном счете задержит проект на полгода — ты считаешь это приемлемой ценой за "правильность"?

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

iT>>И проблемы надо решать существующие и предполагаемые, а не надуманные.

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

Проблема производительности в данном треде — самая что ни на есть надуманная.
Странные у тебя понятия об удобствах Удобнее после мега-оптимизации ждать минуту завершения никому ненужного расчета, чем за секунду отменить его кнопкой "Отмена"? По-моему это уже просто несерьзный разговор пошел.

M>Давай вот только без ложных аналогий..

Ну а все-таки? По-моему очень даже в тему. Что там самое ложное?
Re[17]: Неужели это единственный способ?
От: Merle Австрия http://rsdn.ru
Дата: 21.03.05 19:37
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Конечно, на порядки. Если процедура час выполняется?

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

iT>То есть ты предлагаешь делать только "правильно" не взирая на последствия в стоимости?

Да ну вот зануда.. Ну посмотри на вначало топика, я не предлагаю "делать правильно", я отвечаю на вопрос "как в принципе правильно", а уж как надо в конкретном случае — думаю автор разберется.

iT> Имхо, ты не прав.

Прав, имхо, разумеется.

iT>Я уж не говорю, что "правильность" эта вовсе из бронзы не отлита, а просто ты сказал "неправильно отменять запрос".

И правильно, надо заметить, сказал.

iT>Проблема производительности в данном треде — самая что ни на есть надуманная.

Какая проблема?

iT> Удобнее после мега-оптимизации ждать минуту завершения никому ненужного расчета, чем за секунду отменить его кнопкой "Отмена"?

В который раз уже говорю, после "мега-оптимизации" юзер до кнопки даже дотянуться не успеет...

iT> По-моему это уже просто несерьзный разговор пошел.

Да давно уже...

M>>Давай вот только без ложных аналогий..

iT>Ну а все-таки? По-моему очень даже в тему. Что там самое ложное?
Всё.
Во-первых это не БД задача, а во вторых, у правильного приложения либо не будет возможности перепутать диск и сеть, либо даже копирование по сети уже будет достаточно быстро, чтобы не анноить юзера, когда попадет к тому в руки.
... [ RSDN@Home 1.1.4 rev 303 ]
Мы уже победили, просто это еще не так заметно...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.