Столкнулся с необходимостью использования псевдонимов столбцов, где условие для выбора.Найденное возможное решение здесь .
Предположим, у нас есть отношение один-к-одному (пользователь-роль), и мы хотим получить следующие результаты:
SELECT u.name AS u_name, r.name AS r_name
FROM users AS u
INNER JOIN roles AS r
ON u.role_id = r.role_id
WHERE u.name = 'John'
И у нас есть соответствующий idex для user.name
(только для примера).
Если этот запрос выполняется с EXPLAIN
, он показывает все индексы, которые используются во время выбора (включая индекс для имени).
Теперь, так как мы хотим использовать псевдонимы в предложении WHERE
, на основе предложенного решения мы можем переписать запрос:
SELECT * FROM (
SELECT u.name AS u_name, r.name AS r_name
FROM users AS u
INNER JOIN roles AS r
ON u.role_id = r.role_id
) AS temp
WHERE u_name = 'John'
Как видите, в вложенном предложении нет WHERE
Выбрать.Выполнение этого запроса с EXPLAIN
дает те же результаты (просто признаюсь, я не эксперт в анализе результатов 'объяснения', но все же):
- те же индексы
- такие же затраты
- аналогичное время выполнения
И я немного смущен этим результатом: был убежден, что по крайней мере индекс для имени пользователя не будет использоваться.
Q1: Использует ли postgres индексы таким образом?
Q2: Возможны ли проблемы с производительностью?