这个想法是当用户运行一个查询,并且有一个糟糕的笛卡尔,成本高于某个阈值。然后oracle通过电子邮件发给我和user。我尝试了一些东西,但它们在运行时不起作用。如果蟾蜍和sql开发人员可以看到执行计划。那么我相信那里有信息,我就会找到它。或者我可能不得不采用另一种逻辑
一般来说,这可能是不可能的。
理论上,如果您确实确定了,您可以为系统中的每个表生成细粒度审计(FGA)触发器,为每个SELECT
、INSERT
、UPDATE
和DELETE
触发,从V$SESSION
获取SQL_ID
,连接到V$SQL_PLAN
,并实现您想要的任何逻辑。这在技术上是可行的,但它将涉及相当多的代码,并且您将为系统中的每个查询添加潜在的可观数量的开销。这可能不实际。
与其尝试使用触发器,不如编写一个通过DBMS_JOB或DBMS_SCHEDULER包计划每隔几分钟运行一次的过程,该过程将查询V$SESSION
中的所有活动会话,连接到V$SQL_PLAN
,并实现您想要的任何逻辑。这样就消除了每次用户执行任何语句时都试图运行触发器的开销。但它仍然涉及相当数量的代码。
比起编写任何代码,根据您想要解决的业务问题,在用户配置文件上创建资源限制可能更容易,从而让Oracle对任何单个SQL语句可以消耗的资源数量进行限制。例如,您可以设置用户的CPU_PER_CALL
, LOGICAL_READS_PER_CALL
或COMPOSITE_LIMIT
来限制CPU的数量,逻辑I/O的数量,或者单个语句在Oracle杀死它之前可以完成的CPU和逻辑I/O的组合限制。
如果你需要更多的控制,你可以使用Oracle资源管理器。这可以让您做任何事情,从防止Oracle运行来自某些用户的查询,如果他们估计运行时间过长,或者节流一组用户可以消耗的资源,如果这些资源存在争用。Oracle可以自动将长时间运行的查询从特定用户转移到低优先级组,它可以自动终止长时间运行的查询,它可以首先阻止它们运行,或者这些事情的任何组合。