FB 1.5.1
Имеется таблица населенных пунктов (163 982 записей):
Код: Выделить всё
CREATE TABLE TOWN (
ID_TOWN INTEGER NOT NULL,
ID_REGION INTEGER NOT NULL,
ID_DISTRICT INTEGER,
ID_TOWN_TYPE INTEGER NOT NULL,
NAME VARCHAR(40) NOT NULL,
ZIP_CODE VARCHAR(6)
);
ALTER TABLE TOWN ADD CONSTRAINT PK_TOWN PRIMARY KEY (ID_TOWN);
ALTER TABLE TOWN ADD CONSTRAINT FK_DISTRICT__TOWN FOREIGN KEY (ID_DISTRICT) REFERENCES DISTRICT (ID_DISTRICT) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE TOWN ADD CONSTRAINT FK_REGION__TOWN FOREIGN KEY (ID_REGION) REFERENCES REGION (ID_REGION) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE TOWN ADD CONSTRAINT FK_TOWN_TYPE__TOWN FOREIGN KEY (ID_TOWN_TYPE) REFERENCES TOWN_TYPE (ID_TOWN_TYPE);
CREATE INDEX IDX_TOWN_NAME ON TOWN (NAME);
Код: Выделить всё
SELECT
T.ID_TOWN
, R.ID_REGION
, D.ID_DISTRICT
, TT.SHORT_NAME
, T.ID_TOWN_TYPE
, T.NAME
, T.ZIP_CODE
, R.NAME AS REGION_NAME
, COALESCE(D.NAME, '-') AS DISTRICT_NAME
FROM TOWN T LEFT JOIN DISTRICT D ON T.ID_DISTRICT = D.ID_DISTRICT
LEFT JOIN REGION R ON T.ID_REGION = R.ID_REGION +0
LEFT JOIN TOWN_TYPE TT ON T.ID_TOWN_TYPE = TT.ID_TOWN_TYPE +0
WHERE UPPER(T.NAME) LIKE UPPER(:pWord) || '%'
Железо не специализированно: PIV 2Г ОЗУ 800Мб.
Вопрос как можно снизить нагрузку? Читал что индексы с больших таблиц на маленькие снижают производительность. Попытка деактивировать индексы, которые создаются автоматом (IBExpert) для FK_TOWN_TYPE__TOWN и FK_REGION__TOWN успехом не увенчались... Сложилось впечатление, что деактивировать индекс и оставить FK нельзя. Что посоветуете?