триггер @ План выполнения .. Декартово произведение - PullRequest
1 голос
/ 06 сентября 2011

Идея заключается в том, что пользователь запускает запрос и имеет плохой декартов, стоимость которого превышает определенный порог.Тогда оракул посылает его мне и пользователю по электронной почте.Я пробовал несколько вещей, но они не работают во время выполнения.Если жаба и разработчик sql могут увидеть план выполнения.тогда я верю, что там есть информация, я просто нахожу ее.Или мне, возможно, придется принять другую логику.

1 Ответ

1 голос
/ 06 сентября 2011

В общем, это, вероятно, невозможно.

Теоретически, если вы действительно были уверены, вы можете сгенерировать триггерные детализированные аудиты (FGA) для каждой таблицы в вашей системе, которые срабатывают для каждых SELECT, INSERT, UPDATE и DELETE, получите SQL_ID из V$SESSION, присоединитесь к V$SQL_PLAN и реализуйте любую логику, какую захотите.Это технически возможно, но это потребует довольно много кода, и вы добавите потенциально приличное количество накладных расходов к каждому запросу в вашей системе.Это, вероятно, не практично.

Вместо того, чтобы пытаться использовать триггер, вы можете написать процедуру, которая должна была запускаться каждые несколько минут, через DBMS_JOB или DBMS_SCHEDULER пакеты, которые будут запрашивать V$SESSION для всех активных сессий, присоединяться к V$SQL_PLAN и реализовывать любую логику, какую вы захотите.Это исключает накладные расходы при попытке запуска триггера каждый раз, когда любой пользователь выполняет какой-либо оператор.Но это все еще требует приличного количества кода.

Вместо написания какого-либо кода, в зависимости от бизнес-проблемы, которую вы пытаетесь решить, может быть проще создать ограничения ресурсов для профиля пользователя , чтобы разрешить Oracle применять ограничения на количество ресурсов, которое может потреблять любой оператор SQL.Например, вы можете установить для пользователя CPU_PER_CALL, LOGICAL_READS_PER_CALL или COMPOSITE_LIMIT, чтобы ограничить количество ЦП, количество логических операций ввода-вывода или составной предел ЦП и логических операций ввода-вывода, которые представляют собой один операторможет сделать, прежде чем Oracle убьет его.

Если вы хотите еще больше контроля, вы можете использовать Oracle Resource Manager .Это может позволить вам что-либо сделать, например, запретить Oracle запускать запросы от определенных пользователей, если предполагается, что они выполняются слишком долго, или ограничить ресурсы, которые может потреблять группа пользователей, если существует конфликт между этими ресурсами.Oracle может автоматически перемещать долго выполняющиеся запросы от определенных пользователей в группы с более низким приоритетом, она может автоматически уничтожать долго выполняющиеся запросы, может предотвращать их запуск в первую очередь или любую комбинацию этих вещей.

...