这个想法是当用户运行查询并且有一个坏的笛卡尔成本超过某个阈值时。然后oracle通过电子邮件发送给我和用户。我尝试了一些东西,但它们在运行时没有用。如果toad和sql开发人员可以看到执行计划。那么我相信那里有信息我就找到了。或者我可能不得不采用另一种逻辑。
答案 0 :(得分:1)
一般来说,这可能是不可能的。
从理论上讲,如果您确实如此,那么您可以为系统中的每个表格生成细粒度审核(FGA)触发器,触发每个SELECT
,INSERT
,UPDATE
和DELETE
,从SQL_ID
获取V$SESSION
,加入V$SQL_PLAN
,并实现您想要的任何逻辑。这在技术上是可行的,但它会涉及相当多的代码,并且您将为系统中的每个查询添加可能相当大的开销。这可能不实用。
您可以编写一个程序,该程序计划通过DBMS_JOB或DBMS_SCHEDULER程序包每隔几分钟运行一次,该程序包将查询V$SESSION
所有活动会话,加入V$SQL_PLAN
,并实现你想要的任何逻辑。这消除了每次任何用户执行任何语句时尝试运行触发器的开销。但它仍然涉及到相当数量的代码。
根据您尝试解决的业务问题,不是编写任何代码,而是创建resource limits on the user's profile以让Oracle对任何单个SQL语句可以使用的资源量实施限制可能更容易。例如,您可以设置用户的CPU_PER_CALL
,LOGICAL_READS_PER_CALL
或COMPOSITE_LIMIT
来限制CPU数量,逻辑I / O量或CPU和逻辑I的复合限制/ O在Oracle杀死之前单个语句可以执行。
如果您想要更多控制权,可以使用Oracle Resource Manager。这可以允许您执行任何操作,防止Oracle在某些用户估计运行时间过长时运行查询,或者限制一组用户在这些资源存在争用时可以使用的资源。 Oracle可以自动将长时间运行的查询从特定用户移动到优先级较低的组,它可以自动终止长时间运行的查询,可以防止它们首先运行,或者这些事情的任意组合。