У меня есть следующий запрос,Sub запроса на больших таблицах с присоединиться к крайне медленно
SELECT * FROM users,
(SELECT *
FROM mastery
WHERE champion_rank = 1
ORDER BY global_rank ASC
LIMIT 3) as ranks
WHERE users.id = ranks.user_id
Мастерства имеет 22Й строки и пользователи имеют строки 5M. Для выполнения вышеуказанного запроса требуется 1800 мс.
Проблема заключается в том, что следующий подзапросе при запуске самого по себе занимает 2,5 мс для выполнения
SELECT *
FROM mastery
WHERE champion_rank = 1
ORDER BY global_rank ASC
LIMIT 3
И для извлечения одного пользователя из таблицы пользователей занимает 2,5 мс
SELECT * FROM users WHERE id = 4234523
Так теоретически, если я только что изменил свой код, чтобы сделать первый подзапрос, а затем для каждой возвращаемой строки выполните дополнительный запрос, для всего процесса потребуется 2,5 + (3 * 2,5) = 10 мс.
Неужели postgres делает что-то странное?
Структуру и индексы баз данных можно найти here
Почему бы не использовать соединение? Кроме того, поставили ли вы индексы на стол? – JanR
Пожалуйста, прочитайте http://stackoverflow.com/tags/postgresql-performance/info и http://wiki.postgresql.org/wiki/SlowQueryQuestions, затем измените свой вопрос и добавьте недостающую информацию. –