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

Oracle 最大功能的替代方案以提高性能

askTom 2018-09-10
200

问题描述

嗨,汤姆,

我有一个视图,它有date_p,date_p_c。现在我有一个ssas多维数据集,它有很多基于日期的分区。我需要根据最新日期获取数据。


每月分区将数据从年初带到上个月。
每日分区将数据从月初带到前一天。
每小时分区带来该特定小时的数据。

现在monthhly分区的查询就像-

SELECT * FROM loc_view
WHERE  greatest(DATE,DATE_P_C) between TRUNC(SYSDATE, 'MONTH') and (TRUNC(SYSDATE, 'DD'))- INTERVAL '1' SECOND;
复制


所以当我使用上面的查询时,cube的运行时间/处理时间在增加。

对于最大的功能,还有其他选择吗?我已经尝试过了,但它也没有帮助。

谢谢

专家解答

最大的功能意味着您的查询将无法使用分区修剪。或日期或date_p_c上的常规索引。所以你总是扫描每个分区。而且,正如您所注意到的,查询需要越来越长的时间:

create table t (
  c1 int,
  c2 int
) partition by range ( c1 ) 
  interval ( 1 ) (
  partition p0 values less than ( 2 )
);

create index i1 on t ( c1 );
create index i2 on t ( c2 );

insert into t 
  with rws as (
    select level x , level + 1
    from   dual
    connect by level <= 10
  )
    select * from rws;
    
commit;
    
select * from t
where  greatest ( c1, c2 ) = 2;

C1   C2   
   1    2

select * 
from   table(dbms_xplan.display_cursor(null, null, 'BASIC LAST +PARTITION'));

PLAN_TABLE_OUTPUT                                      
EXPLAINED SQL STATEMENT:                               
------------------------                               
select * from t where  greatest ( c1, c2 ) = 2         
                                                       
Plan hash value: 4094519774                            
                                                       
----------------------------------------------------   
| Id  | Operation           | Name | Pstart| Pstop |   
----------------------------------------------------   
|   0 | SELECT STATEMENT    |      |       |       |   
|   1 |  PARTITION RANGE ALL|      |     1 |1048575|   
|   2 |   TABLE ACCESS FULL | T    |     1 |1048575|   
----------------------------------------------------
复制


一种解决方法是在greatest (c1,c2) 上创建基于函数的索引。这允许优化器使用这个索引:

create index i on t ( greatest ( c1, c2 ) );

select * from t
where  greatest ( c1, c2 ) = 2;

C1   C2   
   1    2 

select * 
from   table(dbms_xplan.display_cursor(null, null, 'BASIC LAST +PARTITION'));

PLAN_TABLE_OUTPUT                                                             
EXPLAINED SQL STATEMENT:                                                      
------------------------                                                      
select * from t where  greatest ( c1, c2 ) = 2                                
                                                                              
Plan hash value: 4075433511                                                   
                                                                              
---------------------------------------------------------------------------   
| Id  | Operation                                  | Name | Pstart| Pstop |   
---------------------------------------------------------------------------   
|   0 | SELECT STATEMENT                           |      |       |       |   
|   1 |  TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| T    | ROWID | ROWID |   
|   2 |   INDEX RANGE SCAN                         | I    |       |       |   
--------------------------------------------------------------------------- 
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论