Oracle11g 触发器@执行计划。。笛卡尔积

Oracle11g 触发器@执行计划。。笛卡尔积,oracle11g,sql-execution-plan,cartesian-product,Oracle11g,Sql Execution Plan,Cartesian Product,这个想法是当用户运行一个查询,并且有一个成本高于某个阈值的坏笛卡尔函数时。然后oracle通过电子邮件将其发送给我和用户。我尝试了一些方法,但它们在运行时不起作用。如果toad和sql开发人员可以看到执行计划。然后我相信那里有信息,我只是找到了它。或者我可能不得不采用另一种逻辑。一般来说,这可能是不可能的 理论上,如果你真的下定决心了,你可以为系统中的每个表生成细粒度审计(FGA)触发器,这些表为每个SELECT,INSERT,UPDATE,和DELETE,从V$SESSION获取SQL\ID,

这个想法是当用户运行一个查询,并且有一个成本高于某个阈值的坏笛卡尔函数时。然后oracle通过电子邮件将其发送给我和用户。我尝试了一些方法,但它们在运行时不起作用。如果toad和sql开发人员可以看到执行计划。然后我相信那里有信息,我只是找到了它。或者我可能不得不采用另一种逻辑。

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

理论上,如果你真的下定决心了,你可以为系统中的每个表生成细粒度审计(FGA)触发器,这些表为每个
SELECT
INSERT
UPDATE
,和
DELETE
,从
V$SESSION
获取
SQL\ID
,加入
V$SQL\u计划
,并实现您想要的任何逻辑。这在技术上是可能的,但它将涉及相当多的代码,并且可能会给系统中的每个查询增加相当大的开销。这可能是不实际的

不必尝试使用触发器,您可以编写一个过程,该过程计划通过或包每隔几分钟运行一次,该程序将查询所有活动会话的
V$SESSION
,加入到
V$SQL\u PLAN
,并实现您想要的任何逻辑。这消除了每次用户执行任何语句时尝试运行触发器的开销。但它仍然需要相当数量的代码

与编写任何代码相比,根据您试图解决的业务问题,创建允许Oracle强制限制任何单个SQL语句可以消耗的资源量可能更容易。例如,您可以设置用户的
CPU\u PER\u CALL
LOGICAL\u READS\u PER\u CALL
、或
COMPOSITE\u LIMIT
,以限制单个语句在Oracle终止之前可以执行的CPU量、逻辑I/O量或CPU和逻辑I/O的复合限制


如果你想要更多的控制,你可以使用。这可以让您做任何事情,从防止Oracle运行来自某些用户的查询(如果估计这些用户的查询运行时间太长)到限制一组用户在这些资源上发生争用时可以使用的资源。Oracle可以自动将长时间运行的查询从特定用户移动到优先级较低的组,它可以自动终止长时间运行的查询,它可以首先阻止它们运行,或者阻止它们的任何组合。

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

理论上,如果你真的下定决心了,你可以为系统中的每个表生成细粒度审计(FGA)触发器,这些表为每个
SELECT
INSERT
UPDATE
,和
DELETE
,从
V$SESSION
获取
SQL\ID
,加入
V$SQL\u计划
,并实现您想要的任何逻辑。这在技术上是可能的,但它将涉及相当多的代码,并且可能会给系统中的每个查询增加相当大的开销。这可能是不实际的

不必尝试使用触发器,您可以编写一个过程,该过程计划通过或包每隔几分钟运行一次,该程序将查询所有活动会话的
V$SESSION
,加入到
V$SQL\u PLAN
,并实现您想要的任何逻辑。这消除了每次用户执行任何语句时尝试运行触发器的开销。但它仍然需要相当数量的代码

与编写任何代码相比,根据您试图解决的业务问题,创建允许Oracle强制限制任何单个SQL语句可以消耗的资源量可能更容易。例如,您可以设置用户的
CPU\u PER\u CALL
LOGICAL\u READS\u PER\u CALL
、或
COMPOSITE\u LIMIT
,以限制单个语句在Oracle终止之前可以执行的CPU量、逻辑I/O量或CPU和逻辑I/O的复合限制


如果你想要更多的控制,你可以使用。这可以让您做任何事情,从防止Oracle运行来自某些用户的查询(如果估计这些用户的查询运行时间太长)到限制一组用户在这些资源上发生争用时可以使用的资源。Oracle可以自动将长时间运行的查询从特定用户移动到优先级较低的组,它可以自动终止长时间运行的查询,它可以从一开始就阻止它们运行,或者阻止它们的任何组合。

谢谢,这让我有了不同的想法。我想问一下,像Toad和sql developer这样的应用程序和像我这样的用户是如何做到的。或者这是您已经提到的,我需要一段非常大的代码。@Imran-没有任何东西可以阻止您访问查询计划(尽管它比单独的会话容易得多,而Toad和SQL Developer就是这样做的)。您可以在
SQL\u ID
上将
V$SESSION
加入到
V$SQL\u计划
中,并查看每个会话中当前正在执行的SQL语句的查询计划——如果您编写了一个计划作业,则会这样做。只是您需要编写逻辑来分析查询计划,并且人们希望在这个通用空间中解决的大多数问题都可以通过配置文件和/或资源管理器得到更好的解决。谢谢您的回答。谢谢这让我有了不同的想法。我想问一下,像Toad和sql developer这样的应用程序和像我这样的用户是如何做到的。或者这是您已经提到的,我需要一段非常大的代码。@Imran-没有任何东西可以阻止您访问查询计划(尽管它比单独的会话容易得多,而Toad和SQL Developer就是这样做的)。您可以在
SQL\u ID
上加入
V$SESSION
V$SQL\u计划
,并查看当前执行的查询计划