Остановка выполнения кода SQL - PullRequest
3 голосов
/ 15 октября 2010

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

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

Ответы [ 2 ]

5 голосов
/ 15 октября 2010

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

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

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

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

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

1 голос
/ 15 октября 2010

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

Также, имейтеDBA проверяет значение SQLNET.EXPIRE_TIME.

...