Oracle使用hash分區(qū)優(yōu)化分析函數(shù)查詢
在ORACLE中的分析函數(shù)都是基于某幾個字段劃分計算窗口,然后在窗口內(nèi)進(jìn)行聚合,排名,等等計算。我想如果我們數(shù)據(jù)表的hash分區(qū)字段與分析函數(shù)中的partition by 字段一致的時候,應(yīng)該可以大大加快分析函數(shù)的運行效率。因為每個分區(qū)上的數(shù)據(jù)可以單獨進(jìn)行運算?;ゲ桓缮?,下面試驗來驗證我的想法.
***步:創(chuàng)建一個分區(qū)表和普通表,表結(jié)構(gòu)與DBA_OBJECTS一致:
create table t_partition_hash(
object_name varchar2(128),
subobject_name varchar2(30),
object_id number,
data_object_id number,
object_type varchar2(19),
created date,
last_ddl_time date,
timestamp varchar2(19),
status varchar2(7),
temporary varchar2(1),
generated varchar2(1),
secondary varchar2(1)
)
partition by hash(object_type)(
partition t_hash_p1 tablespace USERS,
partition t_hash_p2 tablespace USERS,
partition t_hash_p3 tablespace USERS,
partition t_hash_p4 tablespace USERS,
partition t_hash_p5 tablespace USERS,
partition t_hash_p6 tablespace USERS,
partition t_hash_p7 tablespace USERS,
partition t_hash_p8 tablespace USERS
);create table t_big_hash(
object_name varchar2(128),
subobject_name varchar2(30),
object_id number,
data_object_id number,
object_type varchar2(19),
created date,
last_ddl_time date,
timestamp varchar2(19),
status varchar2(7),
temporary varchar2(1),
generated varchar2(1),
secondary varchar2(1)
);
第二步:準(zhǔn)備數(shù)據(jù),從dba_object中把數(shù)據(jù)插入到兩個表??偣膊迦霐?shù)據(jù)1610880。
insert into t_partition_hash select * from dba_objects; |
第三步:本采用RANK函數(shù)對兩個表進(jìn)行查詢。
begin |
使用hash分區(qū)表總共執(zhí)行5次的運行時間分別為:46.156s,33.39s,40.516s 34.875s 38.938s.
begin |
由此可見采用有效的HASH分區(qū)表可以有效提升分析函數(shù)在oracle中的執(zhí)行效率。我相信隨著數(shù)據(jù)量的增加,將會有更明顯的效果,回頭再測試一個項目中遇到的類似問題。
【編輯推薦】