我创建了一个由8个表组合而成的视图,产生了大约400万条记录。所有涉及的表都有索引。但是,选择查询需要很长时间才能执行。有什么办法可以改善表现吗?
查看定义:
Create view view1(a,b,c,d) AS
select a,b,c,d from
table1
UNION ALL
select a,b,c,d from
table2
UNION ALL
select a,b,c,d from
table3
UNION ALL
select a,b,c,d from
table4
UNION ALL
select a,b,c,d from
table5....
--so on till table8;
选择查询:
select a,b,c,d
from view1
where a=1 and b=-1
order by c;
索引详情:
所有表格上a
,b
和c
的索引。
答案 0 :(得分:0)
如果您拥有正确的索引,可能是您有过时的统计信息;如果是,请使用DBMS_STATS包函数进行更新:
exec dbms_stats.gather_table_stats(your_schema, 'table1', estimate_percent=>100, cascade=>true, method_opt=>'FOR ALL COLUMNS SIZE AUTO');
使用此命令,Oracle也会自动收集直方图,这对于数据分布不均很有用。
可能是Optimizer更喜欢全表扫描。 列a和b的选择性是什么?如果要选择的行太多(或者甚至更好,要扫描的块太多),则索引无效。
答案 1 :(得分:0)
有关视图表现的一些问题将在下面的链接中讨论
http://www.dba-oracle.com/art_hints_views.htm
获得解释计划将阐明实际发生的事情。
您还应该在没有视图的情况下比较查询的执行时间,以检查是否存在使用视图的额外开销
查询就像
从((从表1中选择a,b,c,d,其中a = 1且b = -1)中选择a,b,c,d UNION ALL(从table2中选择a,b,c,d,其中a = 1和b = -1)...)按c;
排序请检查两种情况下解释计划中是否使用了索引。
由于可能未使用哪个索引,有很多原因,如类型转换或缺少统计信息