![]() |
#1 |
Участник
|
Долго отрабатывает Select
Добрый день!
Есть следующая проблема в которой причину которой мне не удается понять. Следующий жоб: X++: static void Job54(Args _args) { Dialog dialog = new dialog(); DialogField dlgTransDateStart; DialogField dlgTransDateEnd; InventTable inventTable; inventTrans inventTrans; int timeFullStart, timeFullFinish, timeFullTotal, i; ; dlgTransDateStart = Dialog.addField(typeid(TransDate)); dlgTransDateEnd = Dialog.addField(typeid(TransDate)); dialog.run(); timeFullStart = timenow(); i = 1; while select inventTable where inventTable.ItemGroupId == "FP_BDiap" { select forceLiterals sum(Qty), sum(CostAmountPosted) from inventTrans where inventTrans.ItemId == inventTable.itemId && InventTrans.DatePhysical >= dlgTransDateStart.value() && inventTrans.DatePhysical <= dlgTransDateEnd.value() && InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit; i++; } timeFullFinish = timenow(); timeFullTotal = timeFullFinish - timeFullStart; info(strfmt("%1, %2", int2str(i), int2str(timeFullTotal))); } Вопрос - как ускорить. |
|
![]() |
#2 |
NavAx
|
использовать join и один запрос.
X++: while select inventTrans where InventTrans.DatePhysical >= dlgTransDateStart.value() && inventTrans.DatePhysical <= dlgTransDateEnd.value() && (InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit) join inventTable where inventTable.itemId == inventTrans.ItemId && inventTable.ItemGroupId == "FP_BDiap" {} для чего это? X++: sum(Qty), sum(CostAmountPosted) Последний раз редактировалось raz; 03.03.2015 в 16:46. |
|
![]() |
#3 |
Участник
|
взять в скобки
X++: (InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit) |
|
![]() |
#4 |
Участник
|
во втором селекте ошибка в условии
|
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от raz
![]() использовать join и один запрос.
X++: while select inventTrans where InventTrans.DatePhysical >= dlgTransDateStart.value() && inventTrans.DatePhysical <= dlgTransDateEnd.value() && (InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit) join inventTable where inventTable.itemId == inventTrans.ItemId && inventTable.ItemGroupId == "FP_BDiap" {} |
|
![]() |
#6 |
Участник
|
Если хотели пошутить, то неудачно. В Axapta, по возможности, Exists join следует избегать. Если это возможно по логике запроса, то лучше использовать inner join. В данном случае - это возможно, поэтому именно так и следует делать.
Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
![]() |
#7 |
Moderator
|
Цитата:
Сообщение от Владимир Максимов
![]() Если хотели пошутить, то неудачно. В Axapta, по возможности, Exists join следует избегать. Если это возможно по логике запроса, то лучше использовать inner join. В данном случае - это возможно, поэтому именно так и следует делать.
Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет. |
|
![]() |
#8 |
Участник
|
Цитата:
Сообщение от fed
![]() Рекомендация изначально не очень верна. Да - были проблемы с exists join в ранних версиях оракла, с которыми Axapta 2.1-2.5 работала. У MS SQL (Даже версии 2000) подобных проблем не наблюдалось. Кроме того - со времен Oracle 8.0.6 и MS SQL 2000 прошло уже 16 лет и ни то ни другой особых проблем именно с Exists join не имеют. То есть - проблемы с execution plan везде возникают время от времени, но именно с exists /not exists join они не связаны.
![]() Проблемы с Exists Join Не знаю, как в Ax2012, но в Ax2009 механика процесса не изменилась, поэтому не вижу причин для оптимизма
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (2). |
![]() |
#9 |
Модератор
|
Цитата:
Сообщение от Владимир Максимов
![]() Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет
Цитата:
В Axapta, по возможности, Exists join следует избегать
Цитата:
Проблемы связаны как раз с MS SQL
__________________
-ТСЯ или -ТЬСЯ ? |
|
![]() |
#10 |
Участник
|
А по ссылке посмотреть с чем связана рекомендация не...?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
![]() |
#11 |
Модератор
|
Ну типа Вы разобрались в причинах подземного стука в итоге и потому рекомендуете ? Из той ветки просто неочевидно
![]()
__________________
-ТСЯ или -ТЬСЯ ? |
|
![]() |
#12 |
Участник
|
Цитата:
![]()
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|