Я создал базу данных с требованиями и протестировал ее.С точки зрения «времени», на самом деле нет никакой разницы, но, возможно, это потому, что моя тестовая среда песочницы.
В любом случае, я «объяснил» эти запросы к дереву:
1- select * from users where id in (1,2,3,4,5,6,7,8,9,10,..3000)
стоимость: "Сканирование индекса с использованием user_pkey для пользователей ( стоимость = 4.04..1274.75 строк = 3000 ширина = 11)" "Индекс Cond: (id = ANY ('{1,2, 3,4,5,6,7,8,9,10 (...) "
2- SELECT * FROM users AS u WHERE EXISTS (SELECT 1 FROM lookuptable A-- l WHERE u.id = l.id);
<- <em>Обратите внимание, что я удалил" отличную ", этобесполезно.
стоимость: "Слияние Полу Соединение ( стоимость = 103.22..364.35 строк = 3000 ширина = 11)"
"Слияние Cond: (u.id = l.id) "
" -> Сканирование индекса с использованием user_pkey для пользователей u ( стоимость = 0.29..952.68 строк = 30026 ширина = 11) "
"-> Сканирование индекса с использованием users_pkey для пользователей u ( стоимость = 0.29..952.68 строк = 30026 ширина = 11)"
3- Select * from users where id IN (select id from lookuptable)
"Слияние с половиной объединения ( стоимость = 103.22..364.35 строк = 3000 ширина = 11) "
" Конвертер слияния: (users.id = lookuptable.id) "
"-> Сканирование индекса с использованием users_pkею для пользователей ( стоимость = 0,29..952.68 строк = 30026 ширина = 11) "
" -> Сканирование только по индексу с использованием lookuptable_pkey для таблицы поиска ( стоимость = 0,28..121.28 строк = 3000 width = 4) "
Графическое объяснение двух последних запросов:
![This is the explain graiphic of the last two](https://i.stack.imgur.com/4YG1K.png)
В любом случае, как я читал в некоторых комментариях выше, вы также должны добавить к стоимости запросов затраты на заполнение таблицы поиска ... а также тот факт, что вам нужно разделить «запрос» наразличные исполнения, которые могут вызвать «транзакционные проблемы».Я буду использовать первый запрос.