#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 является первичным ключом.