AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.07.2009, 12:21   #1  
Kashesh is offline
Kashesh
Участник
 
29 / 10 (1) +
Регистрация: 08.12.2004
Адрес: Саров
Нужна помощь в оптимизации сложного запроса
Всем добрый день!
Столкнулся с проблемой оч медленного раскрытия лукапа. Да, запрос там сложный, но как ни старался, все равно медленно открывается, может кто подскажет как еще можно упростить..
Задача на всякий случай состояла отобрать счета-фактуры, имеющие открытые проводки.
Запрос в мониторинге получился следующий:
X++:
SELECT A.FACTUREID,A.FACTUREDATE,A.FACTUREAMOUNT,A.FACTURETAX,A.CURRENCYCODE,A.CUSTVENDINVOICEACCOUNT,A.FACTUREEXTERNALID,A.NUMBERSEQUENCEGROUPID,A.NONREALREVENUE,A.OFFSESSIONID,A.CONSIGNEE,A.FACTUREROUNDOFF,A.CONSIGNOR,A.PRINTINMST,A.MODULE,A.FACTURETYPE,A.DOCUMENTNUM,A.DOCUMENTDATE,A.REVERSED,A.VOUCHER,A.CUSTVENDTRANSRECID,A.POSTINGLOGRECID,A.LANGUAGEID,A.DELIVERYADDRESS,A.FACTUREDATE_EXTERNAL,A.REVERSEDATE,A.KDV_STORNOFACTUREEID,A.KDV_STORNO,A.KDV_PRINTFACTUREEID,A.KDV_PRINTFACTUREEIDEDIT,A.KDV_PRINTFACTUREID,A.KDV_STORNOINVOICEID,A.KDV_STORNORECID,A.KDV_OLDPRINTFORM,A.MODIFIEDDATE,A.MODIFIEDTIME,A.RECVERSION,A.RECID
FROM FACTUREJOUR_RU A WITH( NOLOCK)
WHERE ((A.DATAAREAID='SLK') AND (((A.MODULE=0) AND (A.CUSTVENDINVOICEACCOUNT='Ю-РЕЧТРАНС')) AND (A.FACTUREID>='СФВК-051145'))) 

AND EXISTS (SELECT 'X'
FROM FACTURETRANS_RU B WITH( NOLOCK)
WHERE ((B.DATAAREAID='SLK') AND ((A.FACTUREID=B.FACTUREID) AND (A.MODULE=B.MODULE)))

AND EXISTS (SELECT 'X'
FROM CUSTINVOICETRANS C WITH( NOLOCK)
WHERE ((C.DATAAREAID='SLK') AND (((((((B.MODULE=0) AND (B.FACTURELINETYPE=0)) AND (B.INVOICELINENUM=C.LINENUM)) AND (B.INVOICEDATE=C.INVOICEDATE)) AND (B.INVOICEID=C.INVOICEID)) AND (B.SALESPURCHID=C.SALESID)) AND (B.NUMBERSEQUENCEGROUP=C.NUMBERSEQUENCEGROUP)))

AND EXISTS (SELECT 'X'
FROM CUSTINVOICEJOUR D WITH( NOLOCK)
WHERE ((D.DATAAREAID='SLK') AND ((((C.SALESID=D.SALESID) AND (C.INVOICEID=D.INVOICEID)) AND (C.INVOICEDATE=D.INVOICEDATE)) AND (C.NUMBERSEQUENCEGROUP=D.NUMBERSEQUENCEGROUP))) 

AND EXISTS (SELECT 'X'
FROM CUSTTRANS E WITH( NOLOCK)
WHERE ((E.DATAAREAID='SLK') AND (((D.INVOICEID=E.INVOICE) AND (D.INVOICEACCOUNT=E.ACCOUNTNUM)) AND (D.INVOICEDATE=E.TRANSDATE)))

AND EXISTS (SELECT 'X'
FROM CUSTTRANSOPEN F WITH( NOLOCK)
WHERE ((F.DATAAREAID='SLK') AND ((E.ACCOUNTNUM=F.ACCOUNTNUM) AND (E.RECID=F.REFRECID))))))))
ORDER BY A.FACTUREID,A.MODULE OPTION(FAST 1)
Может надо указывать в запросе только поля, которые находятся в лукапе, по мне кажется в таблицах не так много полей, чтобы этим выигрывать время..
Старый 31.07.2009, 12:37   #2  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Добавьте в последний запрос фильтр по клиенту
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
Старый 31.07.2009, 12:42   #3  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Простая проверка на пустое поле FactureJour_RU.voucher Вам не подойдёт ?
Старый 31.07.2009, 13:06   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Zabr Посмотреть сообщение
Простая проверка на пустое поле FactureJour_RU.voucher Вам не подойдёт ?
По-моему это немного не то, поскольку поле voucher заполняется только для фактур по предоплатам, в остальных случаях оно пустое

