Следующий запрос в 10 раз быстрее, если я удалю предложение «ИЛИ».Медленный запрос SQL с использованием OR
WITH RECURSIVE toeng(lang1, english, syn, enid) AS
(SELECT lang1.word, english.word, english.synonym, english.id
FROM lang1 INNER JOIN english ON lang1.english_id=english.id
UNION
SELECT CAST('' as VARCHAR(255)), english.word, english.synonym, english.id
FROM english JOIN toeng ON toeng.syn=english.id OR toeng.enid=english.synonym)
....
Целью запроса является получение всех родителей/детей начального набора узлов рекурсивно. Есть ли способ сделать это быстрее? Я попытался разбить его на несколько соединений, но я не могу найти то, что полностью эквивалентно этому. Я использую PostgreSQL.
У вас есть какие-либо индексы на 'english' или' toeng'? Если да, то какие столбцы? –
'english' правильно проиндексирован,' id' является его основным ключом, а 'синоним' является внешним ключом к' id'. как для 'toeng', он определен рекурсивно, поэтому я не знаю, могу ли/как его индексировать. – splinter123
Пожалуйста, прочтите http://stackoverflow.com/tags/postgresql-performance/info, затем отредактируйте свой вопрос и добавьте недостающую информацию. –