Остановка выполнения кода SQL

У нас огромная база данных Oracle, и я часто выбираю данные с помощью SQL Navigator (v5.5). Время от времени мне нужно останавливать выполнение кода, нажимая на Stop Кнопка, потому что я понимаю, что в моем коде отсутствуют части. Проблема в том, что после нажатия на Stop Кнопка, это занимает очень много времени, чтобы завершить процесс остановки (иногда это занимает несколько часов!). Программа говорит Stopping... на нижней панели, и я теряю много времени, пока он не закончится.

В чем причина этого? Как я могу ускорить процесс остановки? На всякий случай я не админ; Я ограниченный пользователь, который использует некоторые представления для доступа к базе данных.

2 ответа

Решение

Чтобы остановить запрос, необходимо выполнить две вещи:

  1. Фактический процесс Oracle должен быть уведомлен о том, что вы хотите отменить запрос
  2. Если в запрос внесены какие-либо изменения в БД (DDL, DML), работу необходимо откатить.

Во-первых, процесс Oracle, выполняющий запрос, должен время от времени проверять, должен ли он отменить запрос или нет. Даже когда он выполняет длинную задачу (например, большой HASH JOIN), он проверяет каждые 3 секунды или около того (я ищу источник этой информации, я обновлю ответ, если найду его). Теперь ваша программа может правильно взаимодействовать с Oracle? Я не знаком с SLQ Navigator, но я полагаю, что механизм отмены должен работать как с любым другим инструментом, поэтому я предполагаю, что вы ждете второй пункт:

Как только процесс получает уведомление о прекращении работы, он должен отменить все, что уже выполнено в этом запросе (все операторы являются атомарными в Oracle, их нельзя остановить в середине без отката). Большую часть времени в выражении DML откат займет больше времени, чем уже выполненная работа (я вижу это так: Oracle оптимизирован для работы вперед, а не назад). Если вы в этом случае (большой DML), вам придется набраться терпения во время отката, вы не можете сделать многое, чтобы ускорить процесс.

Если ваш запрос простой SELECT и ваш инструмент не позволяет вам отменить его, вы можете прервать сеанс (требуются права администратора из другого сеанса) - это должно быть мгновенным.

Когда вы отменяете запрос, клиент Oracle должен отправить OCIBreak(), но это не реализовано на сервере Windows, это может быть причиной.

Кроме того, ваш администратор БД должен проверить значение SQLNET.EXPIRE_TIME,

Другие вопросы по тегам