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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.06.2008, 12:12   #1  
axbegin is offline
axbegin
Участник
 
14 / 10 (1) +
Регистрация: 16.06.2008
Связываемые переменные при работе с Oracle
Недавно начал работать с Аксаптой, так что простите, если спрашиваю общеизвестные факты.

1) Правильно ли я понимаю, что Аксапта сама генерит запросы для Oracle. Причем делает это не используюя связываемые переменные. То есть вместо конструкции:

select ... where a = :a and b = :b

Все запросы на Oracle уходят с уже подставленными числами ?
Насколько я понял, ситуация выглядит именно так и это приводит к тому, что Oracle приходится разбирать и строить планы выполнения для всех запросов. Другими словами, для каждого запроса Oracle приходится выполнять стадию parse, что приводит к долгим ожиданиям latch free.

2) Можно ли средствами Axapta повлиять на нее так, чтобы в ряде запросов она все-таки использовала связываемые переменные?

3) Кто-нибудь пробовал на рабочей базе Axapta включать опцию CURSOR_SHARING и к чему это приводило? Теоритические плюсы и минусы такого шага я понимаю - интересует именно специфика Аксапты.
Старый 16.06.2008, 12:35   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну, если я правильно понял, что связываемые переменные - это placeholders, то вообще-то везде должны по-умолчанию использоваться placeholders (начиная с версии 4.0)
А до этого для некоторых запросов (простых - без джоина таблиц определенных групп) тоже использовались placeholders.
Можно явно указать системе, чтобы она использовала их в запросе. (для каждого запроса в отдельности)
Но возможно с Ораклом что-то напортачили.
Старый 16.06.2008, 20:59   #3  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от axbegin Посмотреть сообщение
Недавно начал работать с Аксаптой, так что простите, если спрашиваю общеизвестные факты.

