Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
Hi
Есть много отчетов, построенных как вызовы хранимок, которые заполняют отчетные таблицы, которые далее обрабатываются генераторами отчетов.
Но при задании разных входных данных хранимки могут выполнятся от нескольких секунд до нескольких часов (например,
интервалы дат - за день или за несколько месяцев - от даты к дате).
Какие есть хорошие приемы показа на клиентах прогресса выполнения хранимок?
Клиенты на Delphi и Java. То есть какие есть приемы возврата-передачи на клиенты данных из хранимок в процессе выполнения?
2 дек 11, 19:00    [11698587]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
AlexandrPlus
То есть какие есть приемы возврата-передачи на клиенты данных из хранимок в процессе выполнения?
1. select
2. print
3. raiserror с уровнем меньше 10
4. таблица лога
5. таблица лога, запись через CLR (если внутри процедур транзакции)
3 дек 11, 00:07    [11700006]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Павел-П
Guest
AlexandrPlus,

Хм. Интересный вопрос.
Ну вообще-то когда вы выполняете хранимую процедуру - вы просто запрашиваете информацию у сервера.
И никакой информации по тому, когда сервер закончит выполнять процедуру - назад вы не получите.
Вам даже сервер не скажет, что 10% процедуры выполнилось. :-)

Так что даже и не знаю, что тут можно придумать.
3 дек 11, 00:25    [11700044]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
alexeyvg
AlexandrPlus
То есть какие есть приемы возврата-передачи на клиенты данных из хранимок в процессе выполнения?
1. select
2. print
3. raiserror с уровнем меньше 10
4. таблица лога
5. таблица лога, запись через CLR (если внутри процедур транзакции)


через raiseerror Oracle 8 на PL/SQL получалось, но в T-SQL хранимка завершается же

вот через таблицу типа лога пробую - ну параллелный поток на клиенте и в разlockанную временную таблицу и ...
но что первый изобрел такое что ли? url-ов на статейки нет?
5 дек 11, 06:51    [11704490]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
Павел-П
AlexandrPlus,

Хм. Интересный вопрос.
Ну вообще-то когда вы выполняете хранимую процедуру - вы просто запрашиваете информацию у сервера.
И никакой информации по тому, когда сервер закончит выполнять процедуру - назад вы не получите.
Вам даже сервер не скажет, что 10% процедуры выполнилось. :-)

Так что даже и не знаю, что тут можно придумать.


ну вообще ИМХО каждый лабает к своим тяжелым отчетам какой-то свой велосипед по вопросу

не может быть, чтобы проектировшики СУБД ни о чем таком не думали - ОЧЕНЬ ВАЖНО ЖЕ - бодают меня уже не по одному проекту, в которых отчеты тяжелые лабал - сделай-сделай такое - СКОЛЬКО ЖДАТЬ ЕЩЁ ИЛИ НЕ ЖДАТЬ ВООБЩЕ (вдруг зависло, зациклилось что-то, дидлоки неожиданные - сервер обошел, но клиенты ждут и верят, ...)
5 дек 11, 06:57    [11704494]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexandrPlus
через raiseerror Oracle 8 на PL/SQL получалось, но в T-SQL хранимка завершается же

С чего вдруг "raiserror с уровнем меньше 10" завершает процедура ?
5 дек 11, 09:50    [11704838]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
проходящий.
Guest
AlexandrPlus
не может быть, чтобы проектировшики СУБД ни о чем таком не думали
Конечно же думали. И потому ничего торомозящего выполнение серверного кода не стали лепить. А обзение с клиентом, в том числе и вычмсление каких -то там процентов - торомоза.
- ОЧЕНЬ ВАЖНО ЖЕ
Важно для кого? Для клиента? У него для этого есть таймауты. Сервер тут пир чем?
- бодают меня уже не по одному проекту, в которых отчеты тяжелые лабал - сделай-сделай такое - СКОЛЬКО ЖДАТЬ ЕЩЁ ИЛИ НЕ ЖДАТЬ ВООБЩЕ (вдруг зависло, зациклилось что-то, дидлоки неожиданные - сервер обошел, но клиенты ждут и верят, ...)
Интересно, как Вы себе представляете предварительное определение времени на выполнение запроса до момента исполнения этого запроса?
5 дек 11, 09:52    [11704851]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexandrPlus
СКОЛЬКО ЖДАТЬ ЕЩЁ ИЛИ НЕ ЖДАТЬ ВООБЩЕ (вдруг зависло, зациклилось что-то, дидлоки неожиданные - сервер обошел, но клиенты ждут и верят, ...)

при дидлоках один из коннектов будет прерван автоматически
При простых блокировках пишут мониторинг, отслеживающий время ожидания. И оповещают прежде всего админа
5 дек 11, 09:56    [11704863]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
AlexandrPlus
но в T-SQL хранимка завершается же
не завершается
AlexandrPlus
но что первый изобрел такое что ли?
Да просто стандартно, со стороны сервера это невозможно сделать.

