После перехода на IB 7.1 SP1
во вложенных select перестали использоваться индексы. В результате жуткие тормоза.
Попробовал состряпать простой пример:
Код: Выделить всё
Метадынные:
CREATE TABLE TABLE_TEST1 (
FIELD1 INTEGER NOT NULL,
FIELD2 INTEGER
);
CREATE TABLE TABLE_TEST2 (
FIELD1 INTEGER,
FIELD2 INTEGER,
FIELD3 INTEGER);
/* Indices definition */
CREATE INDEX TABLE_TEST2_IDX1 ON TABLE_TEST2 (FIELD2);
Запрос:
select T1.* from table_test1 T1
where
T1.FIELD2-ABS((Select Sum(T2.Field1) from table_test2 T2
where T2.Field2 = T1.Field1))>0
Получаем план в 7.1
PLAN (T2 INDEX (TABLE_TEST2_IDX1))PLAN (T2 NATURAL)PLAN (T1 NATURAL)
Выполняем в 7.0
получаем план:
PLAN (T2 INDEX (TABLE_TEST2_IDX1))PLAN (T2 INDEX (TABLE_TEST2_IDX1))PLAN (T1 NATURAL)
Еще я не понимаю почему из-за UDF получаем два плана на вложенный
запрос. Если убрать использование udf (ABS), то получаем только один
вложенный план причем правильный ив IB7.1. Но в конкретном случае без
использования udf нельзя, так как null не должен появляться (если
вложенный запрос ничего не нашел).
Прийтеся по прежнему udf обертывать хранимой процедурой:
Код: Выделить всё
select T1.* from table_test1 T1
where
T1.FIELD2 - (select Summa from ABS_((Select Sum(T2.Field1) from table_test2 T2 where T2.Field2 = T1.Field1)))>0