Показать сообщение отдельно
Старый 07.12.2007, 14:17   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,887 / 3152 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Проблемы с Exists Join
Коллеги поделитесь опытом.
Столкнулся с такой проблемой.
Есть метод
\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