Запрос на обновление Postgres, вызывающий увеличение ожидания блокировки

#java #sql #postgresql #spring-boot #jpa

Вопрос:

Так что у меня есть столик:

 Resource(rm_id::UUID, resource_id::UUID, available::boolean, date::Date, node_id::varchar, start_time::varchar, end_time::varchar, created_at: DateTime, updated_at: DateTime)
 

Итак, я использую некоторые события обновления ресурсов из темы из GCP.
У меня есть 2 вида событий: события resource_availability и события resource_unavailability.

Данные о событиях

 (resource_id, date, available, start_time, end_time)
 

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

 update resource set available = :available, updated_at = :updatedAt where resource_id = :someId AND date = :some_date AND start_time = :someTime AND endTime = :someTime
 

В настоящее время у меня есть этот индекс

 CREATE index resource_update_select on resource(resource_id, node_id, date);
 

Итак, предположим, что существует несколько событий

 {"resource_id":1, "available": true, "date": "date1", start_time = "00:00", "end_time" = "23:59"}

{"resource_id":1, "available": true, "date": "date1", start_time = "23:00", "end_time" = "23:30"}


{"resource_id":2, "available": true, "date": "date2", start_time = "00:00", "end_time" = "23:59"}

{"resource_id":3, "available": true, "date": "date3", start_time = "00:00", "end_time" = "23:59"}
 

Вышеуказанные события подхватываются различными потоками/блоками, теперь, когда они выполняются параллельно, они увеличивают время ожидания блокировки, как я вижу из GCP Query Insights. Я не уверен, что я здесь делаю не так? Должен ли я сделать выбор, чтобы проверить, существует ли какая-либо запись в таблице, а затем обновить запись, или я что-то еще делаю не так?? Пожалуйста, помогите мне.

Примечание: Количество событий, которые я получаю, огромно, вы можете сказать, что каждый модуль может обрабатывать 10 потоков, а модули могут масштабироваться до 20 модулей. Таким образом, 200 потоков могут одновременно обрабатывать, я думаю, именно это и является причиной проблемы.

Обновление 1:

Ожидание блокировки еще больше увеличивает производительность процессора моей базы данных до 100%. Вот тут-то все и становится плохо.

Комментарии:

1. Когда вы начинаете и заканчиваете транзакции? И есть ли на самом деле проблема? Если время, проведенное в ожидании блокировки, в противном случае было бы потрачено в режиме ожидания, то имеет ли это значение?

2. Как измеряется процессор DB? Ожидание с высокой блокировкой обычно должно приводить к снижению процессора, так как ожидание не потребляет много процессора

3. Я не уверен, как измеряется процессор DB в GCP, нужно проверить это один раз, но я вижу, что всплеск процессора увеличивается до 70-100%, в то время как ожидание блокировки увеличилось. Мне тоже это показалось странным.