Задача 102.121038

Задача :102.121038

Краткое описание :
Оптимизация алгоритма расчета остатков на дату с созданием таблиц на стороне БД
Описание :
Предложение по новой функциональности модуля Складской учет
Что измененно :
Оптимизация алгоритма расчета остатков на дату с созданием
таблиц на стороне БД.
В текущем алгоритме все записи из таблицы Pick записываются в таблицу PlTune и
фильтр накладывается из этой таблицы условием where...in (select...
Если заменить алгоритм выгрузки пиков в физ. таблицу на таблицы создаваемые на
стороне БД, и подцепить их через join, то можно было бы выйграть не только в
быстродействии отработки самого запроса, но и перегрузку записей из пик в физ.
таблицу заменить одним запросом, т.к. в данный момент значительную часть
времени занимает данная перегрузка.

Пример кода создания таблицы Pick на стороне сервера:
function createPickTable(_pickTbl: integer): boolean;
{
result := false;

var hstr: longint;
hstr := 0;
var tblName: string[15];

tblName := 'pick_' + _pickTbl;
sqlDropTmpTable(tblName);

sqlAddStr(hstr, ' table ' + tblName );
sqlAddStr(hstr, ' ( ');
sqlAddStr(hstr, ' nRec: comp ');
sqlAddStr(hstr, ' ) ');
sqlAddStr(hstr, ' with index ');
sqlAddStr(hstr, '( ');
sqlAddStr(hstr, tblName + '0 = nRec ');
sqlAddStr(hstr, '); ');

var sql_result: integer;
sql_result := sqlCreateTmpTable(hstr, ctmNormal);

if sql_result <> tsOk
Message('Ошибка создания временной таблицы "' + tblName + '". Код ошибки:
[' + Sql_result + '].', Error);
else
result := true;

sqlFreeStmt(hstr);
}

Пример перегрузки из Pick в созданную таблицу на стороне БД:
function fillFiltFromPick(_pickConst: integer): boolean;
{
result := false;
pickConst := _pickConst;

var cntRec: longint;
cntRec := 0;
if getFirst pick = tsOk
{
if mtFlush(#Pick, mfFull) = tsOk// сброс изменений из Pick в БД
if mtRetrieve(#Pick, mfClear + mfFull) = tsOk // подымаем из бд данные
в память
if (sqlExecDirect('insert pick_' + _pickConst + ' (nRec) ' +
'select CREC from Pick ' +
'where (wList = #comp(' + string(cgPick_MC) + '))') =
tsOk)
{
cntRec++
}
}

if (cntRec > 0) and (cntRec < recordsInTable(#katMc))
result := true;
}

Данные функции можно вызывать из общей:
function filtPick(_pickConst: integer): boolean;
{
result := false;

if not(createPickTable(_pickConst))
exit;

if not(fillFiltFromPick(_pickConst))
exit;

result := true;
}

При этом создаваемые таблицы подключать в общий запрос уже можно через
иннерджоин:
if bFltMC
sqlAddStr(lQSpOrd, 'inner join pick_' + cgPick_MC + ' on spOrder.cMC =
pick_' + cgPick_MC + '.nRec ');

В качестве констант решено использовать константы из файла pick.inc/
Как измененно :
Относится к: Отчет наличия по МОЛ, Отчет наличия по
подразделению, Ведомость неликвидов.
Платформа: Oracle, SQL Server.
В алгоритме расчета сальдовых остатков на дату фильтры записываются в
созданную на стороне сервера временные таблицы. В следствии чего, удалось
повысить быстродействие самого расчета.
Быстродействие выполнения функции расчета сальдовых остатков на дату удалось
увеличить за счет сокращения времени обработки запроса на стороне сервера.
Повысить быстродействие за счет копирования записей из таблицы Pick не удалось.
При установке множества фильтров увеличение производительности может достигать
18 раз. Прирост производительности зависит от количества установленных фильтров
- чем больше установлено фильтров, тем выше прирост производительности.

Название продукта Название компонента Тип Последняя версия Дата выхода
L_OSTATKIL_OSTATKIRES9.1.6.0