Цитата:
Сообщение от Kashesh Посмотреть сообщение
X++:
SELECT A.FACTUREID,A.FACTUREDATE,A.FACTUREAMOUNT,A.FACTURETAX,A.CURRENCYCODE,A.CUSTVENDINVOICEACCOUNT,A.FACTUREEXTERNALID,A.NUMBERSEQUENCEGROUPID,A.NONREALREVENUE,A.OFFSESSIONID,A.CONSIGNEE,A.FACTUREROUNDOFF,A.CONSIGNOR,A.PRINTINMST,A.MODULE,A.FACTURETYPE,A.DOCUMENTNUM,A.DOCUMENTDATE,A.REVERSED,A.VOUCHER,A.CUSTVENDTRANSRECID,A.POSTINGLOGRECID,A.LANGUAGEID,A.DELIVERYADDRESS,A.FACTUREDATE_EXTERNAL,A.REVERSEDATE,A.KDV_STORNOFACTUREEID,A.KDV_STORNO,A.KDV_PRINTFACTUREEID,A.KDV_PRINTFACTUREEIDEDIT,A.KDV_PRINTFACTUREID,A.KDV_STORNOINVOICEID,A.KDV_STORNORECID,A.KDV_OLDPRINTFORM,A.MODIFIEDDATE,A.MODIFIEDTIME,A.RECVERSION,A.RECID
FROM FACTUREJOUR_RU A WITH( NOLOCK)
WHERE ((A.DATAAREAID='SLK') AND (((A.MODULE=0) AND (A.CUSTVENDINVOICEACCOUNT='Ю-РЕЧТРАНС')) AND (A.FACTUREID>='СФВК-051145'))) 
 
AND EXISTS (SELECT 'X'
FROM FACTURETRANS_RU B WITH( NOLOCK)
WHERE ((B.DATAAREAID='SLK') AND ((A.FACTUREID=B.FACTUREID) AND (A.MODULE=B.MODULE)))
 
AND EXISTS (SELECT 'X'
FROM CUSTINVOICETRANS C WITH( NOLOCK)
WHERE ((C.DATAAREAID='SLK') AND (((((((B.MODULE=0) AND (B.FACTURELINETYPE=0)) AND (B.INVOICELINENUM=C.LINENUM)) AND (B.INVOICEDATE=C.INVOICEDATE)) AND (B.INVOICEID=C.INVOICEID)) AND (B.SALESPURCHID=C.SALESID)) AND (B.NUMBERSEQUENCEGROUP=C.NUMBERSEQUENCEGROUP)))
 
AND EXISTS (SELECT 'X'
FROM CUSTINVOICEJOUR D WITH( NOLOCK)
WHERE ((D.DATAAREAID='SLK') AND ((((C.SALESID=D.SALESID) AND (C.INVOICEID=D.INVOICEID)) AND (C.INVOICEDATE=D.INVOICEDATE)) AND (C.NUMBERSEQUENCEGROUP=D.NUMBERSEQUENCEGROUP))) 
 
AND EXISTS (SELECT 'X'
FROM CUSTTRANS E WITH( NOLOCK)
WHERE ((E.DATAAREAID='SLK') AND (((D.INVOICEID=E.INVOICE) AND (D.INVOICEACCOUNT=E.ACCOUNTNUM)) AND (D.INVOICEDATE=E.TRANSDATE)))
 
AND EXISTS (SELECT 'X'
FROM CUSTTRANSOPEN F WITH( NOLOCK)
WHERE ((F.DATAAREAID='SLK') AND ((E.ACCOUNTNUM=F.ACCOUNTNUM) AND (E.RECID=F.REFRECID))))))))
ORDER BY A.FACTUREID,A.MODULE OPTION(FAST 1)
Может надо указывать в запросе только поля, которые находятся в лукапе, по мне кажется в таблицах не так много полей, чтобы этим выигрывать время..
Что бросается в глаза сразу :

