Соединения в большинстве случаев будут намного быстрее.
Давайте рассмотрим пример.
Позволяет использовать ваш первый запрос:
SELECT
(SELECT username FROM users WHERE records.user_id = user_id) AS username,
(SELECT last_name||', '||first_name FROM users WHERE records.user_id = user_id) AS name,
in_timestamp,
out_timestamp
FROM records
ORDER BY in_timestamp
Теперь рассмотрим, что у нас есть 100 записей в записях и 100 записей в пользователе. (Предполагается, что у нас нет индекса для user_id)
Итак, если мы понимаем ваш алгоритм, он говорит:
Для каждой записи
Просканируйте все 100 записей пользователей, чтобы узнать имя пользователя.
Сканируйте все 100 записей пользователей, чтобы узнать фамилию и имя
То есть, мы сканировали таблицу пользователей 100 * 100 * 2 раза. Это действительно стоит. Если мы рассмотрим индекс для user_id, это улучшит ситуацию, но стоит ли это.
Теперь рассмотрим соединение (вложенный цикл будет давать почти тот же результат, что и выше, но рассмотрим хеш-соединение):
Это как.
Составьте хеш-карту пользователя.
Для каждой записи
Найдите запись сопоставления в Hashmap. Что, безусловно, будет намного быстрее, чем зацикливание и поиск записи.
Так ясно, присоединения должны быть благоприятными.
ПРИМЕЧАНИЕ. Пример использования 100 записей может дать идентичный план, но идея состоит в том, чтобы проанализировать, как это может повлиять на производительность.