【发布时间】:2011-11-11 05:08:56
【问题描述】:
这个想法是当用户运行查询并且有一个坏的笛卡尔坐标,其成本高于某个阈值。然后 oracle 将其通过电子邮件发送给我和用户。我尝试了几件事,但它们在运行时不起作用。如果toad和sql developer可以看到执行计划。然后我相信那里有我刚刚找到的信息。或者我可能不得不采用另一种逻辑。
【问题讨论】:
标签: oracle11g sql-execution-plan cartesian-product
这个想法是当用户运行查询并且有一个坏的笛卡尔坐标,其成本高于某个阈值。然后 oracle 将其通过电子邮件发送给我和用户。我尝试了几件事,但它们在运行时不起作用。如果toad和sql developer可以看到执行计划。然后我相信那里有我刚刚找到的信息。或者我可能不得不采用另一种逻辑。
【问题讨论】:
标签: oracle11g sql-execution-plan cartesian-product
一般来说,这可能是不可能的。
理论上,如果您真的下定决心,您可以为系统中的每个表生成细粒度审计 (FGA) 触发器,这些触发器会针对每个 SELECT、INSERT、UPDATE 和 DELETE 触发,从V$SESSION 获取SQL_ID,加入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 可以自动将长时间运行的查询从特定用户移动到较低优先级的组,它可以自动终止长时间运行的查询,它可以首先阻止它们运行,或者这些事情的任何组合。
【讨论】:
SQL_ID 上将V$SESSION 加入V$SQL_PLAN,并查看每个会话中当前正在执行的SQL 语句的查询计划——如果您编写了一个预定的作业,您会这样做。只是您需要编写逻辑来分析查询计划,并且人们希望在这个通用空间中解决的大多数问题都可以使用配置文件和/或资源管理器更好地解决。