问题描述
下午好,
我有一个客户,用很多表管理数百万个数据。问题是,到目前为止,我们有一个很大的表2013年,我们想把它分成两部分,一个在过去的三个月里,一个在其余的 (我们称之为历史)。如果客户想咨询最后三个月,这很容易和快速,但如果想咨询较旧的,我们已经创建了一个视图与历史和原始表的连接 (现在只有三个月的数据)。
我们正在测试性能和视图,在我们的测试实验室中,与使用基本表执行相同的sql进行比较,我们没有真正的好视图。我们预计性能会受到轻微影响,但影响太大了。
当sql进入视图时,有什么方法可以改善它?
我们有标准许可证,所以我们不能选择参加。
提前谢谢你。
我有一个客户,用很多表管理数百万个数据。问题是,到目前为止,我们有一个很大的表2013年,我们想把它分成两部分,一个在过去的三个月里,一个在其余的 (我们称之为历史)。如果客户想咨询最后三个月,这很容易和快速,但如果想咨询较旧的,我们已经创建了一个视图与历史和原始表的连接 (现在只有三个月的数据)。
我们正在测试性能和视图,在我们的测试实验室中,与使用基本表执行相同的sql进行比较,我们没有真正的好视图。我们预计性能会受到轻微影响,但影响太大了。
当sql进入视图时,有什么方法可以改善它?
我们有标准许可证,所以我们不能选择参加。
提前谢谢你。
专家解答
对于标准版,我会考虑使用 “分区视图”,这是分区的前身。设置和维护需要花费更多的精力,但是优化器足够聪明,可以避免不需要的表
您可以从过滤器行4和6中看到,然后我们实际上从未访问表T2和T3,因为它们可能不包含该object_id范围的行。
SQL> create table t1 as select * from dba_objects where object_id between 0 and 20000;
Table created.
SQL> create table t2 as select * from dba_objects where object_id between 20001 and 40000;
Table created.
SQL> create table t3 as select * from dba_objects where object_id between 40001 and 60000;
Table created.
SQL>
SQL> alter table t1 add constraint ck1 check (object_id between 0 and 20000);
Table altered.
SQL> alter table t2 add constraint ck2 check (object_id between 20001 and 40000);
Table altered.
SQL> alter table t3 add constraint ck3 check (object_id between 40001 and 60000);
Table altered.
SQL>
SQL> create or replace view t as
2 select * from t1
3 union all
4 select * from t2
5 union all
6 select * from t3
7 ;
View created.
SQL>
SQL> set autotrace traceonly explain
SQL> select * from t
2 where object_id < 30;
Execution Plan
----------------------------------------------------------
Plan hash value: 3867803903
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 28 | 7224 | 331 (1)| 00:00:01 |
| 1 | VIEW | T | 30 | 3668 | 101 (0)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
|* 3 | TABLE ACCESS FULL | T1 | 28 | 3388 | 101 (0)| 00:00:01 |
|* 4 | FILTER | | | | | |
|* 5 | TABLE ACCESS FULL| T2 | 1 | 140 | 115 (0)| 00:00:01 |
|* 6 | FILTER | | | | | |
|* 7 | TABLE ACCESS FULL| T3 | 1 | 140 | 117 (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("OBJECT_ID"<30)
4 - filter(NULL IS NOT NULL)
5 - filter("OBJECT_ID"<30)
6 - filter(NULL IS NOT NULL)
7 - filter("OBJECT_ID"<30)
您可以从过滤器行4和6中看到,然后我们实际上从未访问表T2和T3,因为它们可能不包含该object_id范围的行。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




