У меня есть следующий запрос, который я пытаюсь оптимизировать, запрос выполняется за 3 секунды, если я удалю условие соединения I.ident_id в (выберите отдельный (ident_id) из MISSING_Images miss) из ниже запроса но с этим я занимаю 3 минуты, чтобы выполнить.Медленный запрос с несколькими объединениями
SELECT IDENT_ID
FROM tbl_IDENT I
JOIN tbl_TA AN ON (AN.IDENT_ID = I.IDENT_ID and AN.anchor_point = I.c_id)
JOIN tbl_AB A ON (A.A_ID = I.A_ID)
JOIN tbl_FULL_ARCHIVE FT ON (FT.ARCHIVE_ID = I.ARCHIVE_ID)
WHERE (I.DATA_STATUS = 'ACTIVE' or I.DATA_STATUS = 'INACTIVE')
AND
(
I.FD = 'Y'
OR
I.ident_id in (select distinct(ident_id) from MISSING_Images miss where substr(miss.NAME, 0, INSTR(miss.NAME, '.',-1,1)) in (SELECT substr(IMG_NAME, 0, INSTR(IMG_NAME, '.',-1,1)) FROM IMAGES))
);
выбрать отличный (ident_id) от MISSING_Images miss возвращение 2000 записей и основной tbl_IDENT имеет более 100 000 записей. У меня есть индекс, созданный на I.ident_id
Любой намек на его улучшение. Я использую оракул 10g.
Я видел несколько тестов в DB2, где «EXISTS» работает лучше, чем «IN», поэтому меня не удивит то же самое, что и в Oracle.Тем не менее, если у вас нет индекса на MISSING_Images.ident_id, создание этого индекса приведет к значительному улучшению. –
Привет, Майк, с индексом MISSING_Images.ident_id, но я обновил этот вопрос, потому что забыл добавить предложение where в MISSING_Images, которое использует substr, и это кажется реальной проблемой. – atif
@atif Сколько у вас изображений? Есть ли возможность сохранить внешний ключ в IMAGES в MISSING_Images вместо разбора и сравнения имен? – Multisync