暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 一个视图在多个表上的性能 (历史加当前)

ASKTOM 2019-08-14
258

问题描述

下午好,

我有一个客户,用很多表管理数百万个数据。问题是,到目前为止,我们有一个很大的表2013年,我们想把它分成两部分,一个在过去的三个月里,一个在其余的 (我们称之为历史)。如果客户想咨询最后三个月,这很容易和快速,但如果想咨询较旧的,我们已经创建了一个视图与历史和原始表的连接 (现在只有三个月的数据)。
我们正在测试性能和视图,在我们的测试实验室中,与使用基本表执行相同的sql进行比较,我们没有真正的好视图。我们预计性能会受到轻微影响,但影响太大了。

当sql进入视图时,有什么方法可以改善它?
我们有标准许可证,所以我们不能选择参加。

提前谢谢你。


专家解答

对于标准版,我会考虑使用 “分区视图”,这是分区的前身。设置和维护需要花费更多的精力,但是优化器足够聪明,可以避免不需要的表

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论