AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 22.06.2007, 07:41   #1  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Почему join запрос разбивается на подзапросы!?
Axapta 3.0 SP 3

Имеем запрос:

Code:
    while select _rassetTable
        index RAssetNumIdx
        where _rassetTable.VGP_PropertyTax          == NoYes::Yes
    join firstonly _rassetTrans
        index TransTypeIdx
        where _rassetTrans.AccountNum               == _rassetTable.AccountNum          &&
              _rassetTrans.AssetTransType           == RAssetTransType::Acquisition     &&
              _rassetTrans.TransDate                <= reportDateEnd
    join firstonly _ledgerTrans
        index VGP_LedgerLinkIdx
        where _ledgerTrans.VGP_LedgerLinkId         == _rassetTrans.VGP_LedgerLinkId    &&
              _ledgerTrans.VGP_LedgerLinkModuleRef  == VGP_LedgerLinkModuleRef::RAsset  &&
              _ledgerTrans.Voucher                  == _rassetTrans.Voucher             &&
              _ledgerTrans.TransDate                == _rassetTrans.TransDate
{
	…….
	//Не значительный код, заполняется мап
}
При просмотре системным монитором видим:
Кол-во Select 4837 !!!!!?!?!? Почему?! Запрос отрабатывает порядка 25 минут

Написал такой же запрос в SQL Enterprise Manager отработал за 5 секунд!!
Прямой запрос, вставлять в код не очень хочется … .. . Подскажите в чём дело и что можно сделать?!
Alt 22.06.2007, 09:25   #2  
kashperuk ist offline
kashperuk
Участник
Benutzerbild von kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.361 / 2084 (78) +++++++++
Registriert seit: 30.05.2004
Ort: Atlanta, GA, USA
Хм. А пробовали убрать firstonly?
Вполне возможно, что для каждой записи rAssetTable делается поиск записи соответствия свой вместо простого объединения таблиц.
(как будто бы join вообще не было, а в теле while Вы отдельно искали требуемые записи)

Хотя, это всего лишь предположение - возможно кто-то поправит.
This post has been rated by: 3oppo (1).
Alt 22.06.2007, 09:29   #3  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2499 (89) +++++++++
Registriert seit: 20.08.2005
Интересно, а какой, по вашему, запрос должен сформироваться?
__________________
Axapta v.3.0 sp5 kr2
This post has been rated by: 3oppo (1).
Alt 22.06.2007, 09:40   #4  
glibs ist offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4.942 / 911 (40) +++++++
Registriert seit: 10.06.2002
Ort: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Уровень кэширования на таблице RAssetTable у вас стандартный? Это не экземпляр временной таблицы? Запросы всегда разбиваются, если в них включена таблица с уровнем кэширования EntireTable или временная таблица.
__________________
С уважением,
glibs®
This post has been rated by: zemlyn (1), kashperuk (5), Мариночка (2), 3oppo (1).
Alt 22.06.2007, 11:02   #5  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Да пробовал убирать firstonly без результатно!

X++:
    while select RPayJournalTable
        where RPayJournalTable.JournalId == 'ЗП000628'
    join RPayJournalTrans
        where RPayJournalTrans.JournalId ==  RPayJournalTable.JournalId
    join RPayTrans
        where RPayTrans.SourceRecId     == RPayJournalTrans.RecId
    {
         i++;
    }
    box::info( int2str(i) );
Вот этот код выполняется за 2 select-a

to AndyD ну уж никак не из 4000 селектов!
RAssetTable стандартно не каких временных таблиц!
Alt 22.06.2007, 18:04   #6  
MPAKObec ist offline
MPAKObec
Участник
 
4 / 11 (1) +
Registriert seit: 06.06.2007
Насколько я понял firstonly в join-ах вообще игнорируются. У меня тоже как то получалось что join разбивал select но я так и не разобрался в чём там дело. Просто используй «прямой запрос» к базе, сам так делал. Выигрыш в скорости в РАЗЫ!!
This post has been rated by: 3oppo (1).
Alt 22.06.2007, 18:09   #7  
MPAKObec ist offline
MPAKObec
Участник
 
4 / 11 (1) +
Registriert seit: 06.06.2007
А вы. Не пробовали использовать стандартные Query?! Он вроде как быстрее должен работать!
Alt 22.06.2007, 18:36   #8  
glibs ist offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4.942 / 911 (40) +++++++
Registriert seit: 10.06.2002
Ort: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Попробовал написать джоб похожий (на стандартной функциональности только). Select один при декларировании курсора. Дольше идут вызовы управления курсором.

