Сообщение
S.H.S » 04 дек 2005, 00:48
..."Вернусь опять к баранам."
Вот запрос, который в Ib и в Fb:
SELECT base_id, goods_id, serial_num
FROM base
WHERE goods_id=1199 AND
sell_date IS NULL AND
warranty_date IS NULL AND
base_id NOT IN (SELECT base_id FROM comps WHERE base_id IS NOT NULL)
ORDER BY serial_num
В Ib результат:
Plan
PLAN (COMPS INDEX (RDB$FOREIGN15))
PLAN SORT ((BASE INDEX (RDB$FOREIGN10)))
Adapted Plan
PLAN (COMPS INDEX (INTEG_40)) PLAN SORT ((BASE INDEX (INTEG_35)))
------ Performance info ------
Prepare time = 0ms
Execute time = 40ms
Avg fetch time = 1,74 ms
Current memory = 9,211,869
Max memory = 9,496,859
Memory buffers = 2,048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 4,612
В Fb результат:
Plan
PLAN (C NATURAL)
PLAN SORT ((BASE INDEX (GOODS_BASE_FK)))
Adapted Plan
PLAN (C NATURAL) PLAN SORT ((BASE INDEX (GOODS_BASE_FK)))
------ Performance info ------
Prepare time = 0ms
Execute time = 1s 963ms
Avg fetch time = 85,35 ms
Current memory = 678,400
Max memory = 702,376
Memory buffers = 2,048
Reads from disk to cache = 0
Writes from cache to disk = 6
Fetches from cache = 1,241,434
Почему такая разница, таблицы же одинаковые. Fb как бы не видит индекс внешнего ключа.
Таблицы:
CREATE TABLE BASE (
BASE_ID INTEGER NOT NULL,
GOODS_ID INTEGER NOT NULL,
BUY_DATE DATE,
SUPPLIER_ID INTEGER NOT NULL,
BUY_PRICE DECIMAL(5,2),
SERIAL_NUM VARCHAR(30),
SELL_DATE DATE,
LOGIN VARCHAR(10),
WARRANTY_DATE DATE
);
ALTER TABLE BASE ADD CONSTRAINT BASE_PK PRIMARY KEY (BASE_ID);
ALTER TABLE BASE ADD CONSTRAINT GOODS_BASE_FK FOREIGN KEY (GOODS_ID) REFERENCES GOODS (GOODS_ID);
ALTER TABLE BASE ADD CONSTRAINT SUPPLIERS_BASE_FK FOREIGN KEY (SUPPLIER_ID) REFERENCES SUPPLIERS (SUPPLIER_ID);
CREATE TABLE COMPS (
COMPS_ID INTEGER NOT NULL,
COMPS_NUM INTEGER NOT NULL,
CATEGORY_ID INTEGER,
GOODS_ID INTEGER,
PRICE NUMERIC(5,2),
PRICE_RB INTEGER,
BASE_ID INTEGER,
METKA INTEGER
);
ALTER TABLE COMPS ADD CONSTRAINT COMPS_PK PRIMARY KEY (COMPS_ID);
ALTER TABLE COMPS ADD CONSTRAINT BASE_COMPS_FK FOREIGN KEY (BASE_ID) REFERENCES BASE (BASE_ID);
ALTER TABLE COMPS ADD CONSTRAINT CATEGORY_COMPS_FK FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORY (CATEGORY_ID);
ALTER TABLE COMPS ADD CONSTRAINT GOODS_COMPS_FK FOREIGN KEY (GOODS_ID) REFERENCES GOODS (GOODS_ID);
CREATE INDEX COMPS_IDX1 ON COMPS (COMPS_NUM);
Я понимаю, что запись base_id NOT IN (SELECT base_id FROM comps WHERE base_id IS NOT NULL) это не красиво, но все же бывает необходимость и в этом.
Проверил разницу выполнения больше половины запросов, используемых в моей программе, в Ib и Fb, в Fb выполнение во многих запросах быстрее: где на 10 мс, а где и на 400 мс. Но этот запром меня просто убил. Подскажите, как ускорить этот запрос FB. Плиз-з.