13.10.2011, 12:47 | #1 |
Участник
|
Уважаемые коллеги, в который раз обращаюсь к Вам за помощью.
ПОдскажите как и разъясните почему? Ситуация: есть у нас мандант один удаленный. Недавно звонят и просят: "нельзя ли печать счета несколько ускорить?". Проблема у них в том, что когда они печатают проведенные счета, то приходится "долго" ждать пока сформируется отчет. Проверила. Да, действительно, процедура малость затянута (у меня ушло секунд 30-35 на формирование печатной формы. Полагаю, у них это занимает гораздо больше времени, т.к. сервера стоЯт у нас, а их филиал находится на расстоянии неск. сот км) Тут начинается самое интересное: когда я повторно вызываю печать счета, то на его формирование уходит уже всего 7-8 секунд. Ну, думаю, наверное в какой-то переменной уже есть готовый набор данных, который не приходится повторно формировать, потому и времени во второй раз требуется меньше. Беру тогда другой счет - печать - ии опять те же 7-8 секунд. Закрываю НАВ - Повторно запускаю программу - Опять 7-8 секунд. ПОЧЕМУ!? ,Где и что он (т.е. комп) сохраняет в памяти, что такая разница во времени получается!? |
|
13.10.2011, 13:11 | #2 |
Участник
|
Немного дополню.
Экспериментировала с локальной БД на моем рабочем компе: при первоначальном формировании - 6 секунд, при повторном - одна-две. Только после перезапуска компа время опять "увеличивается". |
|
13.10.2011, 13:36 | #3 |
Участник
|
Это сервер "разгоняется", оптимизирует работу запросов. Возможно какой - нибудь ключ у вас в отчете не удачно выбран, ковыряйте в эту сторону.
|
|
13.10.2011, 13:44 | #4 |
Участник
|
Цитата:
Код: SETCURRENTKEY(Поле1, ПОле2, Поле3) Код: SETFILTER/RANGE(Поле2....) SETFILTER/RANGE(Поле3....) SETFILTER/RANGE(Поле1....) |
|
13.10.2011, 13:47 | #5 |
Участник
|
Допустим сервер "разгоняется. Но тогда почему то же самое порисходит и на ЛОКАЛЬНОЙ базе? ... даже после того, как окно НАВа закрываю (т.е. я исходу из предположения, что в этот момент всё, что касается Навижн из памяти компа удаляется) все равно наблюдается этот эффект "ускорения"
|
|
13.10.2011, 13:55 | #6 |
Участник
|
Цитата:
Сообщение от Kadawrik
Допустим сервер "разгоняется. Но тогда почему то же самое порисходит и на ЛОКАЛЬНОЙ базе? ... даже после того, как окно НАВа закрываю (т.е. я исходу из предположения, что в этот момент всё, что касается Навижн из памяти компа удаляется) все равно наблюдается этот эффект "ускорения"
Порядок фильтрации не важен. Посмотрите, что стоит в настойках Кэш объектов (KB) в филиале. Мож там 0? |
|
13.10.2011, 14:07 | #7 |
Участник
|
Цитата:
Код: 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 и т.д. Что здесь можно бы ло бы оптимизировать? |
|
13.10.2011, 14:18 | #8 |
Участник
|
Цитата:
Сообщение от 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; 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 и т.д. Что здесь можно бы ло бы оптимизировать? |
|
13.10.2011, 14:24 | #9 |
Участник
|
И вообще, по поводу использования SETCURRENTKEY под SQL Server, пускай поправят меня, если я не прав в следующих утверждениях:
В некоторых случаях использование SETCURRENTKEY не только не дает никакого прироста в скорости, но и ухудшает его. Попробуйте сделать простой тест - с ключом и без ключа. Я делал аналогичный на товарной книге операций, у меня также было много фильтров. Результат - с первичным ключом считает быстрее. |
|
13.10.2011, 14:32 | #10 |
Участник
|
Цитата:
Сообщение от Fly
И вообще, по поводу использования SETCURRENTKEY под SQL Server, пускай поправят меня, если я не прав в следующих утверждениях:
В некоторых случаях использование SETCURRENTKEY не только не дает никакого прироста в скорости, но и ухудшает его. Попробуйте сделать простой тест - с ключом и без ключа. Я делал аналогичный на товарной книге операций, у меня также было много фильтров. Результат - с первичным ключом считает быстрее. |
|
13.10.2011, 14:41 | #11 |
Участник
|
Цитата:
Сообщение от Kadawrik
Цитата:
Сообщение от Fly
И вообще, по поводу использования SETCURRENTKEY под SQL Server, пускай поправят меня, если я не прав в следующих утверждениях:
В некоторых случаях использование SETCURRENTKEY не только не дает никакого прироста в скорости, но и ухудшает его. Попробуйте сделать простой тест - с ключом и без ключа. Я делал аналогичный на товарной книге операций, у меня также было много фильтров. Результат - с первичным ключом считает быстрее. |
|
13.10.2011, 15:18 | #12 |
Участник
|
Цитата:
Сообщение от 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; 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 и т.д. Что здесь можно бы ло бы оптимизировать? Т.е. просматриваете все счета начиная с царя-гороха. Вообще с помощью создания ключей можно это дело ускорить все ж. Первичный ключ для строк инвойса, это <Document No.,Line No.>, если я не ошибаюсь. Остальные фильтруемые поля остаются за бортом. Лучше добавить ключ, где все фильтруемые поля входят в него. От цикла лучше избавиться, прописав в этом ключе SumIndexField = Quantity и потом его просто CalsSum-ить. Со строками отгрузки аналогично.. |
|
13.10.2011, 15:29 | #13 |
Участник
|
Поменяла.
Во всех местах, где есть цикл, вместо FIND('-') написала Код: IF FINDSET THEN REPEAT ... UNTIL NEXT= 0 Оставлю, наверное, пока как есть. При первичном формировании отчета - как нить потерпят сколько надо, зато при повторных всё работает быстро. |
|
13.10.2011, 19:48 | #14 |
Участник
|
закомментируйте SETCURRENTKEY. Выбранные ключи - не эффективны.
И не важно, на native или на SQL. |
|
13.10.2011, 20:50 | #15 |
Участник
|
Kadawrik, а выскакивает окошко перебора записей, которое возникает при не эффективном ключе?
Цитата:
т.к. сервера стоЯт у нас, а их филиал находится на расстоянии неск. сот км
|
|
13.10.2011, 22:50 | #16 |
Участник
|
Цитата:
Сообщение от 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; Что здесь можно бы ло бы оптимизировать? Не исключаю, что можно код перестроить, в результате чего заработает быстрее. Что за переменная 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 |
Administrator
|
|
|
14.10.2011, 10:37 | #18 |
Участник
|
|
|
14.10.2011, 10:41 | #19 |
Участник
|
.Quattro.
Цитата:
Может можно найти строки без поиска заголовков?
|
|
14.10.2011, 13:49 | #20 |
Участник
|
|
|