Вопрос к кодерам

dvgSUN
Дата: 03.08.2005 17:15:28
SELECT ACC1.ACCOUNT_ID
FROM
TBL_AGREEMENT_ACCOUNT_TTT AGRACC, ACCOUNTS ACC, ACCOUNTS ACC1,
TBL_BD_ACCOUNT_GROUPS ACCGR WHERE AGRACC.AGREEMENT_ID = :B4 AND
AGRACC.ACCOUNT_ID = ACC1.ACCOUNT_ID AND ACC1.PARENT_ACCOUNT_ID =
ACC.ACCOUNT_ID AND ACCGR.ACCOUNT_GROUP_TYPE_ID = :B3 AND ACCGR.ACCOUNT_ID =
ACC.ACCOUNT_ID AND ACC1.FOUND_ID = :B2 AND ( :B1 IS NULL OR ( :B1 IS NOT
NULL AND ACC.BRANCH_FACE_ID = :B1 ))



PPl а так вообще корректно писать
особенно вот это
ACC1.FOUND_ID = :B2 AND ( :B1 IS NULL OR ( :B1 IS NOT
NULL AND ACC.BRANCH_FACE_ID = :B1

запросец кодеров как то не по детски провисает, а они как то уверяют что все клево должно быть
eml78
Дата: 04.08.2005 10:27:00
dvgSUN

PPl а так вообще корректно писать
...
запросец кодеров как то не по детски провисает, а они как то уверяют что все клево должно быть

Если работает значит запрос корректный. Вопрос только в его оптимальности и кривости настройки БД. В частности стоит проверить есть ли ключи для связок, посмотреть план и т.п.
Ааз
Дата: 04.08.2005 12:02:14
Привет
( :B1 IS NULL OR ( :B1 IS NOT NULL AND ACC.BRANCH_FACE_ID = :B1 ))

Гыыы... Следы "универсалописателей базоданнонезависимого полукода" ;-).

Проблема, тем не менее, скорее всего в другом. В дополнение к уже сказанному eml78, может быть такое:
Если версия 9i+, у CBO есть желание построить план выполнения более близкий к реальному на основе статистики... Для этого... он... строит план выполнения ... со значениями переменных привязки ... в момент первого выполнения... Со всеми вытекающими. Т.е. если у вас план выполнения гуляет от перезапуска к перезапуску экземпляра, а статистику вы не пересобирали - тот самый случай.

Всего
--
Andrei Kriushin (Oracle8/8i/9i OCP DBA), RDTEX J.S.C.
Disclaimer: Opinions are of my own and not necessar(-il)y...
dvgSUN
Дата: 04.08.2005 12:06:23
ok, дело в том что как раз запрос съезжает после сбора статистики.

а вот если потом перебилдить индексы и пересобрать статистику заново то все хорошо становится
Ааз
Дата: 04.08.2005 12:23:18
dvgSUN
ok, дело в том что как раз запрос съезжает после сбора статистики.

а вот если потом перебилдить индексы и пересобрать статистику заново то все хорошо становится
Так сравните же планы выполнения в плохом и хорошем случае. По-крайней мере, одну гипотезу отработаете (что планы меняются). Если планы стабильны, следующая итерация - индексы деградируют (много пустых или полупустых блоков), или неселективны, или распределение данных неравномерное и т.п.

Ну либо ограничтесь уже найденным workaround'ом - rebuild и сбор статистик.

Кстати, rebuild делает команду SQL INVALID ==> разбор заново при первом выполнении, при соответсвенно могут попасть более удачные значения переменных...

Всего
dvgSUN
Дата: 04.08.2005 12:48:38
Логично
thanks всем
Bely
Дата: 04.08.2005 13:11:26
Ааз
Привет
( :B1 IS NULL OR ( :B1 IS NOT NULL AND ACC.BRANCH_FACE_ID = :B1 ))

Гыыы... Следы "универсалописателей базоданнонезависимого полукода" ;-).
А какие есть предложения по улучшению таких конструкций?
Чтобы если NULL, то все, а если не NULL, то равно значению.
Поделитесь опытом правильнописания :)
Shr
Дата: 04.08.2005 13:47:35
nvl(:B1, ACC.BRANCH_FACE_ID) = ACC.BRANCH_FACE_ID
Правда, как это на плане отразится, не знаю.
Bely
Дата: 04.08.2005 14:08:36
Shr
nvl(:B1, ACC.BRANCH_FACE_ID) = ACC.BRANCH_FACE_ID
Правда, как это на плане отразится, не знаю.
IMHO - NVL то от чего стоит уходить в условиях.
Вызов ф-ии в условии отбора - вобще плохой вариант.

Можно NVL заменить на DECODE, идея понятна...
Vint
Дата: 04.08.2005 14:19:01
Bely
Shr
nvl(:B1, ACC.BRANCH_FACE_ID) = ACC.BRANCH_FACE_ID
Правда, как это на плане отразится, не знаю.
IMHO - NVL то от чего стоит уходить в условиях.
Вызов ф-ии в условии отбора - вобще плохой вариант.

Можно NVL заменить на DECODE, идея понятна...

чем вам не нравиться NVL в условиях
вот вам простенький примерчик
select count(1) from t
where fk_id = nvl(null,fk_id)

Time:2.47
Result:
count(1)
------------------------
4993450

select count(1) from t
where fk_id = nvl(1,fk_id)

Time:1.25
Result:
count(1)
------------------------
0
А "Вызов ф-ии в условии отбора" вполне нормальное явление только надо понимать как его использовать и когда
select * from t where my_func(by_column)=1 --Действительно плохой вариант
select * from t where by_column=my_func_revert(1) --Почему бы нет???