Как оптимизировать SQL обновления в Oracle, который постоянно обновляет определенную строку - PullRequest
0 голосов
/ 15 апреля 2019

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

Я уже использовал / * + параллельный (авто) * /, но без прогресса!

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

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

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

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

"когда я часто выполняю обновление SQL для определенного POS, операторы обновления занимают много времени"

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

Что касается решений, особенности зависят от архитектуры вашего приложения. Может быть целесообразно поставить в очередь обновления баланса и применить их в фоновом процессе. Может быть целесообразно ввести стратегию пессимистической блокировки с использованием синтаксиса SELECT… FOR UPDATE. Может быть, вам нужно изменить дизайн транзакций с меньшими единицами работы, чтобы вы чаще выполняли COMMIT, что означало бы, что обновление удерживает блокировку на меньшее время. К сожалению, в вашем вопросе недостаточно подробностей, чтобы мы могли предложить конкретное предложение.

0 голосов
/ 15 апреля 2019

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

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

Вы хотите индекс на pos_status(posid).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...