1. CustInvoiceTrans здесь лишний, можно без него (посмотрите relation на FactureTrans_RU к CustInvoiceJour)

2. Связь с CustTrans было бы нелохо строить по полям (e.voucher = d.ledgerVoucher, e.accountNum = d.invoiceAccount, e.transdate = d.invoicedate), но для этого нужно проверить, чтобы у вас все проводки по клиентам, имели тот же voucher, что и накладные создавшие данные проводки
Также можно добавить индекс на custTrans по полям запроса, или включить поле Invoice в уже сущетсвующие индексы

3. Также может быть Вам поможет добавление индекса на таблице FactureJour_RU - (factureId, custVendInvoiceAccount, module)

4. Кстати, насчет полей в связанных таблицах, возможно если оставить только индексированные поля, то поиск будет быстрее

Вы написали, что запрос тяжелый , а сами план запроса не выложили, непонятно где у вас "тупит" запрос, можно только гадать.

Если можно :

1. Выложите план запроса из AX и его cost в AX(SQL трассировка запросов)
2. И если есть доступ на СУБД, выполните его там и выложите сюда cost из СУБД.

Поверьте, чем больше информации будет предоставлено, тем легче будет Вам помочь
__________________
Sergey Nefedov

Последний раз редактировалось SRF; 31.07.2009 в 13:34. Причина: добавлен пункт 3
Старый 31.07.2009, 13:52   #5  
Kashesh is offline
Kashesh
Участник
 
29 / 10 (1) +
Регистрация: 08.12.2004
Адрес: Саров
Цитата:
Сообщение от SRF Посмотреть сообщение
1. Выложите план запроса из AX и его cost в AX(SQL трассировка запросов)
2. И если есть доступ на СУБД, выполните его там и выложите сюда cost из СУБД.
1. А что именно имеется ввиду? Дерево в плане исполнения? или что, не понимаю.
2. Я не знаю как это сделать в SQL, если подскажите, по попробую сделать и там
Старый 31.07.2009, 15:08   #6  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Kashesh Посмотреть сообщение
1. А что именно имеется ввиду? Дерево в плане исполнения? или что, не понимаю.
2. Я не знаю как это сделать в SQL, если подскажите, по попробую сделать и там
1. Да, имелось ввиду дерево в плане исполнения, извините, если не правильно высказался

2. Ну тут нужно смотреть какие средства есть у СУБД, к примеру, если у вас
MS SQL 2005 то можно использовать вот этот инструмент Database Engine Tuning Advisor ( http://msdn.microsoft.com/en-us/library/ms166575.aspx )
__________________
Sergey Nefedov
Старый 31.07.2009, 16:30   #7  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
всетаки добавьте условие по
CustTrans.AccountNum = 'Ю-РЕЧТРАНС'
CustTransOpen.AccountNum = 'Ю-РЕЧТРАНС'
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
Теги
оптимизация

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Срочно нужна помощь по платежам Blondinka_N DAX: Функционал 8 06.08.2008 14:10
Нужна помощь. Alex_B DAX: Программирование 9 19.07.2006 18:01
опять нужна помощь новичку Sada DAX: Функционал 18 01.04.2005 12:42
Очень нужна Ваша помощь!!! Vasilenko Alexsandr DAX: Прочие вопросы 2 05.11.2003 11:51
Управление резервированием - нужна помощь! Pavlo AKA Panok DAX: Программирование 8 25.03.2003 14:23

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:03.