Как оптимизировать обновление SQL в Oracle, которое непрерывно обновляет определенную строку

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть таблица для POS. После каждой транзакции мне нужно обновлять баланс POS. Но когда я часто выполняю update SQL для определенного POS, то инструкции update занимают много времени. Можете ли вы предложить, как я могу сократить время обновления?

Я уже использовал /* parallel (auto) */ но никакого прогресса!

 update pos_station
set balance = balance - #balance#
where posid = #posId#
 

posid является первичным ключом pos_station таблицы.

Вот мои данные таблицы на картинке: введите описание изображения здесь

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

1. Опубликуйте сведения о таблице. Возможно, в posid нет индекса, и именно это вызывает длинный запрос. Потребуется больше информации для оценки

2. Сколько у вас записей? Сколько обновлений в секунду у вас есть? Как часто у вас есть вставка в эту таблицу? Вы проверяли соответствие этому обновлению?

3. Младен, у меня мало записей, но мне нужно часто обновлять каждую строку. После каждой финансовой транзакции мне нужно обновить баланс POS.

4. Добро пожаловать в Stack Overflow. Вы фиксируете изменения после каждого обновления?

Ответ №1:

«когда я часто выполняю update SQL для определенного POS, то инструкции update занимают много времени»

Это звучит не как проблема с производительностью, а скорее как плохой дизайн транзакции. Несколько сеансов, пытающихся обновить одну и ту же строку, будут блокировать друг друга. Первый сеанс, который получит блокировку строки, заблокирует все остальные, что приведет к их зависанию. «Долгое время» — это не само обновление и не время поиска для поиска записи: это ожидание получения блокировки для применения обновления. Параллельная обработка не улучшит эту ситуацию.

Что касается решений, специфика зависит от архитектуры вашего приложения. Возможно, было бы целесообразно поставить обновления баланса в очередь и применить их в фоновом процессе. Возможно, было бы целесообразно ввести пессимистическую стратегию блокировки с использованием SELECT … ДЛЯ синтаксиса ОБНОВЛЕНИЯ. Возможно, вам нужно перепроектировать свои транзакции с меньшими единицами работы, чтобы вы ФИКСИРОВАЛИ чаще, что означало бы, что обновление удерживает блокировку в течение меньшего промежутка времени. К сожалению, в вашем вопросе недостаточно подробностей, чтобы мы могли предложить конкретное предложение.

Ответ №2:

Для этого запроса:

 update pos_station
    set balance = balance - #balance#
    where posid = #posId#;
 

Вы хотите включить индекс pos_status(posid) .

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

1. в таблице pos_station posid является первичным ключом.