ХП в IB7.5, вот ее кусок:
Код: Выделить всё
for select
...
from staff_units su
where
(
(:int_id1=-1) or
( (:int_flt_type=1) and (su.id=:int_id1) ) or
( (:int_flt_type=2) and (su.pers_id=:int_id1) ) or
( (:int_flt_type=3) and (su.club_id=:int_id1) ) or
( (:int_flt_type=4) and (su.staff_id=:int_id1 or su.staff_id in (select id from SYS$GET_STAFF_LIST(:int_id1,null,null))) ) or
( (:int_flt_type=5) and (su.dept_id=:int_id1) ) or
( (:int_flt_type=6) and (su.club_id=:int_id1 and su.dept_id=:int_id2) )
)
into ...
раньше я думал, что IB выполняет условия, как любой нормальный язык программирования или скрипт, т.е. например в строке
Код: Выделить всё
( (:int_flt_type=1) and (su.id=:int_id1) )
как показала практика - это не так. все условия проверяются в любом случае.
в результате если при выполнении процедуры(см. большой код выше) переменная int_flt_type будет равна 2, то все равно будут проверяться все условия в where, включая подзапрос из процедуры SYS$GET_STAFF_LIST.
А это, как Вы понимаете, тормоза на пустом месте, ибо если int_flt_type не равна 4, подзапрос(и почти половину других условий) не нужно даже трогать.
собственно вопрос - почему так и можно ли с этим что-то сделать?