На одном из клиентов (версия системы 4.0, SQL 2005) стала жутко тормозить форма обработки фактуры по накладной клиента.
Причина - FactureEditLinesEngineCust_RU.dsExecuteMarkup
Там в один курсор пытаются вернуть как markupTrans относящиеся к шапке, так и к строкам. Но поскольку обычные подзапросы в аксапте не работают, связка по шапке добавлена внутрь связки по строкам
X++:
select markupCursor
where markupCursor.CustVendPosted_RU &&
! markupCursor.ItemPosted_RU
exists join tTrans
where (
markupCursor.TransTableId == tTrans.TableId &&
markupCursor.TransRecId == tTrans.RecId &&
tTrans.SalesId == tJour.SalesId &&
tTrans.InvoiceId == tJour.InvoiceId &&
tTrans.InvoiceDate == tJour.InvoiceDate &&
tTrans.NumberSequenceGroup == tJour.NumberSequenceGroup
)
||
(
markupCursor.TransTableId == tJour.TableId &&
markupCursor.TransRecId == tJour.RecId
);
В SQL приходит следующее:
SELECT *
FROM MARKUPTRANS A
WHERE (A.DATAAREAID='exp' AND A.CUSTVENDPOSTED_RU<>0 AND A.ITEMPOSTED_RU=0) AND
EXISTS (SELECT 'x' FROM CUSTINVOICETRANS B
WHERE (B.DATAAREAID='exp' AND
((A.TRANSTABLEID=64 AND A.TRANSRECID=B.RECID AND B.SALESID='РКЗП-00032212' AND B.INVOICEID='14294-11' AND
B.INVOICEDATE='2012-03-13 00:00:00.000' AND B.NUMBERSEQUENCEGROUP='ТД') OR
(A.TRANSTABLEID=62 AND A.TRANSRECID=5637435947) )))
Если сделать по нормальному, то все работает быстро. Но как это можно написать в Аксапте одним запросом непонятно.
SELECT * FROM MARKUPTRANS A
WHERE (A.DATAAREAID='exp' AND A.CUSTVENDPOSTED_RU=0 AND A.ITEMPOSTED_RU=0) AND
((A.TRANSTABLEID=62 AND A.TRANSRECID=5637435947) OR
EXISTS (SELECT 'x' FROM CUSTINVOICETRANS B
WHERE (B.DATAAREAID='exp' AND
((A.TRANSTABLEID=64 AND A.TRANSRECID=B.RECID AND B.SALESID='РКЗП-00032212' AND B.INVOICEID='14294-11' AND
B.INVOICEDATE='2012-03-13 00:00:00.000' AND B.NUMBERSEQUENCEGROUP='ТД') ))))
PS: Индексы перестраивались, статистика обновлялась
PSS: План запроса во вложении (переименован в txt для загрузки)