|
09.06.2007, 05:00 | #1 |
Участник
|
Фактуры. Помогите с запросом.
Здравия всем...
Вот такой вот запросик при обработке фактур занимает сейчас секунд 30 минимум при выполнении... Местонахождение - classes\FactureCalcSettlement_RU\calcFactureAmounts line 50 X++: // Process line markups while select sum(LineAmount), sum(VAT), sum(TaxAmount),sum(Qty), maxOf(ItemName) from factureTrans group by TaxCode, Dimension, ExchRate,InventTransId, InternalInvoiceId,InvoiceId,NumberSequenceGroup,markupRefRecId exists join custVendInvoiceTrans exists join markupTrans where factureTrans.FactureId == _factureJour.FactureId && factureTrans.Module == module && factureTrans.FactureLineType == FactureLineType_RU::Markup && markupTrans.RecId == factureTrans.MarkupRefRecId && markupTrans.TransTableId == custVendInvoiceTrans.TableId && custVendInvoiceTrans.RecId == markupTrans.TransRecId && custVendInvoiceTrans.SalesPurchId == _custVendInvoiceJour.Num && custVendInvoiceTrans.InvoiceNum == _custVendInvoiceJour.InvoiceId && custVendInvoiceTrans.InvoiceDate == _custVendInvoiceJour.InvoiceDate && (module == FactureModule_RU::Cust || (module == FactureModule_RU::Vend && custVendInvoiceTrans.PurchInternalInvoiceId == _custVendInvoiceJour.PurchInternalInvoiceId)) && custVendInvoiceTrans.NumberSequenceGroupId == _custVendInvoiceJour.NumberSequenceGroupId { this.addFactureTransAmounts(factureAmounts, factureTrans, _factureJour); } X++: // Process line markups while select sum(LineAmount), sum(VAT), sum(TaxAmount),sum(Qty), maxOf(ItemName) from factureTrans group by TaxCode, Dimension, ExchRate,InventTransId, InternalInvoiceId,InvoiceId,NumberSequenceGroup,markupRefRecId where factureTrans.FactureId == _factureJour.FactureId && factureTrans.Module == module && factureTrans.FactureLineType == FactureLineType_RU::Markup exists join markupTrans where markupTrans.RecId == factureTrans.MarkupRefRecId && markupTrans.TransTableId == custVendInvoiceTrans.TableId exists join custVendInvoiceTrans where custVendInvoiceTrans.RecId == markupTrans.TransRecId && custVendInvoiceTrans.SalesPurchId == _custVendInvoiceJour.Num && custVendInvoiceTrans.InvoiceNum == _custVendInvoiceJour.InvoiceId && custVendInvoiceTrans.InvoiceDate == _custVendInvoiceJour.InvoiceDate && (module == FactureModule_RU::Cust || (module == FactureModule_RU::Vend && custVendInvoiceTrans.PurchInternalInvoiceId == _custVendInvoiceJour.PurchInternalInvoiceId)) && custVendInvoiceTrans.NumberSequenceGroupId == _custVendInvoiceJour.NumberSequenceGroupId { this.addFactureTransAmounts(factureAmounts, factureTrans, _factureJour); } |
|
09.06.2007, 08:06 | #2 |
Участник
|
Где то видел на форуме, что второй вариант правильнее. Да вы выгрузите куда нибудь результат по какому нибудь столбцу и сверьте. Будете точно уверены, что нигде не ошиблись.
|
|
09.06.2007, 08:58 | #3 |
Участник
|
Все правильно. Это место практически все переделывают, так как при exists join очень важно, чтобы в условии подзапроса не было фильтрации основного запроса (если посмотреть запрос, который отправляется на сервер в первом случае, станет понятно почему).
Кстати ,еще одним вариантам переделки является изменение exist join на простой join RecId - в этом случае сервер сам справится с оптимизацией запроса. |
|
09.06.2007, 13:22 | #4 |
Участник
|
Большое спасибо за ответы :-)
|
|
09.06.2007, 15:23 | #5 |
Участник
|
а разве это в последних сервис паках не было исправлено? У вас какой, кстати?
|
|
12.06.2007, 15:15 | #6 |
Участник
|
У нас SP3 стоит...
|
|
12.06.2007, 16:57 | #7 |
SAP
|
Цитата:
так как при exists join очень важно, чтобы в условии подзапроса не было фильтрации основного запроса
|
|
12.06.2007, 17:01 | #8 |
Участник
|
Цитата:
X++: select .... from table where (select * from table2...) X++: select ... from table exists join table2 |
|
12.06.2007, 17:08 | #9 |
SAP
|
Цитата:
чтобы в условии подзапроса не было фильтрации основного запроса
X++: select table1 where table1.field1 == "11" exists join table2 where table2.field1 == table1.field1 X++: select .... from table where (select * from table2...) X++: select ... from table exists join table2 Последний раз редактировалось konopello; 12.06.2007 в 17:11. |
|
12.06.2007, 17:12 | #10 |
Участник
|
1. Это уже исправлено в последних сервис паках.
2. Нет, по-моему в приведенном вами примере все уйдек как надо. Глюки будут, если в подзапросе есть фильтрация полей основного запроса, к примеру X++: select table1 where table1.field1 == "11" exists join table2 where table1.field3 == "321" && table2.field1 == table1.field1; |
|
|
За это сообщение автора поблагодарили: konopello (1). |
12.06.2007, 17:19 | #11 |
SAP
|
Благодарствю за ответ, хорошо что у меня нет привычки писать такие запросы.
|
|
14.06.2007, 05:08 | #12 |
Участник
|
Продолжаем эпопею с фактурами dsExecuteMarkup() класса FactureEditLinesEngineVend_RU
В методе X++: public void dsExecuteMarkup() { MarkupTrans markupCursor = markupDS.cursor(); VendInvoiceJour tJour = vendInvoiceJourDS.cursor(); VendInvoiceTrans tTrans; super(); select markupCursor where markupCursor.CustVendPosted_RU && ! markupCursor.ItemPosted_RU exists join tTrans where ( markupCursor.TransTableId == tTrans.TableId && markupCursor.TransRecId == tTrans.RecId && tTrans.PurchID == tJour.PurchId && tTrans.InvoiceId == tJour.InvoiceId && tTrans.InvoiceDate == tJour.InvoiceDate && tTrans.NumberSequenceGroup == tJour.NumberSequenceGroup && tTrans.InternalInvoiceId == tJour.InternalInvoiceId ) || ( markupCursor.TransTableId == tJour.TableId && markupCursor.TransRecId == tJour.RecId ); } Так вот теоретический вопрос: Почему в подзапросе начинается проверка вида X++: markupCursor.TransTableId == tTrans.TableId && markupCursor.TransRecId == tTrans.RecId markupCursor.TransTableId == tJour.TableId && markupCursor.TransRecId == tJour.RecId То есть X++: tTrans.TableId == markupCursor.TransTableId && tTrans.RecId == markupCursor.TransRecId А вот сам sql запрос X++: SELECT A.TRANSTABLEID,A.TRANSRECID,A.LINENUM,A.MARKUPCODE, A.CURRENCYCODE,A.VALUE,A.TAXAMOUNT,A.POSTED,A.VOUCHER, A.TRANSDATE,A.TXT,A.TAXGROUP,A.TAXITEMGROUP,A.MARKUPCATEGORY, A.TAXAUTOGENERATED,A.TAXWRITECODE,A.MODULECATEGORY,A.ORIGRECID, A.ORIGTABLEID,A.MODULETYPE,A.DEL_FULLYINVOICED,A.KEEP, A.CALCULATEDAMOUNT,A.FACTUREDAMOUNT_RU,A.CUSTVENDPOSTED_RU, A.ITEMPOSTED_RU,A.TAXVALUEVAT_RU,A.TAXAMOUNTVAT_RU, A.TAXAMOUNTEXCISE_RU,A.TAXVATTYPE_RU,A.SOURCETABLEID, A.SOURCERECID,A.MARKUPALLOCATEAFTER,A.INVENTTRANSID,A.RECID FROM MARKUPTRANS A WHERE ((A.DATAAREAID='ret') AND ((A.CUSTVENDPOSTED_RU<>0) AND ((A.ITEMPOSTED_RU=0)))) AND EXISTS (SELECT 'x' FROM VENDINVOICETRANS B WHERE ((B.DATAAREAID='ret') AND (((((([COLOR="Red"] ((A.TRANSTABLEID=492) [/COLOR]A[COLOR="#ff0000"]ND (A.TRANSRECID=B.RECID[/COLOR])) AND (B.PURCHID=' ???00019730')) AND (B.INVOICEID=' 15548')) AND (B.INVOICEDATE={ts '2005-10-02 00:00:00.000'})) AND (B.NUMBERSEQUENCEGROUP=' ')) AND (B.INTERNALINVOICEID=' ???00013750')) [COLOR="#ff0000"]OR ((A.TRANSTABLEID=491) AND (A.TRANSRECID=277411563))[/COLOR]))) ORDER BY A.DATAAREAID,A.TRANSRECID,A.TRANSTABLEID,A.LINENUM OPTION(FAST 1) На предложение "возьми да и проверь" могу ответить лишь отказом ибо почему-то даже при известных данных без изменений этот запрос выдает пустую результирующую табличку... Хотя подозреваю, что где-то что-то не так делаю :-) |
|
15.06.2007, 15:18 | #13 |
Участник
|
Цитата:
Сообщение от Михаил Петрович
Почему в подзапросе начинается проверка вида
X++: markupCursor.TransTableId == tTrans.TableId && markupCursor.TransRecId == tTrans.RecId markupCursor.TransTableId == tJour.TableId && markupCursor.TransRecId == tJour.RecId Код: select * from markupTrans m join vendInvoiceTrans t on m.transTableId = t.tableId and m.transRecId = t.recId |
|
18.06.2007, 02:33 | #14 |
Участник
|
Спасибо за разъяснение!
А идей по ускорению сей процедуры случайно нет?.. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Помогите с запросом | 4 | |||
Помогите с запросом | 40 | |||
Помогите с запросом.. | 2 | |||
Помогите с SQL запросом | 8 | |||
Пожалуйста, помогите с запросом | 19 |
|