23.10.2008, 07:40 | #1 |
MCTS
|
использование forcepalceholders
Привет всем. Верно ли, что, если в цикле идет сравнение двух полей (Table1.Fiedl1 != Table1.Fiedl2), то использование forcepalceholders в запросе снизит производительность? Это для Ax 3.0 на Oracle.
Последний раз редактировалось Eldar9x; 23.10.2008 в 07:42. |
|
23.10.2008, 07:48 | #2 |
Участник
|
|
|
23.10.2008, 08:03 | #3 |
MCTS
|
Спасибо, конечно, но на вопрос это не отвечает. Мне известно, что placeholders рекомендуется использовать для частых запросов. У меня как раз такой случай, но есть подозрение, что план исполнения будет строиться заново, как раз из-за этого условия Table1.Fiedl1 != Table1.Fiedl2. Отсюда и вопрос...
Последний раз редактировалось Eldar9x; 23.10.2008 в 08:39. |
|
23.10.2008, 08:07 | #4 |
Member
|
Я в Оракле не силен, но даже в этом случае очевидно, что благодаря настолько обощенной формулировке утверждение обречено быть неверным.
__________________
С уважением, glibs® |
|
23.10.2008, 08:26 | #5 |
Member
|
Цитата:
Сообщение от Eldar9x
...
placeholders рекомендуется использовать для частых вопросов. ... Цитата:
Сообщение от Eldar9x
...
план исполнения будет строиться заново, как раз из-за этого условия Table1.Fiedl1 != Table1.Fiedl2. ... Недостаток placeholders заключается в том, что построенный в первый раз при определенных критериях фильтрации план запроса может оказаться (а может и не оказаться) неоптимальным для этого же запроса, но с другими критериями. И placeholders не дадут СУБД перестроить план запроса. Тут универсального лекарства нет. Хинты должны ставиться разработчиком сознательно. Впрочем, многие другие вещи им тоже должны делаться сознательно.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: Eldar9x (1). |
23.10.2008, 08:34 | #6 |
MCTS
|
Цитата:
Недостаток placeholders заключается в том, что построенный в первый раз при определенных критериях фильтрации план запроса может оказаться (а может и не оказаться) неоптимальным для этого же запроса, но с другими критериями. И placeholders не дадут СУБД перестроить план запроса.
|
|
23.10.2008, 08:57 | #7 |
Участник
|
А запрос по Table1 идет? И что имеется в виду под циклом?
__________________
Axapta v.3.0 sp5 kr2 |
|
23.10.2008, 09:07 | #8 |
MCTS
|
Цитата:
А запрос по Table1 идет? И что имеется в виду под циклом?
То есть такая структура формируется c помощью Query: while select custTable join custTrans // тут добавил пару индексов custTrans - пр-ть увеличилась в два раза where custTrans.AccountNum == custTable.AccountNum && custTrans.AmountMST != CustTrans.SettleAmountMST Join LedgerJournalTrans where LedgerJournalTrans.Voucher == custTrans.Voucher { ... } Пишу по памяти, поэтому извиняйте, если что. Так эта пробежка по queryRun жутко тормозит. Записей 500 еще обрабатываются секунд за 2, но чем больше тем хуже. C добавлением placeholders и это перестало работать. Нашел вот это Table Scan через QueryRun , почти такая же ситуация Последний раз редактировалось Eldar9x; 23.10.2008 в 09:12. |
|
23.10.2008, 09:33 | #9 |
Member
|
Forceplaceholders потенциально мог бы быть полезным, если бы внутри вашего queryRun был бы организован цикл while select someTable. А так запрос выполняется один раз. Пробег курсором по запросу — это не несколько одинаковых запросов подряд. Это один запрос и пробежка по нему курсором. Соответственно и оптимизировать такой запрос нужно с другой стороны.
__________________
С уважением, glibs® |
|
23.10.2008, 09:33 | #10 |
Модератор
|
Цитата:
Сообщение от Eldar9x
Под циклом я имел ввиду пробег в queryRun.
То есть такая структура формируется c помощью Query: while select custTable join custTrans // тут добавил пару индексов custTrans - пр-ть увеличилась в два раза where custTrans.AccountNum == custTable.AccountNum && custTrans.AmountMST != CustTrans.SettleAmountMST Join LedgerJournalTrans where LedgerJournalTrans.Voucher == custTrans.Voucher { ... } Пишу по памяти, поэтому извиняйте, если что.
__________________
-ТСЯ или -ТЬСЯ ? |
|
23.10.2008, 09:42 | #11 |
MCTS
|
Цитата:
Forceplaceholders потенциально мог бы быть полезным, если бы внутри вашего queryRun был бы организован цикл while select someTable. А так запрос выполняется один раз.
X++: while (queryrun.next()) { table1 = queryRun.get(...); } X++: while select Table1 { } Цитата:
Простите, можно поинтересоваться, что Вы таким запросом собираете?
|
|
23.10.2008, 09:54 | #12 |
Member
|
Цитата:
Сообщение от Eldar9x
...
В смысле ... while select custTable where custTable.custGroup == someVariable { while select FORCEPLACEHOLDERS custTrans where custTrans.AccountNum == custTable.AccountNum && custTrans.SettledAmountMst >= 10 { } } Пример, скорее всего, практически бесполезный, в компиляторе не проверялся, и названия некоторых полей я мог перепутать или придумать. И то, что такое можно выполнить одним запросом с джоином, я тоже знаю. Но на его основании суть должна быть понятна. Если выборка по CustTable даст несколько сот строк, то использование forceplaceholders в запросе по CustTrans даст визуально ощутимый эффект. Если выборки таким образом организовывать через Query, то суть будет такая же.
__________________
С уважением, glibs® |
|
23.10.2008, 10:07 | #13 |
Участник
|
А вам все поля во всех таблицах нужны в выборке?
Из-за слишком большого размера данных в курсоре, возможно, у вас фетчится по 1-2 записи. Попробуйте в выборке указать только нужные вам
__________________
Axapta v.3.0 sp5 kr2 |
|
23.10.2008, 10:11 | #14 |
MCTS
|
Цитата:
Если выборка по CustTable даст несколько сот строк
|
|
23.10.2008, 10:20 | #15 |
Member
|
Вам посмотреть внимательно на план запроса стоило бы в данной ситуации. Поэкспериментировать с запросом (средствами СУБД для начала). Посмотреть за счет чего он он долго считается. За счет чего он может начать считаться быстрее (тот же вариант с ограниченным набором полей проверить, например, на индексы посмотреть). Поэкспериментировать, как на план запроса повлияют те или иные сложные фильтры пользователей. А потом уже в Аксапту перебираться.
__________________
С уважением, glibs® |
|
Теги |
документация, производительность, ax3.0 |
|
|