Здравствуйте, зиг, Вы писали:
зиг> мне нужен совет — в каком направлении пнуть наших DBA которые базу майнтейнят. может быть тут очевидная какая-то недоработка с их стороны?
Я знаю, что вам ответят админы на любой пинок. "На продакшене нормально выполняется? Нормально. К пуговицам претензии есть? Нет. А девелопменте, ясен пень, железо не такое мощное. Скажи спасибо, что второй раз быстро выполняется."
зиг> если б хотя бы план отображал действительную картину — тогда было бы уже легче инвестигировать. то есть я так понимаю проблему надо начинать решать с этой стороны?
Есть способы получить и действительную картину. Но для этого нужно Кайта читать.
В общем, если пользователи и DBA на этот запрос не жалуются — забейте/потерпите.
Здравствуйте, MasterZiv, Вы писали:
MZ> Про OR-ы в JOIN-ах вам тоже правильно сказали -- безобразие. MZ> Надо их убирать. Проверяешь условие (на PL/SQL), и выполняешь такой запрос или другой. MZ> Или генерация кода запроса в виде текста и EXECUTE IMEDIATE.
MZ>>cost лучше вообще не смотреть, я напр. даже не знаю, в каких попугаях он мериится. MZ>>Смотреть надо на cardinality. зиг>а как сделать чтоб кардиналити выводился? зиг>пользуюсь pl/sql developer.
Ну тогда в окошке Explain Plan должна быть такая кнопочка с гаечным ключом — Preferences. Там все настраивается, какие значения выводить, какие нет.
Гуру, кстати, до сих по не упомянули вот какую вещь: oracle, вообще-то, не гарантирует, что реальный план выполнения запроса будет именно такой, который выдан в результате explain plan. Окончательный диагноз дает только вскрытие Трассу надо снимать, обрабатывать tkprof и смотреть — вот там вся правда
Иногда бывают дивные отличия от explain plan.
Но это колдунство потребует чтения книжки или документации, скорее всего.
А попробуй код, без которого все летает вынести в самый верх, туда где select B.*. Там же ограничение на вывод 30 строк идет, зачем находить максимальное значение (ASOF) целиком для всех строк? Там где сейчас ASOF вычисляется просто оставь p.PKEY, чтобы по нему уже вверху вычислить ASOF.
А попробуй код, без которого все летает вынести в самый верх, туда где select B.*. Там же ограничение на вывод 30 строк идет, зачем находить максимальное значение (ASOF) целиком для всех строк? Там где сейчас ASOF вычисляется просто оставь p.PKEY, чтобы по нему уже вверху вычислить ASOF.
Здравствуйте, AVAKON, Вы писали:
AVA>Здравствуйте, зиг,
AVA>А попробуй код, без которого все летает вынести в самый верх, туда где select B.*. Там же ограничение на вывод 30 строк идет, зачем находить максимальное значение (ASOF) целиком для всех строк? Там где сейчас ASOF вычисляется просто оставь p.PKEY, чтобы по нему уже вверху вычислить ASOF.
ха! верной дорогой идете товарищи! до этого я уже сама додумалась и сделала, и запрос действительно стал летать.
НО, проблема остается если мы делаем не первые 30 строк, а все допустим, или, если по этому значению asof нам нужно фильтровать либо сортировать. тогда его выносить наружу никак нельзя.
Здравствуйте, зиг, Вы писали:
зиг>Здравствуйте, AVAKON, Вы писали:
AVA>>Здравствуйте, зиг,
AVA>>А попробуй код, без которого все летает вынести в самый верх, туда где select B.*. Там же ограничение на вывод 30 строк идет, зачем находить максимальное значение (ASOF) целиком для всех строк? Там где сейчас ASOF вычисляется просто оставь p.PKEY, чтобы по нему уже вверху вычислить ASOF.
зиг>ха! верной дорогой идете товарищи! до этого я уже сама додумалась и сделала, и запрос действительно стал летать. зиг>НО, проблема остается если мы делаем не первые 30 строк, а все допустим, или, если по этому значению asof нам нужно фильтровать либо сортировать. тогда его выносить наружу никак нельзя.
А план, который ты кусочек прислала, он ведь уже выполнен после переброса ASOF вверх? Судя по нему это значение рассчитывается именно для 30 строк, а не для всей выборки. Может есть смысл использовать аналитику типа max over, материализовать обращение к tablee при помощи with, и потом уже с неё максимумы эти тянуть? Если не будем ограничиваться выборкой 30 строк, то имхо это может помочь. У нас же здесь тормоза, как я понимаю из-за определения этих максимумов...