Использование подзапроса для предложения IN Oracle - PullRequest
0 голосов
/ 12 июня 2018

У меня возникли проблемы с использованием подзапроса для предложения IN запроса.Жесткое кодирование значений IN .. позволяет выполнить запрос быстро, но использование подзапроса замедляет все.Есть ли способ ускорить этот запрос?

SELECT col1, col2, col3 FROM table1
WHERE ...
and col1 in (SELECT col1 FROM table2)
...

* Значения для предложения IN будут представлять собой список строк

SELECT col1, col2, col3 FROM table1
WHERE ...
and col1 in ('str1', 'str2', 'str3', ...)
...

Вышеприведенное работает нормально.

РЕДАКТИРОВАТЬ: я думаю, что я упрощаю проблему.Запрос, который я пытаюсь выполнить, выглядит следующим образом:

SELECT col1, col2, col3, ...
FROM table1 t1, table2 t2
WHERE t1.col1 IN (SELECT col FROM table3)
and t1.col2 < 50
and t2.col3 = t1.col3
...

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Используйте JOIN вместо

и сохраняйте индекс, определенный для table1.col1 или table2.col3 или table1.col3 или table3.col :

SELECT col1, col2, col3, ...
  FROM table1 t1
 INNER JOIN table2 t2 on ( t2.col3 = t1.col3 )
 INNER JOIN table3 t3 on ( t1.col1 = t3.col )
 WHERE t1.col2 < 50;
0 голосов
/ 12 июня 2018

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.Вы должны написать запрос как:

SELECT col1, col2, col3, ...
FROM table1 t1 JOIN
     table2 t2
     ON t2.col3 = t1.col3
WHERE t1.col1 IN (SELECT col FROM table3) AND
      t1.col2 < 50;

Я бы написал это, используя EXISTS, а не IN:

SELECT col1, col2, col3, ...
FROM table1 t1 JOIN
     table2 t2
     ON t2.col3 = t1.col3
WHERE EXISTS (SELECT 1 FROM table3 t3 WHERE t1.col1 = t3.col) AND
      t1.col2 < 50;

Фильтрация всего на table1;однако столбцы сравниваются с неравенствами.Я бы попробовал следующие индексы: table2(col3), table1(col2, col1) и table3(col).

0 голосов
/ 12 июня 2018

Вы не можете написать select * from.Если вы укажете select * from, он не поймет, какой столбец сравнивать с таблицей2Используйте имя столбца, которое вам нужно.

SELECT * FROM table1
WHERE ...
and col1 in (SELECT col1 FROM table2)
...
...