Либо вы чего-то не договариваете...

А какой вид у вас имеют все 4837 запроса? Они абсолютно одинаковы? Может у вас сам метод столько раз вызывается? Тогда не удивлюсь насчет 25 мин.
__________________
С уважением,
glibs®
Alt 22.06.2007, 21:58   #9  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von MPAKObec Beitrag anzeigen
Просто используй «прямой запрос» к базе, сам так делал. Выигрыш в скорости в РАЗЫ!!
Прямой запрос означает полный отказ от поддерки ядра
Прямой запрос в разы сложнее отлаживать и в разы дороже в сопровождении.
Прежде чем следовать совету МРАКОбеса триджы подумайте.
__________________
полезное на axForum, github, vk, coub.
This post has been rated by: 3oppo (1).
Alt 25.06.2007, 08:32   #10  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Zitat:
Zitat von glibs Beitrag anzeigen
Попробовал написать джоб похожий (на стандартной функциональности только). Select один при декларировании курсора. Дольше идут вызовы управления курсором.

Либо вы чего-то не договариваете...
.

Вот метод полностью:

X++:
protected Map initRasset01Map()
{
    Map             _ret          = new Map(Types::String, Types::Date);
    Set             _account01Set = this.initAccount01Set();
    RAssetTable     _rassetTable;
    RAssetTrans     _rassetTrans;
    LedgerTrans     _ledgerTrans;
    int             i, ip4, ip2, ip3;

    while select _rassetTable
       index RAssetNumIdx
        where _rassetTable.VGP_PropertyTax          == NoYes::Yes
    join firstonly _rassetTrans
        index TransTypeIdx
        where _rassetTrans.AccountNum               == _rassetTable.AccountNum          &&
              _rassetTrans.AssetTransType           == RAssetTransType::Acquisition     &&   
              _rassetTrans.TransDate                <= reportDateEnd
    join firstonly _ledgerTrans
        index VGP_LedgerLinkIdx
        where _ledgerTrans.VGP_LedgerLinkId         == _rassetTrans.VGP_LedgerLinkId    &&
              _ledgerTrans.VGP_LedgerLinkModuleRef  == VGP_LedgerLinkModuleRef::RAsset  &&   //ОС
              _ledgerTrans.Voucher                  == _rassetTrans.Voucher             &&
              _ledgerTrans.TransDate                == _rassetTrans.TransDate

    {
        i++;
        if (_account01Set.in(_ledgerTrans.AccountNum))
        {
            _ret.insert(_rassetTable.AccountNum, this.getDisposalDate(_rassetTable.AccountNum));
        }
    }

//    box::info( int2str(i) );

    return _ret;
}
Ставлю точку останова в начале метода и в конце, и между 2ми этими точками включаю монитор.
Переписал на прямой запрос в той же функции, выполняется вместо 26 минут - 30 секунд.


Zitat:
Zitat von glibs Beitrag anzeigen
А какой вид у вас имеют все 4837 запроса? Они абсолютно одинаковы?

Посмотрел генерируемые запросы, вроде одинаковые вот такого вида:

SELECT A.TRANSDATE,A.RECID,A.VGP_LEDGERLINKID FROM RASSETTRANS A(INDEX(I_16077RASSETDATEIDX)) WHERE ((DATAAREAID=?) AND (((ACCOUNTNUM=?) AND (TRANSDATE<?)) AND ((((ASSETTRANSTYPE=?) OR (ASSETTRANSTYPE=?)) OR (ASSETTRANSTYPE=?)) OR (ASSETTRANSTYPE=?)))) OPTION(FAST 2)

внутри проскакивают 2-3 другого вида но непонятно к чему они относятся.

Zitat:
Zitat von glibs Beitrag anzeigen
Может у вас сам метод столько раз вызывается? Тогда не удивлюсь насчет 25 мин.
Alt 25.06.2007, 08:38   #11  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Zitat:
Zitat von mazzy Beitrag anzeigen
Прямой запрос означает полный отказ от поддерки ядра
Не совсем понял о чём речь?

Zitat:
Zitat von mazzy Beitrag anzeigen
Прямой запрос в разы сложнее отлаживать и в разы дороже в сопровождении.
Прежде чем следовать совету МРАКОбеса триджы подумайте.
Согласен! А что делать?! Если разница в скорости в 50 раз!!!
Alt 25.06.2007, 09:06   #12  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von 3oppo Beitrag anzeigen
Не совсем понял о чём речь?
Нисколько не сомневаюсь, что не поняли.
Но тем не менее категорично советуете.

