Задачи от Postgres Professional

СМИ о нас Источник: Журнал «ХАКЕР»
 


          Когда мы, программисты, думаем (и говорим) о себе, мы всегда представляем себя интеллектуальными личностями, которые постоянно вынуждены заниматься самосовершенcтвованием и повышением квалификации, ведь этого (и формально так оно и есть) требует от нас постоянно меняющийся мир информационных технологий. Несмотря на эти красивые слова, многие из нас (так, нас точно читают только программисты или здесь и шпионы затесались?) в реальности киснут на монотонной и стереотипной работе, требующей скорее опыта, старого багажа знаний и представления о том, где можно найти решение проблемы, буде она у нас вдруг возникнет. С каждым годом, прожитым послe окончания института, нашему мозгу все меньше хочется узнавать новое, переосмысливать узнанное и искать новые пути решения проблем, но это не значит, что мы не должны периодически его заставлять работать на повышенных оборотах. Еще как должны! Мозг тоже мышца :), и без тренировки его функции будут ухудшаться и ухудшаться. Поэтому решай наши задачки ежемесячно, и твой мыслительный орган навсегда останется быстрым, мощным и извилистым :).

          Компания, которая участвует в сегодняшнем выпуске, тебе точно известна — как минимум по одному слову в названии. Слово это — Postgres.

          Postgres Professional — относительно небольшая компания, трудится в ней около пятидесяти человек. В ее основе — разработчики известной СУБД PostgreSQL (среди основателей — три ведущих разработчика и активных участника международного сообщества). В 2016 году компания выпустила собственную СУБД Postgres Pro, представляющую собой улучшенную версию PostgreSQL. Передаю им слово!

 
Немного о Postgres Pro

          СУБД Postgres Pro включена в единый реестр отечественного ПО в числе первых продуктов, в мае 2016 года компания вошла в десятку будущих лидеров ИТ-рынка Рoссии по версии портала TAdviser, а среди крупных российских пользователей PostgreSQL — система межведомственного электронного взаимодействия, правительство Московской области, силовые структуры. Эта СУБД используется в таких компаниях и организациях, как «Яндекс», «Авито», «Рамблер», «Манго Телеком», МИА «Россия сегодня», Skype, Instagram, MasterCard, Huawei, Sony, Hitachi, TripAdvisor, Федеральная резервная система США, Вооруженные силы США, государственные органы Франции, структуры Европейского союза.

Как проходит собеседование в компании Postgres Professional

          У нас нет многоступенчатых собеседований, психологических тестирований, словом, мы не мучаем кандидатов формaльностями, как это встречается в крупных компаниях. Когда человек, который хочет работать в Postgres Professional, приходит на собеседование, с ним разговаривают сразу несколько сотрудников: начальник отдела, куда кандидат устраивается на работу, HR-специалист, представитель высшего руководства, иногда — основатели компании. Решение принимается после одного-двух собеседований, на них обсуждаются различные профессиональные вопросы, в итоге становится понятен и уровень квалификации соискателя, и подходим ли мы друг другу для командной работы.

          Конечно, с кандидатами в разработчики мы не просто разговариваем, а даем каждому решить одну-две задачи вроде тех, что предложены сегодня в этой рубрике. И обязательно задаем вопросы практической направленности, предлагаем ответить на типичный клиентский запрос. Какими могут быть эти практические задания? Например, компания оказывает услуги по техподдержке PostgreSQL и нашей собственной разработки — СУБД Postgres Pro. Обычно для систем, которые создаются на базе свободного ПО, поддержка — вопрос проблемный. В России мы единственные, кто ее предоставляет, и для нас это — дело большой важности. Для техподдержки в Postgres Professional выделены специальные сотрудники, а остальные разработчики могут подключаться, когда у клиентов возникают проблемы. Для каждого соискателя мы моделируем ситуацию вроде тех, которые встречаются у заказчиков, и просим найти решение.

Задачи от Postgres Professional

Задача 1

          Есть таблицы пользователи usr(id int,name text), друзья friend(usr_id int, friend_usr_id int) и посты post(id int, usr_id int, content text, added timestamptz). Напишите максимально эффективный запрос, возвращающий десять последних постов друзей заданного пользователя (могут быть многочисленные друзья с большим количеством постов в прошлом).


Задача 2

          Можно ли в строке, состоящей из символов ( и ), проверить баланс скобок? Как?


Задача 3

          Есть большая таблица работников employee(id int, occupation text, sex text). Так получилось, что таблица состоит исключительно из бульдозеристов-мужчин и нянечек-женщин. При эксплуатации выяснилось, что иногда запрос

select 'found' where exists (
  select * from employee
  where occupation=$1 and sex=$2
)

работает очень медленно. Когда это происходит и как этого можно избежать?


Задача 4

          Есть таблицы parent(id int) и child(id int, parent_id int references parent(id)). Накладываются ли какие-либо блокировки на строки таблицы parent при добавлении строк в таблицу child? Если да, то какие? Если нет, то почему?


Задача 5

          На каком уровне изоляции может выполняться запрос проверки бухгалтерского баланса для получения непротиворечивого результата (предполагается, что операции перевода средств работают корректно)?

select sum(
  case when type='debet'  then  amount
       when type='credit' then -amount
  end
) from ledger

 

Задача 6

          Почему данный запрос, обновляющий или добавляющий строки в случае их отсутствия, некорректен?

with upd as(
  update tusr set name='name2' where id=1 returning 1
),
ins as(
  insert into tusr(id,name)
  select 1, 'name'
  where not exists(select * from upd)
  returning 2
)
select * from ins

Задача 7

          Для обеспечения уникальности строк была создана следующая триггерная функция:

create or replace function check_uniq() returns trigger as
$code$
begin
  if exists (select * from tbl t where t.col=new.col) then
    raise exception 'Unique violation';
  end if;
end;
$code$
language plpgsql

Почему такой триггер некорректен? Как его сделать корректным?


Задача 8

          Какое сообщение выведет этот блок кода?

do $code$
declare
  ctx text;
begin
  raise sqlstate 'ER001';
exception
  when sqlstate 'ER000' then
    raise notice 'ER000';
  when sqlstate 'ER001' then
    raise notice 'ER001';
end;
$code$

 

 

Призы победителям


          Присылайте решения задач на адрес pr@postgrespro.ru!

          Оценивать работы и выбирать победителей будут наши специалисты во главе с автором задач Иваном Фролковым, одним из ведущих экспертов Postgres Professional. Победителям, приславшим большее число правильных ответов, мы приготовили специальные призы — бесплатные билеты на все три дня международного форума PgConf.Russia, который наша компания будет проводить в марте 2017 года в Москве.

 

Читать продолжение:

Победители задач от «Лаборатории Касперского»