Показать сообщение отдельно
Старый 20.03.2012, 12:34   #1  
malex is offline
malex
Участник
 
164 / 19 (1) ++
Регистрация: 10.08.2004
Адрес: Тверь, Москва
Post Оптимизация запросов: CustInvoiceTrans + markupTrans
На одном из клиентов (версия системы 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 для загрузки)
Вложения
Тип файла: txt planMarkupTrans.txt (58.3 Кб, 453 просмотров)

Последний раз редактировалось malex; 20.03.2012 в 12:39.