Старая статья 2008 года, посвященная оптимизации скорости работы программы ФинСофт:КупецЪ. Практически все осталось актуально, публикую ее как есть.
=======
Практически во всех наших проектах используются динамические расчеты итогов по первичным документам. По мере роста объема данных и при большом количестве одновременно работающих пользователей требуются специальные алгоритмы, повышающие скорость работы.
В программе ФинСофт:КупецЪ это в первую очередь касается подсчетов наценки с продаж. Рассмотрим подробнее эти алгоритмы:
· Ограничение выборок.
· Уменьшение открытого периода.
· Использование сводных итогов.
· Кэширование отчетов.
· Использование процессов.
· Создание архивов.
Ограничение выборок.
Ограничение выборок позволяет сузить количество обрабатываемой информации. Возможны два варианта. В первом случае пользователь может явно определить, что ему нужно. Во втором программа выполняет ограничение автоматически.
Откройте сводную оборотку по товарам "Отчеты"-"Сводная оборотка по товарам". Добавьте в список групп товаров для отбора какую-нибудь группу. Пусть это будет группа "Майонезы ЕРКО". Если вся продаваемая номенклатура составляет 1000 позиций, а майонезы ЕРКО 10 позиций, то скорость построения отчета по заданной группе будет примерно в 100 раз быстрее, чем по всей номенклатуре.
Откройте оборотку по товарам поставщиков "Отчеты"-"Анализ"-"Оборотка по товарам поставщиков". Этот отчет выводит сводную информацию по продажам в разрезе поставщиков и расшифровку по товарам, поставляемым конкретным поставщиком. Предположим, что нужно посмотреть итоги продаж по товарам ЗАО “Компания ОВА”, что и укажем программе, добавив запись в список поставщиков для отбора. Программа автоматически построит список товаров-кандидатов для расчета, просмотрев ближайшие остатки и приходные накладные, а затем для полученного списка выполнит расчет итогов. В результате скорость формирования отчета увеличится пропорционально доли товаров компании ОВА в общем продаваемом ассортименте.
В предыдущих двух примерах пользователь сам определял, что он хочет. Теперь рассмотрим ситуацию, когда программа самостоятельно выполняет ограничение выборки. Как правило, количество номенклатурных единиц, проходящих по актам на списание товаров за период времени существенно меньше общего количества видов продаваемых товаров. Поэтому при формировании реестра актов на списание, в котором подсчитывается себестоимость в разрезе отдельных документов, программа предварительно построит список товаров, которые списывались в заданном периоде, а затем выполнит расчеты для полученного списка. Если только Вы не продаете низкокачественный товар, скорость формирования реестра возрастает значительно. Итак, первое правило. Определитесь, какая информация Вам нужна и укажите это программе.
Уменьшение открытого периода.
Информация в программе постоянно накапливается. Чтобы не вести подсчеты с самого начала работы, периодически создаются документы остатков. Эти документы одновременно определяют граничную дату, до которой нельзя изменять другие документы. Мы придерживаемся концепции нефиксированных итогов. Иными словами, пользователь может создавать документы остатков на любой момент, исходя из скоростных показателей работы с его базой данных. Программа же автоматически проверяет наличие итогов и, если находит, то использует. Большинство отчетов содержат информацию об операциях, выполняемых в последний период времени (неделю, месяц). Оперативная информация прошлых месяцев корректируется редко. Поэтому разумным решением будет выставлять остатки на конец месяца (или квартала). В этом случае при построении оперативных отчетов будут использоваться только документы последнего месяца (квартала). Сдерживающим фактором применения описываемого алгоритма является ведение фискального учета в одной базе с оперативным учетом. Создание документов остатков не приводит к необратимым последствиям. Вы всегда может выключить остатки, внести изменения и снова включить. При этом останавливать работу других пользователей не требуется. Итак, второе правило: держите минимальный открытый период.
Использование сводных итогов.
Предположим, что Вы давно работаете с программой, накопили много информации и хотите проанализировать тенденции в развитии Вашего бизнеса за какой-то период времени. Например, за последний год или два года. В этом случае Вам очень помогут сводные итоги, использование которых в ряде случаев позволит получить нужную информацию мгновенно. Программа автоматически создает сводные обороты между документами остатков. Как и документы остатков, сводные обороты используются программой по мере их обнаружения. Иными словами, если обороты сформированы, то программа их будет использовать, если нет, то расчеты будут выполняться по первичным документам. Для получения максимального эффекта от рассматриваемого алгоритма нужно определиться с периодичностью создания документов остатков. Обычно рекомендуется использовать в качестве периода месяц, т.е. создавать документы остатков, датируя их последним днем месяца. Если количество номенклатурных единиц невелико и документооборот небольшой, то можно в качестве периода использовать квартал или полугодие. Теперь рассмотрим, как это работает на практике. Предположим, что у нас имеются сводные итоги за июнь и июль 2006 года. Откройте отчет "Отчеты"-"Анализ"-"Отчеты по продажам в разрезе месяцев". В данном примере мы хотим построить сводный отчет по продажам за период времени в разрезе поставщиков и с деталировкой по месяцам. В качестве расшифровки выводится информация в разрезе товаров конкретного поставщика также с деталировкой по месяцам. Мы специально укажем период июнь-июль 2006 года. В этом случае программа выполнит декомпозицию по периодам и суммирует сводные обороты за июнь и июль. К первичным документам обращений не будет. Результат будет выдан мгновенно. Теперь предположим, что мы хотим проанализировать продажи за период с июня по август 2006 года. За август у нас сводных итогов нет. Программа возьмет готовые итоги за июнь и июль, а за август рассчитает их динамически, используя остатки на конец июля и августовские накладные. Но и в этом случае прирост производительности будет существенным по сравнению с расчетом по первичным документам за весь период. Напрашивается вопрос, что будет делать программа, если период “рваный”. Рассмотрим ситуацию, когда мы хотим посмотреть итоги продаж с 10.06.2006 по 31.07.2006. Пример, конечно, больше теоретический. В этом случае программа суммирует сводные итоги за июнь и июль, рассчитает динамически итоги с 01.06.2006 по 09.06.2006 и вычтет последние из общего итога. Если период установлен с 01.06.2006 по 20.07.2006, то программа использует сводные итоги за июнь, а за период июля рассчитает динамически, используя остатки на конец июня и июльские накладные. Третье правило: определите периодичность, с которой вы планируете анализировать информацию и формируйте сводные итоги.
Кэширование отчетов.
Если пользователи часто формируют одни и те же отчеты, то значительно ускорить работу может использование кэширования отчетов. В этом случае, после формированиия отчета каким-либо пользователем, делается запись в специальную системную таблицу. Если другой пользователь формирует такой-же отчет, то ему будет предложено использовать результаты работы первого пользователя. Настроить кэширование отчетов можно в параметрах программы "Справочники" - "Параметры программы" - закладка "Производительность".
Использование процессов.
Если Ваш бизнес вырос, и появилась необходимость перейти от использования простой локальной сети к терминальному серверу, то обратите внимание на данный раздел. Когда программа выполняет какие-либо расчеты, требующие заметных вычислительных ресурсов, то при терминальном сервере это может отразиться на скорости работы других пользователей. Для решения этой проблемы ресурсоемкие расчеты оформляются в виде процессов. При таком подходе выполнение расчета периодически приостанавливается, что позволяет остальным пользователям без заметных задержек отработать свои задачи, например, ввести запись в накладную. Сам расчет будет выполняться медленнее, но зато не будет мешать работать другим пользователям. Это разумный компромисс. Для регулировки размера части расчета, выполняемой между приостановками, используется понятие “приоритет отчета”. В настройке программы это значение можно задать явно. Проще всего поделить 100% загруженность процессора на количество работающих пользователей. Затем подобрать нужный приоритет, выполняя ресурсоемкий отчет с одного рабочего места и контролируя загрузку процессора (диспетчер задач Windows, закладка “Производительность”). В качестве тестового отчета можно использовать “Отчет по сводным оборотам товаров” по всему ассортименту, период несколько месяцев. Подобрав нужный приоритет, можно использовать оптимизацию по количеству активных подключений. В этом случае укажите количество подключений для базового приоритета. При использовании оптимизации программа автоматически пересчитает приоритет в зависимости от количества активных пользователей. Например, Вы установили приоритет 100 для 10 пользователей. В выходные Ваш менеджер решил прийти поработать с программой. Никто больше не работает. Программа установит ему максимальный приоритет 1000, что может повысить скорость построения отчетов в несколько раз.
Создание архивов.
Модификация больших таблиц выполняется дольше за счет необходимости перестраивать индексы. Обычным методом разрешения проблемы является создание архивов. При этом часть информации периодически переносится из основных таблиц в так называемые архивные таблицы. Архивные таблицы используются при построении отчетов, но корректировать информацию в них запрещено. Процесс архивации обратимый. Информация из архива при необходимости изменений может быть восстановлена в основную таблицу. Использование архивов существенно повышает надежность работы программы и позволяет сохранять скорость записи в базу данных практически на одном уровне в течении длительного времени работы с программой. Как правило, информация быстро накапливается в отдельных конкретных таблицах. В программе ФинСофт:КупецЪ используется архивирование только табличных частей накладных и лога изменений базы данных. Пользователь при работе и не замечает, что часть информации перенесена в архив, до тех пор, пока ему вдруг не захочется что-то в ней изменить. Рекомендуется архивировать табличные части накладных раз в год, когда исчезает вероятность корректировки информации прошлого периода. Контролировать размер таблиц можно в диалоге технического обслуживания. Если объем информации в табличных частях накладных невысок (например, в пределах 100 МБ), то можно обойтись без архивирования. Последнее правило: периодически переносите информацию из рабочих таблиц в архивы.