2011-09-06 69 views
1

这个想法是当用户运行一个查询并且具有成本高于特定阈值的错误笛卡尔时。然后oracle将它发送给我和用户。我已经尝试过几件事,但它们在运行时不起作用。如果蟾蜍和sql开发人员可以看到执行计划。那么我相信那里有我刚刚找到的信息。或者我可能不得不采用另一种逻辑。触发器@执行计划..笛卡尔产品

回答

1

一般来说,这可能是不可能的。

从理论上讲,如果你真的确定,你可能会产生细粒度审计(FGA)触发了系统中的每一个表中火为每SELECTINSERTUPDATEDELETE,得到SQL_IDV$SESSION,加入到V$SQL_PLAN,并实现你想要的任何逻辑。这在技术上是可行的,但它会涉及到相当多的代码,并且会为系统中的每个查询添加潜在的大量开销。这可能不实际。

而不是试图用一个触发器,你可以写原定通过DBMS_JOBDBMS_SCHEDULER包,将查询V$SESSION所有活动会话每隔几分钟运行一个程序,加入到V$SQL_PLAN,和你想什么逻辑来实现。这消除了每次用户执行任何语句时尝试运行触发器的开销。但是它仍然需要大量的代码。

根据您尝试解决的业务问题,可能会更容易创建resource limits on the user's profile,以便Oracle强制限制任何单个SQL语句可以使用的资源数量。例如,您可以设置用户的CPU_PER_CALL,LOGICAL_READS_PER_CALLCOMPOSITE_LIMIT来限制Oracle杀死它之前单个语句可以执行的CPU数量,逻辑I/O数量或CPU和逻辑I/O的组合限制。

如果你想要更多的控制,你可以使用Oracle Resource Manager。这可以允许您执行任何操作,防止Oracle运行某些用户的查询(如果估计它们运行时间过长或者限制一组用户在争用这些资源时可以使用的资源)。 Oracle可以自动将特定用户的长时间运行的查询移动到较低优先级的组,它可以自动终止长时间运行的查询,它可以阻止它们首先运行,或者这些事情的任意组合。

+0

谢谢,这让我的思维开始思考不同。请问如何可能像蟾蜍和SQL开发人员的应用程序可以和用户像我一样可以。或者这是你已经提到的,我需要一个非常大的一段代码。 – Imran

+0

@Imran - 没有什么能够阻止你访问查询计划(尽管Toad和SQL Developer做的独立会话要容易得多)。您可以在'SQL_ID'上将'V $ SESSION'连接到'V $ SQL_PLAN',并在每个会话中查看当前正在执行的SQL语句的查询计划 - 如果您编写了计划作业,您将会这样做。只是需要编写逻辑来分析查询计划,并且人们想要在这个一般空间中解决的大多数问题都可以使用配置文件和/或资源管理器更好地解决。 –

+0

谢谢真的很感谢你的答案 – Imran