для начала назову пару вещей: виртуальные компани, rls.
про autorelation, временные таблицы, вычисляемые поля, про енумы, про целостность, про переопределенные методы при чтении/вставке/записи/удалении и т.п. уж как-нибудь сами.
в общем, rtfm.


Zitat:
Zitat von 3oppo Beitrag anzeigen
Согласен! А что делать?! Если разница в скорости в 50 раз!!!
Во-первых, грамотно использовать втроенные средства.
Во-вторых, прекратите мерить разницу в монопольном режиме. Хоть раз померяйте при нормальной загрузке sql-сервера с нормальным числом пользователей. Замерьте наконец задержки, которые происходят у других пользователей из-за ваших прямых запросов. Барабашки нет.
__________________
полезное на axForum, github, vk, coub.
Alt 25.06.2007, 09:25   #13  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2499 (89) +++++++++
Registriert seit: 20.08.2005
Zitat:
Zitat von 3oppo Beitrag anzeigen
Вот метод полностью:
...
Посмотрел генерируемые запросы, вроде одинаковые вот такого вида:

SELECT A.TRANSDATE,A.RECID,A.VGP_LEDGERLINKID FROM RASSETTRANS A(INDEX(I_16077RASSETDATEIDX)) WHERE ((DATAAREAID=?) AND (((ACCOUNTNUM=?) AND (TRANSDATE<?)) AND ((((ASSETTRANSTYPE=?) OR (ASSETTRANSTYPE=?)) OR (ASSETTRANSTYPE=?)) OR (ASSETTRANSTYPE=?)))) OPTION(FAST 2)

внутри проскакивают 2-3 другого вида но непонятно к чему они относятся.
По-моему, этот запрос не имеет отношнения к приведенному в коде (возможно, формируется в методе getDisposalDate()?).
Здесь идет связка по OR для нескольких условий для ASSETTRANSTYPE, а в коде x++ - по одному.

Попробуйте оставить только выборку и цикл по ней и посмотрите на результат запроса.
__________________
Axapta v.3.0 sp5 kr2
Alt 25.06.2007, 09:34   #14  
George Nordic ist offline
George Nordic
Модератор
Benutzerbild von George Nordic
Злыдни
 
4.480 / 1255 (50) ++++++++
Registriert seit: 17.12.2003
Ort: Moscow
Blog-Einträge: 9
Zitat:
Zitat von mazzy Beitrag anzeigen
для начала назову пару вещей: виртуальные компани, rls.
про autorelation, временные таблицы, вычисляемые поля, про енумы, про целостность, про переопределенные методы при чтении/вставке/записи/удалении и т.п.
Забыл про самое страшное - про блокировки.

Как только вижу в коде прямое обращние к базе, это с 99% вероятностью означает, что барабашка скоро появится.

С Уважением,
Георгий
This post has been rated by: 3oppo (1).
Alt 25.06.2007, 09:45   #15  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Zitat:
Zitat von mazzy Beitrag anzeigen
Нисколько не сомневаюсь, что не поняли.
?????

Zitat:
Zitat von mazzy Beitrag anzeigen
для начала назову пару вещей: виртуальные компани, rls.
про autorelation, временные таблицы, вычисляемые поля, про енумы, про целостность, про переопределенные методы при чтении/вставке/записи/удалении и т.п. уж как-нибудь сами.
в общем, rtfm.
А вы в этом смысле. Ну да есть некоторые неудобства. Но почти всё обходится дополнительным программированием.


Zitat:
Zitat von mazzy Beitrag anzeigen
Во-первых, грамотно использовать втроенные средства.
Научите плиз!? Вдруг чего не знаю.

Zitat:
Zitat von mazzy Beitrag anzeigen
Во-вторых, прекратите мерить разницу в монопольном режиме. Хоть раз померяйте при нормальной загрузке sql-сервера с нормальным числом пользователей.
Все замеры только на рабочей базе!

Zitat:
Zitat von mazzy Beitrag anzeigen
Замерьте наконец задержки, которые происходят у других пользователей из-за ваших прямых запросов.
Если это даже все 30 сек. (думаю что ЗНАЧИТЕЛЬНО меньше) это не критично для отчёта запускаемого 2 раза в месяц.

