我在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