3) Кто-нибудь пробовал на рабочей базе Axapta включать опцию CURSOR_SHARING и к чему это приводило? Теоритические плюсы и минусы такого шага я понимаю - интересует именно специфика Аксапты.
Ну я пробовал. (Точнее - разбирался с последствием того что знакомые попробовали. ) Эффект - поразительный. Меня позвали разбираться почему Аксапта тормозит очень. Выяснилось - что Oracle почему-то не использует индексы по строковым полям. Как показало вскрытие - именно из за баловства с cursor_sharing. Ситуация следующая:
1. Из за того что Axapta везде использует case-insensitive сравнение, все индексы по строковым полям в Аксапте, при использовании Oracle, строятся как функциональные. То есть индекс строится не по полю custAccount, а по NLS_LOWER(Substr(custAccount,1,10)) (10 - длина поля)
2. При формировании запросов, литералы тоже заключаются в функцию NLS_LOWER. То есть - на сервер отправляется запрос вида select * from custTable where NLS_LOWER(Substr(custAccount,1,10)=NLS_LOWER(Substr('Рога и копыта'),1,10). Оптимизатору Оракла хватает ума сопоставить выражение в левой части равенства с выражением индекса
3. Если поставить CURSOR_SHARING=EXACT, Oracle транслирует полученный запрос в select * from custTable where NLS_LOWER(Substr(custAccount,:bind1,:bind2)=NLS_LOWER(Substr(:bind3,:bind4,:bind5), после чего подставляет конкретные значения bind-переменных. Нетрудно догадаться, что левая часть сравнения перестает сопоставляться с выражением индекса и индекс перестает использоваться для исполнения запроса.

Это все было справедливо для Oracle 10g Release 1. Может в более поздних версиях это дело как-то изменили.

Кстати - даже в отрыве от проблем с ораклом, я не вижу особого смысла в замене литералов на переменные запроса. На практике - узким местом в 95% случаев является не процессор, а жесткий диск. Использование переменных запроса слегка снижает нагрузку на процессор, но при этом значительно повышает вероятность генерации неправильного плана запроса. Кроме того - Аксапта не использует (ну хорошо - почти не использует ) хранимые процедуры, триггера, и вообще средства программирования сервера БД. Так что нагружать именно процессора сервера БД - там просто нечем. Так что, на мой взгляд, любые попытки массовой параметризации запросов приносят негативный результат именно в случае Аксапты.
За это сообщение автора поблагодарили: mazzy (2).
Старый 16.06.2008, 22:03   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от fed Посмотреть сообщение
Кстати - даже в отрыве от проблем с ораклом, я не вижу особого смысла в замене литералов на переменные запроса. На практике - узким местом в 95% случаев является не процессор, а жесткий диск.
..
Так что, на мой взгляд, любые попытки массовой параметризации запросов приносят негативный результат именно в случае Аксапты.
А вот с этим утверждением г-н Кайт думаю поспорил бы Неиспользование variable binding как раз очень часто является причиной "заторможенности" системы (axbegin об этом и пишет кстати). А forceliterals где надо и так по системе разбросаны достаточно щедро

axbegin, почитайте, попробуйте покрутить настройки на AOS-е, связанные с литералами. Кстати, версию Вы не указали, а их немало
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: mazzy (2).
Старый 17.06.2008, 07:15   #5  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Vadik Посмотреть сообщение
А вот с этим утверждением г-н Кайт думаю поспорил бы Неиспользование variable binding как раз очень часто является причиной "заторможенности" системы (axbegin об этом и пишет кстати). А forceliterals где надо и так по системе разбросаны достаточно щедро
Возможно. Но я на своей практике много раз видел ситуации, когда из за использования параметризации порождался КРИВЕЙШИЙ план запроса и ни разу не видел чтобы из за использования литералов перегружались процессора сервера БД. Топикстартер, кстати, пишет про долгие ожидания latch free, но не пишет насколько катастрофична ситуация. То есть - если система долго ждет компиляции запросов, это совсем не означает что все плохо. Если среднее время компиляции запроса - более или менее пристойное (пользователи ждут исполнения запроса, а не его компиляции) и средняя загрузка процессоров сервера БД в пределах 25-30% - то ничего страшного нету...

А Кайт, кстати, не пишет о том, нафига нужна статистика и гистограмы, если все запросы жестко параметризованы ?
Старый 17.06.2008, 10:01   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от fed Посмотреть сообщение
Возможно. Но я на своей практике много раз видел ситуации, когда из за использования параметризации порождался КРИВЕЙШИЙ план запроса
Это не кривой план. Вероятно, это был хороший (возможно, даже оптимальный) план - для набора параметров, с которыми он строился. Я же вроде написал - там, где изменение параметров значительно влияет на выбор оптимального плана исполнения, разумеется НАДО использовать литералы. Forceliterals в стандартном коде достаточно широко и осмысленно используется, так что тут разработчикам зачет. "Легкие" запросы - вполне достойно перевариваются с prepared execution

Цитата:
и ни разу не видел чтобы из за использования литералов перегружались процессора сервера БД
А сталкивался с ситуацией, когда время подготовки (разбор, генерация плана исполнения) запроса превышает время его исполнения? И таких запросов - сотни?

Пока что ни axbegin, ни я не говорили о ПЕРЕГРУЗКЕ сервера из-за того, что не используются связанные переменные. Речь шла об увеличении времени отклика

Цитата:
А Кайт, кстати, не пишет о том, нафига нужна статистика и гистограмы, если все запросы жестко параметризованы ?
Переведи, пожалуйста. Нафига нужна статистика? Не понимаю

Мой посыл таков - идеальной настройки для всех случаев жизни нет. Но prepared execution по умолчанию (для основной массы OLTP-шных запросов) и осознанное использование forceliterals в коде x++ там, где это требуется - работает вполне прилично. По крайней мере, средняя температура по больнице (результаты любимого benchmark tool) это подтверждает
__________________
-ТСЯ или -ТЬСЯ ?
Старый 17.06.2008, 10:20   #7  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
В общем - общий вывод простой. Универсального подхода не существует. Надо разбираться с каждым конкретным случаем. Использование литералов дает гарантированное увеличение нагрузки на процессора, использование переменных - увеличивает (но не гарантирует) шансы на генерацию некорректного плана запроса, что увеличиваетт нагрузку на жесткие диски и память. По моему убеждению, чаще всего на современных серверах, узким местом являются именно диски. Скажем - в 2003 году типичным сервером БД на внедрении Аксапты был двухпроцессорный Xeon. Теперь - двухпроцессорный ЧЕТЫРЕХЯДЕРНЫЙ Xeon. За счет увеличения числа ядер, реальная производительность выросла где-то раза в 2-2,5. В то же время - за последние 5 лет быстродействие дисковых массивов увеличилось, но наверное процентов на 30-40 примерно. Если тенденция сохранится - процессорная мощность будет намного дешевле чем дисковая. Учитывая что генерация плана запроса хорошо паралелиться - правильнее использовать литералы, а не bind-переменные.
Старый 03.08.2009, 19:00   #8  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от fed Посмотреть сообщение
....
3. Если поставить CURSOR_SHARING=EXACT, Oracle транслирует полученный запрос в select * from custTable where NLS_LOWER(Substr(custAccount,:bind1,:bind2)=NLS_LOWER(Substr(:bind3,:bind4,:bind5), после чего подставляет конкретные значения bind-переменных. Нетрудно догадаться, что левая часть сравнения перестает сопоставляться с выражением индекса и индекс перестает использоваться для исполнения запроса.
.....
Наверное всё таки имелся ввиду CURSOR_SHARING=FORCE?

Было бы интересно ещё, как он поведёт себя с SIMILAR...
__________________
Zhirenkov Vitaly
Старый 04.08.2009, 09:42   #9  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Угу - конечно имелось в виду CURSOR_SHARING=FORCE

Теги
oracle, курсор

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Анализ производительности при работе с Oracle axbegin DAX: Программирование 13 23.10.2008 22:57
Установка Dynamics 4.0 под Oracle Paul_ST DAX: Администрирование 6 20.04.2007 16:36
aEremenko: История об установке Microsoft Dynamics Ax 4.0 и Oracle 10G Blog bot DAX Blogs 0 28.10.2006 16:01
Знатокам Oracle listener DAX: Администрирование 1 23.01.2004 10:53
"On MSSQL" or "On Oracle" alpine DAX: Прочие вопросы 5 19.03.2002 11:38

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

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

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