Zitat:
Zitat von mazzy Beitrag anzeigen
Барабашки нет.
Судя по оставшемуся главному вопросу, он всё таки есть!
Alt 25.06.2007, 09:53   #16  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Пробовал коментарить код внутри цикла, на времени выполнения это не отразилось.
Alt 25.06.2007, 10:06   #17  
belugin ist offline
belugin
Участник
Benutzerbild von belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.622 / 2925 (107) +++++++++
Registriert seit: 16.01.2004
Blog-Einträge: 5
Еще можно включить трассировку SQL и походить по шагам внимательно глядя в список infolog дебаггера. И посмотреть какая строка генерирует приведенный SQL.

Еще можно трассировать SQL в файл и посмотреть по стеку какая строчка его генерит.
This post has been rated by: 3oppo (1).
Alt 25.06.2007, 10:14   #18  
Vadik ist offline
Vadik
Модератор
Benutzerbild von Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3.631 / 1853 (69) ++++++++
Registriert seit: 18.11.2002
Ort: гражданин Москвы
не проверял с клиентом SP3, но все же
- какой глубокий смысл заложен в
X++:
join firstonly RAssetTrans
и
X++:
join firstonly LedgerTrans
? Как, по-Вашему, их должен реализовать сервер БД?
- с какой целью используются
X++:
index RAssetNumIdx
index TransTypeIdx
index VGP_LedgerLinkIdx
__________________
-ТСЯ или -ТЬСЯ ?
Alt 25.06.2007, 11:26   #19  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Zitat:
Zitat von Vadik Beitrag anzeigen
Как, по-Вашему, их должен реализовать сервер БД?
Zitat:
Zitat von 3oppo Beitrag anzeigen
Да пробовал убирать firstonly без результатно!
Код достался от внедренцев ... .. . Вот пытаюсь разобраться.

Zitat:
Zitat von AndyD Beitrag anzeigen
По-моему, этот запрос не имеет отношнения к приведенному в коде (возможно, формируется в методе getDisposalDate()?).
Вы оказались правы!
Вот реальный запрос

PHP-Code:
SELECT 
A
.ACCOUNTNUM… Очень большой список полей из всех 3х таблицВырезал его …
POSTINGJOURNALID
,C.TAXREFID,C.DEL_OFFSETACCOUNTNUM_RU 
FROM RASSETTABLE A
,RASSETTRANS B,LEDGERTRANS C 
WHERE 
((A.DATAAREAID='vgp') AND (A.VGP_PROPERTYTAX=1)) AND
 ((
B.DATAAREAID='vgp') AND (((B.ACCOUNTNUM=A.ACCOUNTNUM) AND (B.ASSETTRANSTYPE=3)) 
AND (
B.TRANSDATE<={ts '2007-03-31 00:00:00.000'}))) 
AND ((
C.DATAAREAID='vgp') AND ((((C.VGP_LEDGERLINKID=B.VGP_LEDGERLINKID
AND (
C.VGP_LEDGERLINKMODULEREF=4)) AND (C.VOUCHER=B.VOUCHER)) 
AND (
C.TRANSDATE=B.TRANSDATE))) 
ORDER BY A.DATAAREAID,A.ACCOUNTNUM,B.DATAAREAID,B.ACCOUNTNUM,
B.ASSETTRANSTYPE,C.DATAAREAID,C.VGP_LEDGERLINKID,
C.VGP_LEDGERLINKMODULEREF OPTION(FAST 4

Geändert von 3oppo (25.06.2007 um 11:29 Uhr)
Alt 25.06.2007, 12:21   #20  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
Остался вопрос ПОЧЕМУ ТАК ДОЛГО?! И почему такая большая разница с прямым запросом.
Stichworte
производительность, запрос (query), ax3.0

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Не отрабатывает запрос EXISTS JOIN Paul_ST DAX: База знаний и проекты 8 21.03.2008 17:21
запрос с 4 таблицами. Загадка с Join Андрей К. DAX: Программирование 7 19.09.2007 17:12
Почему на форме "Пользовательские настройки", когда я перехожу в нее из формы, отсутствует закладка "Запрос"? Hans DAX: Администрирование 0 05.07.2007 13:52
2 join-а + CasheLookup = EntireTable vallys DAX: Программирование 1 10.03.2006 13:20
можно ли сделать с помощью join следующий запрос: SergAY DAX: Программирование 1 29.07.2003 11:39

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 16:43 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.