Skip to content

Latest commit

 

History

History
35 lines (31 loc) · 3.19 KB

README.md

File metadata and controls

35 lines (31 loc) · 3.19 KB

Домашнее задание по разработке БД PostgreSQL

  1. Посмотрите содержимое Dockerfile и init.sql
  2. Соберите докер-образ БД: docker build -t my_db .
  3. Запустите докер-контейнер БД: docker run --name my_db -p 5433:5432 my_db
  4. Откройте соединение в БД любым удобным вам инструментом. Локальный порт 5433, логин postgres, пароль postgres

Ответьте на следующие вопросы в тесте:

  1. Посмотрите план запроса select * from bills. Сколько партиций попало в план?
  2. Посмотрите план запроса select * from bills where create_dtime >= '2021-10-01' and create_dtime < '2021-12-01'. Сколько партиций попало в план? Подсказка: Посмотрите, какие именно партиции попали в план. Если увидите сентябрь, то посмотрите на таймзоны партиций и фильтров.
  3. Посмотрите план запроса select * from bills where currency = 'USD'. Индекс по currency используется? Если нет, то почему?
  4. Посмотрите план запроса select * from bills where currency = 'RUR'. Индекс по currency используется? Если нет, то почему?
  5. Если предположить, что значения currency равномерно распределены, есть ли смысл в индексе по currency? Если нет, то почему?

Мне важно знать, как вам зашла эта домашка. Оставьте, пожалуйста, обратную связь: https://forms.gle/3eCNJm5pGxzbsa2FA. Заполнение формы займет у вас 3 минуты. Благодаря этому я смогу учесть в будущем хорошие практики и избежать повторения ошибок.

Задание со звездочкой - смотрим блокировки

  1. Запустите параллельно три сессии
  2. Установите в вашем клиенте manual commit mode. Transaction Isolation Level оставьте Read Commited.
  3. В одной сессии выполните, но не коммитьте insert into bills(uid, create_dtime, amount, currency) values ('de5d09be-acfe-42f1-940c-f90db3c43a33', '2021-01-01', 100, 'RUR')
  4. Во второй сессии запустите этот же запрос. Увидите, что он "повис"
  5. В третьей сессии выполните запрос: 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
  6. На выбор: закоммитьте запрос в первой сессии или в свободной сессии вызовите select pg_cancel_backend(pid первой сессии)