Сервер ведь не знает логику работы вашей программы, как это можно предугадать?

Все равно, что в ворде писать прогноз, сколько ещё осталось писать статью :-)

То есть вопрос не в стандартных средствах прогноза, а в возможностях сервера передавать информационные сообщения, а дальше уже работа разработчика системы. А эти возможности как раз есть, и самое нативное здесь - информационные сообщения клиенту.
5 дек 11, 10:07    [11704923]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
AlexandrPlus
Какие есть хорошие приемы показа на клиентах прогресса выполнения хранимок?
Клиенты на Delphi и Java.
Я выполняю хранимки в асинхронном режиме, а вместо ProgressBar`a, крутится gif-рисунок.

Время выполнение самой ХП на ProgressBar правильно отобразить нельзя, а вот процесс передачи строк на клиента можно.
Событие OnFetchProgress event.
Пример от Borland`a:
procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  Caption := 'Percent complete: ' +
    IntToStr(Trunc(Progress / MaxProgress * 100)) + '%';
  Application.ProcessMessages;
end;
5 дек 11, 11:06    [11705339]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
alexeyvg
AlexandrPlus
но в T-SQL хранимка завершается же
не завершается
AlexandrPlus
но что первый изобрел такое что ли?
Да просто стандартно, со стороны сервера это невозможно сделать.

Сервер ведь не знает логику работы вашей программы, как это можно предугадать?

и самое нативное здесь - информационные сообщения клиенту.


хранимку можно модифицировать
Вопрос что и как, чтобы на клиенте ловить
5 дек 11, 11:10    [11705367]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
Glory
AlexandrPlus
через raiseerror Oracle 8 на PL/SQL получалось, но в T-SQL хранимка завершается же

С чего вдруг "raiserror с уровнем меньше 10" завершает процедура ?


и второй момент - для клиента это не есть исключительная ситуация (в Оракле 8 PL/SQL выполняется на сервере, а на клиенте, созданном в Оракл Девелопер, только ГУЙ - и есть средства видеть системные параметры процесса выполнения)
5 дек 11, 11:18    [11705422]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Есть такая игра:
1. Сервер простаивает всю ночь.
2. Пришёл пользователь и тупа нажал на кнопку (все входные параметры автоматом вычислены)
3. Пьёт хофе, он же работает - ждёт ответ от сервера. Пишет жалобы, как же должно быть для него интереснее "удобнее" наблюдать за процессом. Как за проессом копирования в Вянде (3 часа ... 3 минуты ... 3 дня ... 10 секунд ... 1 час)
4. Сервер не должен тупо решать проблему, а прерываться каждую секунду, синхронизировать проценты с клиентом - ещё лимон строк из неизвестного количества (статистика же не актуальна у весёлого админа).
5. И вскоре клиент радуется, пришёл же ответ, ща распечатаю и положу в шкаф.
6. Сервер простаивает всю ночь ...

PS: Ну почему, есть же клиенты, которые жалуются что всё приходит заранее, и требуют чтоб они сами были роботами и нажимали на кнопку.
PPS: Eстественно всё не автоматизирушь. Это как кому повезёт, с работой, начальством, коллегами и мозгами.
5 дек 11, 11:20    [11705439]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
Начинающий SQL 2008
AlexandrPlus
Какие есть хорошие приемы показа на клиентах прогресса выполнения хранимок?
Клиенты на Delphi и Java.
Я выполняю хранимки в асинхронном режиме, а вместо ProgressBar`a, крутится gif-рисунок.

Время выполнение самой ХП на ProgressBar правильно отобразить нельзя, а вот процесс передачи строк на клиента можно.
Событие OnFetchProgress event.
Пример от Borland`a:
procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  Caption := 'Percent complete: ' +
    IntToStr(Trunc(Progress / MaxProgress * 100)) + '%';
  Application.ProcessMessages;
end;


это да тогда создание отчета по другому нужно организовывать - например, как запрос с клиента в хмл-файл, а потом из хмл-файла в генератор отчета
ещё как-то, но это без хранимок

А что - тоже вариант.
5 дек 11, 11:28    [11705491]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Начинающий SQL 2008
процесс передачи строк
Это что за простыня данных? Миллионы строк на клиент?

AlexandrPlus, чем дальше продвигается оптимизация процесса выполнения тем более невероятно это предсказать.
Парралельные потоки, попадание в кэшь, загрузка параллельными процессами (запросы других пользователей SQL и работы сервера - админ, бэкапы, закачки - выкачки, расширение массивов ...), актуальность статистики, смена плана запроса, правила регулятора ресурсов ... тысячи их

Что важнее - наблюдать пару часов за прогрессбаром или получить результат за 10 секунд?
5 дек 11, 11:32    [11705532]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
AlexandrPlus
хранимку можно модифицировать
Вопрос что и как, чтобы на клиенте ловить
Вопрос о том, как программировать клиента, лучьше задать на форуме о языке программирования вашего клиента.

