Коллеги поделитесь опытом.
Столкнулся с такой проблемой.
Есть метод
\Data Dictionary\Tables\FactureJour_RU\Methods\invoiceJourSortedList_CustVend
в нем исполняется запрос
X++:
while select custVendInvoiceJour
exists join factureTrans
where custVendInvoiceJour.InvoiceAccount == this.CustVendInvoiceAccount &&
factureTrans.Module == this.Module &&
factureTrans.FactureId == this.FactureId &&
(factureTrans.FactureLineType == FactureLineType_RU::InvoiceLine ||
factureTrans.FactureLineType == FactureLineType_RU::InvoiceEndDisc ||
factureTrans.FactureLineType == FactureLineType_RU::InvoiceRoundOff) &&
factureTrans.InvoiceDate == custVendInvoiceJour.InvoiceDate &&
factureTrans.InvoiceId == custVendInvoiceJour.InvoiceId &&
factureTrans.SalesPurchId == custVendInvoiceJour.Num &&
factureTrans.NumberSequenceGroup == custVendInvoiceJour.NumberSequenceGroupId &&
(this.Module == FactureModule_RU::Cust ||
(this.Module == FactureModule_RU::Vend &&
factureTrans.InternalInvoiceId == custVendInvoiceJour.PurchInternalInvoiceId))
{
if (! ret.find(custVendInvoiceJour))
{
ret.ins(custVendInvoiceJour);
}
}
из-за Exists Join оракл сперва пытается фильтровать и сортировать custVendInvoiceJour а затем для каждой записи выполняет подзапрос. Из-за это БД жутко нагружена.
Подобные же проблемы есть в методах
\Data Dictionary\Tables\FactureJour_RU\Methods\invoiceJourSortedList_TaxCorrection
\Data Dictionary\Maps\CustVendInvoiceJour\Methods\factureJourSortedList_RU
Как вы решали эти проблемы ?
Есть ли возможность заставить оракл (не изменяя запрос в Аксапте) сначала отфильтровать подзапрос, который сидит в Exists Join , а потом уже обрабатывать custVendInvoiceJour ?
В MS SQL такие проблемы встрачались ?
Я пока придумал только такой способ :
изменить
Exist Join factureTrans
на
Inner join TableId from factureTrans
в таком случае обе таблицы становятся равноправными в запросе. БД сперва обрабатывает FactureTrans - сужает выборку FactureTrans до числа строчек из одной фактуры и для такой маленькой выборки уже получает и сортирует шапки custVendInvoiceJour.
Производительность резко выросла. Нагрузка на БД упала многократно.
Незначительно выросла нагрузка на АОС из-за того что в результате выборки получается не одна запись, а столько сколько было строчек в фактуре и они все перебираются в цикле. Но это мелочь.
P.S.
Ax 3.0 SP3