|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Добрый день. Есть сервер cache и asp.net приложение, которое выполняет пользовательские запросы. Один запрос выполняется приблизительно 3.5 часа, но выполняется он нормально только из той же сети, где он находится сам сервер. Дело в том, что в организации несколько зданий и когда пользователи, расположенные в другом удаленном здании запускают этот запрос, internet explorer пишет, что ждет данные, но завершатся эта процедура не завершается... Можно параллельно запустить это приложение на сервере и на удаленной машине и видно, что на сервере процесс завершится, а на удаленной машине так и будет проигрываться анимация получения данных от сервера. Пробовал запускать на удаленной машине запрос через winsql и он как положено через 3.5 часа отработал. В чем может быть дело? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 10:30 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Если есть такие запросы, значит в приложении что-то не так сделано, все что касается веб не должно быть таким долгим. проблема может крыть в работе по сети, и единственное верное решение это переделать так чтобы либо браузер мог выполнять короткие запросы к фоновому долгому процессу, либо сделать этот запрос проще а еще лучше поработать над его оптимизацией. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 10:36 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Еще пробовал запускать ping с удаленной машины на сервер и раз в пол часа проскакивает "превышен интервал ожидания"... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 10:37 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984Еще пробовал запускать ping с удаленной машины на сервер и раз в пол часа проскакивает "превышен интервал ожидания"...тогда решайте проблемы с сетью, Cache на пинги не влияет ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 10:39 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Запрос составлял я сам, изначально он выполнялся 19 часов. После оптимизации 3.5. Вот, если интересно его текстselect count(*) as "Количество платежей по инкассо", sum("sum") as "Сумма платежей по инкассо" from ASV_Entities.Payment p where not p.PayDocumentFK->Purpose is null and exists (select documentnumber from ASV_Entities.Resolution r where $FIND(p.PayDocumentFK->Purpose, r.documentnumber ) <> 0 and r.DateCreate between '2014-01-01' and '2014-12-31') and p.CreatorStatusFK->code in ('04', '23') and p.insurerfk->territorydptpfrfk->ID=055004 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 10:39 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Это вы хорошо оптимизировали, но явно этого еще не достаточно и еще есть куда стремиться В данном случае есть у вас период по которому отлично можно этот запрос и разбить разбив его на какие-то разумные интервалы, можно выполнить больше запросов, но с нормальным откликом для системы, можно будет даже прогресс нарисовать, и порционную подгрузку данных сколько же у вас там записей, что у вас запрос за год (при том что пока только полгода), выполняется 3.5 часа, т.е. я полагаю где-то день за минуту расчитывается у вас там используется функция $find? может попробовать от нее избавиться ? выделив это значение в отдельное поле с индексом для него ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 10:52 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984, А какая у вас версия Cache? Можете план запроса показать? Вы TuneTable запускали для ASV_Entities.Payment? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 11:11 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984, а так не пробовалиselect count(*) as "Количество платежей по инкассо", sum("sum") as "Сумма платежей по инкассо" from ASV_Entities.Payment p where not p.PayDocumentFK->Purpose is null and p.insurerfk->territorydptpfrfk->ID=055004 and p.CreatorStatusFK->code in ('04', '23') and exists (select documentnumber from ASV_Entities.Resolution r where $FIND( p.PayDocumentFK->Purpose, r.documentnumber ) <> 0 and r.DateCreate between '2014-01-01' and '2014-12-31') ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 11:26 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Если известно как из p.PayDocumentFK->Purpose вырезать номера документов, то можно его проиндексировать и использовать FOR SOME %ELEMENT. И нет смысла использовать $FIND, если не требуется результат. [ будет работать быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 12:04 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Дело в том, что сам сервер это часть веб-сервиса, предназначенного для выполнения рабочих обязанностей, и что-то менять в базе данных я не могу. Похожая ситуация и с asp.net приложением, хотя что вы предлагаете разбивать с прогрессбаром, если результат - 2 числа. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 13:18 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984хотя что вы предлагаете разбивать с прогрессбаромпрогресс выполнения запроса, ведь если запрос выполняется 3.5 часа, очень интересно видеть сколько он уже посчитал в определенный момент времени ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 13:25 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
3,5 часа ждать ДВА значения - это какие нервы надо иметь железные) Если класс менять нельзя, можно подготовить какие-то данные перед запросом (быть может documentnumber из ASV_Entities.Resolution?), сложить их во временный глобал, а потом использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2014, 13:50 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА, попробовал ваш вариант - выполняется 4часа. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2014, 06:27 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984, Заменить $FIND на [ пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2014, 12:03 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Если интересует только год, то условие:r.DateCreate between '2014-01-01' and '2014-12-31'Можно представить как:$EXTRACT(r.DateCreate,1,4) = 2010Время выполнения может несколько уменьшиться. Вот возможные варианты, $EXTRACT самый быстрый из всех (область samples)select ID, EventDate, EventId, EventTime from Aviation.Event where $EXTRACT(EventDate,1,4) = 2010 --Относительная стоимость = 11120400 Быстродействие: 0.024 select ID, EventDate, EventId, EventTime from Aviation.Event where $PIECE(EventDate,'-',1) = 2010 --Относительная стоимость = 11120400 Быстродействие: 0.029 select ID, EventDate, EventId, EventTime from Aviation.Event where YEAR(EventDate)=2010 --Относительная стоимость = 11120400 Быстродействие: 0.029 Секунды select ID, EventDate, EventId, EventTime from Aviation.Event where EventDate between '2010-01-01' and '2010-12-31' --Относительная стоимость = 11120400 Быстродействие: 0.030 Секунды select ID, EventDate, EventId, EventTime from Aviation.Event where DATEPART('yy',EventDate) = 2010 --Относительная стоимость = 11120400 Быстродействие: 0.064 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2014, 18:53 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984, запрос это здорово, еще бы код участвующих в нем классов-свойств-индексов ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:07 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
>Заменить $FIND на [ пробовали? На что заменить? Я знаю like и $find, а квадратная скобочка причем? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2014, 12:04 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984, http://docs.intersystems.com/cache20141/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_operators Секция Binary Contains. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2014, 12:10 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
dizzy1984, по своим access привычкам я бы делала по схемеselect p.PayDocumentFK,count(*) as "Количество платежей по инкассо", sum("sum") as "Сумма платежей по инкассо" from ASV_Entities.Payment p inner join (select documentnumber as d2 from ASV_Entities.Resolution r where r.DateCreate between '2014-01-01' and '2014-12-31' group by documentnumber) w on p.PayDocumentFK=w.d2 where p.insurerfk->territorydptpfrfk->ID=055004 and p.CreatorStatusFK->code in ('04', '23') group by p.PayDocumentFK ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2014, 14:16 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Проблема решилась - оказалось, что в oper'e 20 все выполняется даже на удаленных машинах. Попробовал разные предложенные варианты - получилось 3ч48м и 3ч46м. Вообщем всем спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2014, 14:54 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
Petr0vi4444И нет смысла использовать $FIND, если не требуется результат. [ будет работать быстрее.Это совершенно не очевидно; по моим наблюдениям, если ищется переменная, разница в скорости несущественна, но если ищется литерал, $find выигрывает в разы! Почему это так? Возможно, потому, что появление [ инициирует вычисление строкового выражения (работу со строковым стеком и т.д.), а в случае вызова функции этих накладных расходов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2014, 22:55 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
По датам, если отсекать по году, достаточно сделать DateCreate %StartsWith '2014' и это будет работать, используя индекс по максимуму (если он есть) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 16:43 |
|
Длинный запрос никогда не заканчивается
|
|||
---|---|---|---|
#18+
eduard93Если интересует только год, то условие:r.DateCreate between '2014-01-01' and '2014-12-31'Можно представить как:$EXTRACT(r.DateCreate,1,4) = 2010Время выполнения может несколько уменьшиться. Вот возможные варианты, $EXTRACT самый быстрый из всех (область samples)Самый быстрый вариант - это сделать индекс на дату, но только по году: описание "How it's Made" есть в блоге (Глава " Дата (время и т.д) "). D_De1mosПо датам, если отсекать по году, достаточно сделать DateCreate %StartsWith '2014' и это будет работать, используя индекс по максимуму (если он есть)Вряд ли поле DateCreate у ТС является строковым. dizzy1984 , 3 часа - это слишком долго. Уверен, есть резерв для дальнейшей оптимизации таблиц/индексов/запроса. PS: в последних версиях СУБД появились новые инструменты для анализа производительности SQL: ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2014, 18:56 |
|
|
start [/forum/topic.php?fid=39&msg=38730415&tid=1556811]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 408ms |
0 / 0 |