Я же не знаю, как на Прологе (или на чём вы там программируете) принимают сообщения от SQL Server-а

AlexandrPlus
и второй момент - для клиента это не есть исключительная ситуация
Конечно, вам и не нужна исключительная ситуация.
5 дек 11, 11:36    [11705571]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Mnior
AlexandrPlus, чем дальше продвигается оптимизация процесса выполнения тем более невероятно это предсказать.
Парралельные потоки, попадание в кэшь, загрузка параллельными процессами (запросы других пользователей SQL и работы сервера - админ, бэкапы, закачки - выкачки, расширение массивов ...), актуальность статистики, смена плана запроса, правила регулятора ресурсов ... тысячи их
Как я понимаю, задача обычно не такая сложная :-)

Если есть отчёт, который включает 10 стадий расчёта, то нужно передавать клиенту события завершения этих стадий. И далее показывать в интерфейсе.

В общем задача не такая сложная, и полезная, хотя бы чисто психологически - людям нравится смотреть, как горит огонь, как идёт дефрагментация диска и т.д. :-)
5 дек 11, 11:39    [11705601]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
Mnior
Начинающий SQL 2008
процесс передачи строк
Это что за простыня данных? Миллионы строк на клиент?

...

Что важнее - наблюдать пару часов за прогрессбаром или получить результат за 10 секунд?


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

А на это уже можно принимать ставки - всякий ли отчет можно уложить всегда в 10 секунд, если при обычных входных данных он выполняется, скажем, за 1 секунду.
5 дек 11, 11:53    [11705759]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
alexeyvg

Если есть отчёт, который включает 10 стадий расчёта, то нужно передавать клиенту события завершения этих стадий. И далее показывать в интерфейсе.

В общем задача не такая сложная, и полезная, хотя бы чисто психологически - людям нравится смотреть, как горит огонь, как идёт дефрагментация диска и т.д. :-)


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

Что там 'нравится' - люди в панику и тревожность внадают - от них информации начальники ждут, а перед ними только песочные часы или гиф, более привлекательный, но не менее раздражительный.
5 дек 11, 12:23    [11705930]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexandrPlus
Что там 'нравится' - люди в панику и тревожность внадают - от них информации начальники ждут, а перед ними только песочные часы или гиф, более привлекательный, но не менее раздражительный.

Ну так может пора заняться оптмизацией запросов ?
5 дек 11, 12:28    [11705974]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
я бы перед выполнением настоящей хранимки - выполнил бы некую хранимку - предпросмотр - с тем же набором входных параметров.
Которая просто
- запрашивает количество строк, которые будут задействованы в выборке.
- записывает эти показатели в таблицу истории выполнения хранимки (с маркером-предпросмотр)
- делает пропорциональный расчет соотношения времени выполнения хранимки в прошлые вызовы к количеству задействованных данных с учетом количества задействованных данных в этот раз.
- записывает прогноз сроков выполнения в таблицу истории выполнения хранимки
(это нужно для самообучения - потом можно будет добавить авто-коррекцию предсказаний на известный процент ошибок)
- ну и планы выполнения, разумеется запоминаем. Если план выполнения изменился - у него своя история и статистика.

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

ЗЫ
все это пока не делал, сам думаю такое попробовать реализовать.
5 дек 11, 13:12    [11706295]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Ах, да, и добавить в предсказаниях учет нагрузки на сервер .
5 дек 11, 13:24    [11706408]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
ART-CODE
я бы перед выполнением настоящей хранимки - выполнил бы некую хранимку - предпросмотр - с тем же набором входных параметров.


Вот будет весело пользователям, сначала ждать оценки, а потом ждать исполнения... :(
5 дек 11, 13:34    [11706489]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
Users
Member

Откуда:
Сообщений: 341
а вот, например, те же принты. Есть у sql такое неприятное свойство - выдавать их не совсем сразу, как событие прошло.
Скажем, селект из одной таблицы прошел - я делаю принт, потом выборку из другой - результаты принта на экран не выходят.

Как можно сделать, чтобы они выходили _сразу_ же? Особенно это актуально для тяжелых процедур.
5 дек 11, 13:41    [11706561]     Ответить | Цитировать Сообщить модератору
 Re: Какие есть хорошие приемы индикации прогресса выполнения хранимок?  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Klick
Вот будет весело пользователям, сначала ждать оценки, а потом ждать исполнения... :(

Это уже смотря как реализовать.
Конечно, предпросмотр должен быть быстрым, иначе теряет смысл.
А скорость достигается за счет вдумчивого анализа - какие факторы нужно учесть
(что важнее всего) - в каждом конкретном случае, и как это можно сделать быстро.
5 дек 11, 14:01    [11706761]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить