AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.10.2011, 12:47   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Уважаемые коллеги, в который раз обращаюсь к Вам за помощью.
ПОдскажите как и разъясните почему?
Ситуация: есть у нас мандант один удаленный. Недавно звонят и просят: "нельзя ли печать счета несколько ускорить?". Проблема у них в том, что когда они печатают проведенные счета, то приходится "долго" ждать пока сформируется отчет. Проверила. Да, действительно, процедура малость затянута (у меня ушло секунд 30-35 на формирование печатной формы. Полагаю, у них это занимает гораздо больше времени, т.к. сервера стоЯт у нас, а их филиал находится на расстоянии неск. сот км)
Тут начинается самое интересное: когда я повторно вызываю печать счета, то на его формирование уходит уже всего 7-8 секунд. Ну, думаю, наверное в какой-то переменной уже есть готовый набор данных, который не приходится повторно формировать, потому и времени во второй раз требуется меньше.
Беру тогда другой счет - печать - ии опять те же 7-8 секунд.
Закрываю НАВ - Повторно запускаю программу - Опять 7-8 секунд.
ПОЧЕМУ!? ,Где и что он (т.е. комп) сохраняет в памяти, что такая разница во времени получается!?
Старый 13.10.2011, 13:11   #2  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Немного дополню.
Экспериментировала с локальной БД на моем рабочем компе: при первоначальном формировании - 6 секунд, при повторном - одна-две.
Только после перезапуска компа время опять "увеличивается".
Старый 13.10.2011, 13:36   #3  
prefreitor is offline
prefreitor
Участник
 
214 / 11 (1) +
Регистрация: 03.10.2006
Это сервер "разгоняется", оптимизирует работу запросов. Возможно какой - нибудь ключ у вас в отчете не удачно выбран, ковыряйте в эту сторону.
Старый 13.10.2011, 13:44   #4  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от prefreitor Посмотреть сообщение
Это сервер "разгоняется", оптимизирует работу запросов. Возможно какой - нибудь ключ у вас в отчете не удачно выбран, ковыряйте в эту сторону.
Кстати о ключах! Если в программе стоит:
Код:
SETCURRENTKEY(Поле1, ПОле2, Поле3)
Затем накладываются фильтры
Код:
SETFILTER/RANGE(Поле2....)
SETFILTER/RANGE(Поле3....)
SETFILTER/RANGE(Поле1....)
Влияет ли на производительность системы порядок наложения фильтров? Насколько важно накладывать фильтры на поля в той же последовательности, что и порядок полей в активном ключе?
Старый 13.10.2011, 13:47   #5  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от prefreitor Посмотреть сообщение
Это сервер "разгоняется", оптимизирует работу запросов. Возможно какой - нибудь ключ у вас в отчете не удачно выбран, ковыряйте в эту сторону.
Допустим сервер "разгоняется. Но тогда почему то же самое порисходит и на ЛОКАЛЬНОЙ базе? ... даже после того, как окно НАВа закрываю (т.е. я исходу из предположения, что в этот момент всё, что касается Навижн из памяти компа удаляется) все равно наблюдается этот эффект "ускорения"
Старый 13.10.2011, 13:55   #6  
VProk is offline
VProk
Участник
 
25 / 10 (1) +
Регистрация: 07.03.2007
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Цитата:
Сообщение от prefreitor Посмотреть сообщение
Это сервер "разгоняется", оптимизирует работу запросов. Возможно какой - нибудь ключ у вас в отчете не удачно выбран, ковыряйте в эту сторону.
Допустим сервер "разгоняется. Но тогда почему то же самое порисходит и на ЛОКАЛЬНОЙ базе? ... даже после того, как окно НАВа закрываю (т.е. я исходу из предположения, что в этот момент всё, что касается Навижн из памяти компа удаляется) все равно наблюдается этот эффект "ускорения"
Все-таки обратите внимание в первую очередь на ключи. Возможно, фильтруются какие-то поля, которые в ключе отсутствуют.
Порядок фильтрации не важен. Посмотрите, что стоит в настойках Кэш объектов (KB) в филиале. Мож там 0?
Старый 13.10.2011, 14:07   #7  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от VProk Посмотреть сообщение
Все-таки обратите внимание в первую очередь на ключи. Возможно, фильтруются какие-то поля, которые в ключе отсутствуют.
Порядок фильтрации не важен. Посмотрите, что стоит в настойках Кэш объектов (KB) в филиале. Мож там 0?
Вот франиент кода, на котором наблюдаются основные "тормоза":
Код:
SalesInvoiceHeader.SETCURRENTKEY("Order No.");
SalesInvoiceHeader.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
IF SalesInvoiceHeader.FIND('-') THEN
  REPEAT
    SalesInvoiceLine2.SETRANGE("Document No.",SalesInvoiceHeader."No.");
    SalesInvoiceLine2.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
    SalesInvoiceLine2.SETRANGE(Type,SalesInvoiceLine.Type);
    SalesInvoiceLine2.SETRANGE("No.",SalesInvoiceLine."No.");
    SalesInvoiceLine2.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
    IF SalesInvoiceLine2.FIND('-') THEN
      REPEAT
        TotalQuantity := TotalQuantity + SalesInvoiceLine2.Quantity;
      UNTIL SalesInvoiceLine2.NEXT = 0;
  UNTIL SalesInvoiceHeader.NEXT = 0;



SalesShipmentLine.SETCURRENTKEY("Order No.","Order Line No.");
SalesShipmentLine.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesShipmentLine.SETRANGE("Order Line No.",SalesInvoiceLine."Line No.");
SalesShipmentLine.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
SalesShipmentLine.SETRANGE(Type,SalesInvoiceLine.Type);
SalesShipmentLine.SETRANGE("No.",SalesInvoiceLine."No.");
SalesShipmentLine.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
SalesShipmentLine.SETFILTER(Quantity,'<>%1',0);

IF SalesShipmentLine.FIND('-') THEN
  REPEAT
и т.д.
Тормозит на первой части (от "IF SalesInvoiceHeader.FIND('-') THEN" до UNTIL SalesInvoiceHeader.NEXT = 0").
Что здесь можно бы ло бы оптимизировать?
Старый 13.10.2011, 14:18   #8  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Цитата:
Сообщение от VProk Посмотреть сообщение
Все-таки обратите внимание в первую очередь на ключи. Возможно, фильтруются какие-то поля, которые в ключе отсутствуют.
Порядок фильтрации не важен. Посмотрите, что стоит в настойках Кэш объектов (KB) в филиале. Мож там 0?
Вот франиент кода, на котором наблюдаются основные "тормоза":
Код:
SalesInvoiceHeader.SETCURRENTKEY("Order No.");
SalesInvoiceHeader.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
IF SalesInvoiceHeader.FIND('-') THEN
  REPEAT
    SalesInvoiceLine2.SETRANGE("Document No.",SalesInvoiceHeader."No.");
    SalesInvoiceLine2.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
    SalesInvoiceLine2.SETRANGE(Type,SalesInvoiceLine.Type);
    SalesInvoiceLine2.SETRANGE("No.",SalesInvoiceLine."No.");
    SalesInvoiceLine2.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
    IF SalesInvoiceLine2.FIND('-') THEN
      REPEAT
        TotalQuantity := TotalQuantity + SalesInvoiceLine2.Quantity;
      UNTIL SalesInvoiceLine2.NEXT = 0;
  UNTIL SalesInvoiceHeader.NEXT = 0;



SalesShipmentLine.SETCURRENTKEY("Order No.","Order Line No.");
SalesShipmentLine.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesShipmentLine.SETRANGE("Order Line No.",SalesInvoiceLine."Line No.");
SalesShipmentLine.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
SalesShipmentLine.SETRANGE(Type,SalesInvoiceLine.Type);
SalesShipmentLine.SETRANGE("No.",SalesInvoiceLine."No.");
SalesShipmentLine.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
SalesShipmentLine.SETFILTER(Quantity,'<>%1',0);

IF SalesShipmentLine.FIND('-') THEN
  REPEAT
и т.д.
Тормозит на первой части (от "IF SalesInvoiceHeader.FIND('-') THEN" до UNTIL SalesInvoiceHeader.NEXT = 0").
Что здесь можно бы ло бы оптимизировать?
Ну конечно. Поменяйте на FINDSET. FIND('-') - это во-первых устаревшая команда, а во-вторых аналогична FINDFIRST, что вообще неправильно для циклов.
Старый 13.10.2011, 14:24   #9  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
И вообще, по поводу использования SETCURRENTKEY под SQL Server, пускай поправят меня, если я не прав в следующих утверждениях:
В некоторых случаях использование SETCURRENTKEY не только не дает никакого прироста в скорости, но и ухудшает его. Попробуйте сделать простой тест - с ключом и без ключа. Я делал аналогичный на товарной книге операций, у меня также было много фильтров. Результат - с первичным ключом считает быстрее.
Старый 13.10.2011, 14:32   #10  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Fly Посмотреть сообщение
И вообще, по поводу использования SETCURRENTKEY под SQL Server, пускай поправят меня, если я не прав в следующих утверждениях:
В некоторых случаях использование SETCURRENTKEY не только не дает никакого прироста в скорости, но и ухудшает его. Попробуйте сделать простой тест - с ключом и без ключа. Я делал аналогичный на товарной книге операций, у меня также было много фильтров. Результат - с первичным ключом считает быстрее.
Мы пока работаем на Database Server, но в скором времени планируется переходить на SQL
Старый 13.10.2011, 14:41   #11  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Цитата:
Сообщение от Fly Посмотреть сообщение
И вообще, по поводу использования SETCURRENTKEY под SQL Server, пускай поправят меня, если я не прав в следующих утверждениях:
В некоторых случаях использование SETCURRENTKEY не только не дает никакого прироста в скорости, но и ухудшает его. Попробуйте сделать простой тест - с ключом и без ключа. Я делал аналогичный на товарной книге операций, у меня также было много фильтров. Результат - с первичным ключом считает быстрее.
Мы пока работаем на Database Server, но в скором времени планируется переходить на SQL
Тогда забудьте про мой совет про ключ. Но на FINDSET поменяйте
Старый 13.10.2011, 15:18   #12  
VProk is offline
VProk
Участник
 
25 / 10 (1) +
Регистрация: 07.03.2007
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Цитата:
Сообщение от VProk Посмотреть сообщение
Все-таки обратите внимание в первую очередь на ключи. Возможно, фильтруются какие-то поля, которые в ключе отсутствуют.
Порядок фильтрации не важен. Посмотрите, что стоит в настойках Кэш объектов (KB) в филиале. Мож там 0?
Вот франиент кода, на котором наблюдаются основные "тормоза":
Код:
SalesInvoiceHeader.SETCURRENTKEY("Order No.");
SalesInvoiceHeader.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
IF SalesInvoiceHeader.FIND('-') THEN
  REPEAT
    SalesInvoiceLine2.SETRANGE("Document No.",SalesInvoiceHeader."No.");
    SalesInvoiceLine2.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
    SalesInvoiceLine2.SETRANGE(Type,SalesInvoiceLine.Type);
    SalesInvoiceLine2.SETRANGE("No.",SalesInvoiceLine."No.");
    SalesInvoiceLine2.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
    IF SalesInvoiceLine2.FIND('-') THEN
      REPEAT
        TotalQuantity := TotalQuantity + SalesInvoiceLine2.Quantity;
      UNTIL SalesInvoiceLine2.NEXT = 0;
  UNTIL SalesInvoiceHeader.NEXT = 0;



SalesShipmentLine.SETCURRENTKEY("Order No.","Order Line No.");
SalesShipmentLine.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesShipmentLine.SETRANGE("Order Line No.",SalesInvoiceLine."Line No.");
SalesShipmentLine.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
SalesShipmentLine.SETRANGE(Type,SalesInvoiceLine.Type);
SalesShipmentLine.SETRANGE("No.",SalesInvoiceLine."No.");
SalesShipmentLine.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
SalesShipmentLine.SETFILTER(Quantity,'<>%1',0);

IF SalesShipmentLine.FIND('-') THEN
  REPEAT
и т.д.
Тормозит на первой части (от "IF SalesInvoiceHeader.FIND('-') THEN" до UNTIL SalesInvoiceHeader.NEXT = 0").
Что здесь можно бы ло бы оптимизировать?
SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
Т.е. просматриваете все счета начиная с царя-гороха.
Вообще с помощью создания ключей можно это дело ускорить все ж.
Первичный ключ для строк инвойса, это <Document No.,Line No.>, если я не ошибаюсь. Остальные фильтруемые поля остаются за бортом.
Лучше добавить ключ, где все фильтруемые поля входят в него. От цикла лучше избавиться, прописав в этом ключе SumIndexField = Quantity и потом его просто CalsSum-ить.
Со строками отгрузки аналогично..
Старый 13.10.2011, 15:29   #13  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Fly Посмотреть сообщение
Тогда забудьте про мой совет про ключ. Но на FINDSET поменяйте
Поменяла.
Во всех местах, где есть цикл, вместо FIND('-') написала
Код:
IF FINDSET THEN
   REPEAT
   ...
   UNTIL NEXT= 0
Результат: + одна-две секунды, т.е. отчет стал формироваться ДОЛЬШЕ

Оставлю, наверное, пока как есть. При первичном формировании отчета - как нить потерпят сколько надо, зато при повторных всё работает быстро.
Старый 13.10.2011, 19:48   #14  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
закомментируйте SETCURRENTKEY. Выбранные ключи - не эффективны.
И не важно, на native или на SQL.
Старый 13.10.2011, 20:50   #15  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Kadawrik, а выскакивает окошко перебора записей, которое возникает при не эффективном ключе?
Цитата:
т.к. сервера стоЯт у нас, а их филиал находится на расстоянии неск. сот км
они по VPN лазиют?
Старый 13.10.2011, 22:50   #16  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Вот франиент кода, на котором наблюдаются основные "тормоза":
Код:
SalesInvoiceHeader.SETCURRENTKEY("Order No.");
SalesInvoiceHeader.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
IF SalesInvoiceHeader.FIND('-') THEN
  REPEAT
    SalesInvoiceLine2.SETRANGE("Document No.",SalesInvoiceHeader."No.");
    SalesInvoiceLine2.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
    SalesInvoiceLine2.SETRANGE(Type,SalesInvoiceLine.Type);
    SalesInvoiceLine2.SETRANGE("No.",SalesInvoiceLine."No.");
    SalesInvoiceLine2.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
    IF SalesInvoiceLine2.FIND('-') THEN
      REPEAT
        TotalQuantity := TotalQuantity + SalesInvoiceLine2.Quantity;
      UNTIL SalesInvoiceLine2.NEXT = 0;
  UNTIL SalesInvoiceHeader.NEXT = 0;
Тормозит на первой части (от "IF SalesInvoiceHeader.FIND('-') THEN" до UNTIL SalesInvoiceHeader.NEXT = 0").
Что здесь можно бы ло бы оптимизировать?
Посоветовал бы вам перед наложением фильтров ставить RESET - неизвестно, какие до этого фильтры накладывались на записи.
Не исключаю, что можно код перестроить, в результате чего заработает быстрее. Что за переменная SalesInvoiceLine? Может можно найти строки без поиска заголовков?

Т.к. вы используете Native базу, то порядок наложения фильтров важен - он должен быть таким же, как и в ключе.
FINDSET работает только в SQL-версии быстрее.
Попробуйте не накладывать фильтр SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
а измените цикл на
(SalesInvoiceHeader."No." = "Sales Invoice Header"."No.") OR (SalesInvoiceHeader.NEXT = 0);
Старый 14.10.2011, 00:57   #17  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
Цитата:
Сообщение от .Quattro. Посмотреть сообщение
Попробуйте не накладывать фильтр SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
а измените цикл на
(SalesInvoiceHeader."No." = "Sales Invoice Header"."No.") OR (SalesInvoiceHeader.NEXT = 0);
потом расскажешь
Старый 14.10.2011, 10:37   #18  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от Kashin Посмотреть сообщение
закомментируйте SETCURRENTKEY. Выбранные ключи - не эффективны.
И не важно, на native или на SQL.
Расскажите какой ключ тут подойдет? Прям до жути интересно.
По вашему ключи для главный измерений тоже не эффективны в тех же учтенных документах.?
Старый 14.10.2011, 10:41   #19  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
.Quattro.
Цитата:
Может можно найти строки без поиска заголовков?
номера заказов храняться только в заголовках или протаскивать их в строки при учете.
Старый 14.10.2011, 13:49   #20  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от InTacto Посмотреть сообщение
Kadawrik, а выскакивает окошко перебора записей, которое возникает при не эффективном ключе?
Нет, не выскакивает. Просто часики вертятся какое-то время, потом появляется сам отчет.

Цитата:
они по VPN лазиют?
Да. плюс они через терминальник работают
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:05.