我遇到了一个简单的视图查询问题。具有union_all的视图本身是令人讨厌的,并且其大多数字段都是通过函数来评估的。问题在于,即使是非常简单的查询也可以获得评估的整个视图,然后才能永远进行评估。
为了简化我的问题,我已经进行了两次查询
select * from horrible_view where id in (1, 2, 3); -- this works super quick
select * from horrible_view where id in (select id from my_temp_table); -- this takes forever
select * from my_temp_table t left join horrible_view h on t.id=h.id -- this also takes forever
所以即使my_temp_table包含相同的1,2,3(只有一列的3行),第二个和第三个查询使优化器变为香蕉,因此可靠地评估可怕的视图然后只返回3行是返回。
我能做些什么吗? 第二个示例中的IE使优化器首先运行“从my_temp_table中选择id”然后查询。
Oracle的版本是11.2
更多信息:
首先,我只对Oracle有所了解。 (那么来自sqlDeveloper的Explain计划是你想要的吗?如果是这样你怎么打印它,它的巨大?)这里是截图:here
我已经创建了临时表以便进行测试。它实际上命名为TMP_R(它有10行)