03.03.2015, 16:22 | #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))); } Вопрос - как ускорить. |
|
03.03.2015, 16:39 | #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. |
|
03.03.2015, 16:42 | #3 |
Участник
|
взять в скобки
X++: (InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit) |
|
03.03.2015, 16:43 | #4 |
Участник
|
во втором селекте ошибка в условии
|
|
04.03.2015, 12:39 | #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" {} |
|
05.03.2015, 11:44 | #6 |
Участник
|
Если хотели пошутить, то неудачно. В Axapta, по возможности, Exists join следует избегать. Если это возможно по логике запроса, то лучше использовать inner join. В данном случае - это возможно, поэтому именно так и следует делать.
Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
05.03.2015, 11:57 | #7 |
Moderator
|
Цитата:
Сообщение от Владимир Максимов
Если хотели пошутить, то неудачно. В Axapta, по возможности, Exists join следует избегать. Если это возможно по логике запроса, то лучше использовать inner join. В данном случае - это возможно, поэтому именно так и следует делать.
Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет. |
|
05.03.2015, 12:09 | #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). |
05.03.2015, 13:15 | #9 |
Модератор
|
Цитата:
Сообщение от Владимир Максимов
Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет
Цитата:
В Axapta, по возможности, Exists join следует избегать
Цитата:
Проблемы связаны как раз с MS SQL
__________________
-ТСЯ или -ТЬСЯ ? |
|
05.03.2015, 13:48 | #10 |
Участник
|
А по ссылке посмотреть с чем связана рекомендация не...?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
05.03.2015, 14:15 | #11 |
Модератор
|
Ну типа Вы разобрались в причинах подземного стука в итоге и потому рекомендуете ? Из той ветки просто неочевидно
__________________
-ТСЯ или -ТЬСЯ ? |
|
05.03.2015, 19:07 | #12 |
Участник
|
Да. При определенных условиях, использование exists "внезапно" порождает совершенно не ожидАемые проблемы. При том, что "еще вчера все прекрасно работало" Вот чтобы на эти "грабли" не наступать, по возможности, и стоит избегать exists.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|