#postgresql #performance #query-optimization
Вопрос:
Я изучаю PostgreSQL и думаю об одном случае, как показано ниже: если у меня есть таблица пользователей, столбцы-идентификатор пользователя, имя пользователя, год, месяц, день, транзакция_счет. И индекс таблицы (год, месяц, день, имя пользователя)
если у нас 1 миллиард пользователей, могу ли я написать свой запрос следующим образом :
select t1.user_name, sum(t1.transaction_amount) total_txn
(
-- sub query
select year, month, day, user_name, transaction_amount from user where year=2021 and month = 3 and day = 5
) t1.
group by t1.year, t1.month, t1.day, t1.user_name
order by total_txn desc
limit 10, 10
Могу ли я сказать, что подзапрос должен быть «получить меньший набор данных», чтобы моя группа по порядку и по порядку могла быть выполнена для меньшего набора данных ? Или весь запрос должен сканировать полную таблицу ?
Спасибо
Комментарии:
1. Запустите объяснить анализ вашего запроса. Затем перепишите запрос без подзапроса, а также запустите объяснение. Сравните разницу. Примечание:
Explain analyze
на самом деле запрос выполняется до завершения, поэтому это может занять некоторое время.2. Не храните
year, month, day
в отдельных столбцах. Вместо этого используйте aDATE
или aTIMESTAMP
.