这个想法是当用户运行查询并且有一个坏的笛卡尔坐标,其成本高于某个阈值。然后 oracle 将其通过电子邮件发送给我和用户。我尝试了几件事,但它们在运行时不起作用。如果toad和sql developer可以看到执行计划。然后我相信那里有我刚刚找到的信息。或者我可能不得不采用另一种逻辑。
1 回答
一般来说,这可能是不可能的。
从理论上讲,如果您真的下定决心,您可以为系统中的每个表生成细粒度审计 (FGA) 触发器,这些触发器会触发每个SELECT
、INSERT
、UPDATE
和DELETE
,获取SQL_ID
from V$SESSION
、 join to 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 数量或 CPU 和逻辑 I/O 的复合限制,单个语句在 Oracle 杀死它之前可以执行。
如果您想要更多的控制,您可以使用Oracle Resource Manager。这可以让您做任何事情,例如在估计运行时间过长的情况下阻止 Oracle 运行来自某些用户的查询,或者在存在争用这些资源时限制一组用户可以使用的资源。Oracle 可以自动将长时间运行的查询从特定用户移动到较低优先级的组,它可以自动终止长时间运行的查询,它可以首先阻止它们运行,或者这些事情的任何组合。