如何防止Oracle使用缓存的查询计划?

时间:2017-09-15 13:46:20

标签: oracle query-performance

我在Linux上使用Oracle Database 11g企业版11.2.0.3.0版 - 64位生产版。我有一个简单的查询连接4个表。通常,在将几行测试数据插入表中并且它在< 。1秒。如果我然后在其中的两个表中插入50,000行,则查询将采用>跑10分钟。如果我以任何方式更改查询,它将在十分之几秒内运行。

似乎缓存了查询执行计划,并且当4个表中的每个表中只有几行时,优化器正在使用它生成的计划。我尝试更新模式的统计信息(使用sql developer中的收集模式统计信息),但它并没有加快查询的慢速版本。我发现的唯一解决方案是运行

    ALTER SYSTEM FLUSH shared_pool;

然后,下次运行慢速查询时,它将在< 1秒。

每次插入一些数据时刷新shared_pool显然不是一个好主意。处理这种情况的正确方法是什么? Oracle 12中的自适应查询优化是否可以解决这类问题?

这是查询。当它运行缓慢时,即使只是将别名从abc更改为abcd(或其他任何内容)也足以使其运行速度提高约1000倍。

SELECT
  COUNT (*) cnt_
FROM 
(
    SELECT
     tg.name group_name ,
     tot.obj_type object_type ,
     tgol.test_access access_type,
     count (*) test_object_count
    FROM test_group tg
    , test_group_object_link tgol
    , test_object tobj
    , test_object_type tot
    WHERE tgol.test_group_id=tg.id
    AND tgol.test_object_id=tobj.id
    AND tobj.test_object_type_id=tot.id
    AND tg.isvalid='Y'
    AND tgol.isvalid='Y'
    AND tobj.isvalid='Y'
    AND tot.isvalid='Y'
    GROUP BY tg.name , tot.obj_type , tgol.test_access
    ORDER BY tg.name , tot.obj_type , tgol.test_access
)
abc

0 个答案:

没有答案