- Посмотрите содержимое Dockerfile и init.sql
- Соберите докер-образ БД:
docker build -t my_db .
- Запустите докер-контейнер БД:
docker run --name my_db -p 5433:5432 my_db
- Откройте соединение в БД любым удобным вам инструментом. Локальный порт 5433, логин postgres, пароль postgres
- Посмотрите план запроса
select * from bills
. Сколько партиций попало в план? - Посмотрите план запроса
select * from bills where create_dtime >= '2021-10-01' and create_dtime < '2021-12-01'
. Сколько партиций попало в план? Подсказка: Посмотрите, какие именно партиции попали в план. Если увидите сентябрь, то посмотрите на таймзоны партиций и фильтров. - Посмотрите план запроса
select * from bills where currency = 'USD'
. Индекс по currency используется? Если нет, то почему? - Посмотрите план запроса
select * from bills where currency = 'RUR'
. Индекс по currency используется? Если нет, то почему? - Если предположить, что значения currency равномерно распределены, есть ли смысл в индексе по currency? Если нет, то почему?
Мне важно знать, как вам зашла эта домашка. Оставьте, пожалуйста, обратную связь: https://forms.gle/3eCNJm5pGxzbsa2FA. Заполнение формы займет у вас 3 минуты. Благодаря этому я смогу учесть в будущем хорошие практики и избежать повторения ошибок.
- Запустите параллельно три сессии
- Установите в вашем клиенте manual commit mode. Transaction Isolation Level оставьте Read Commited.
- В одной сессии выполните, но не коммитьте
insert into bills(uid, create_dtime, amount, currency) values ('de5d09be-acfe-42f1-940c-f90db3c43a33', '2021-01-01', 100, 'RUR')
- Во второй сессии запустите этот же запрос. Увидите, что он "повис"
- В третьей сессии выполните запрос:
select * from pg_stat_activity join pg_locks pl on pg_stat_activity.pid = pl.pid where pg_stat_activity.wait_event_type = 'Lock' and not transactionid is null
- На выбор: закоммитьте запрос в первой сессии или в свободной сессии вызовите
select pg_cancel_backend(pid первой сессии)