Oracle之分割槽表和普通表的查詢執行計畫對比

2021-08-10 09:16:10 字數 2699 閱讀 7765

總結:通過執行計畫檢視,分割槽表查詢效率明顯優於普通表。

--範圍分割槽示例

drop table range_part_tab purge;

--注意,此分割槽為範圍分割槽

create table range_part_tab (id number,deal_date date,area_code number,contents varchar2(4000))

partition by range (deal_date)

(partition p1 values less than (to_date('2017-02-01', 'yyyy-mm-dd')),

partition p2 values less than (to_date('2017-03-01', 'yyyy-mm-dd')),

partition p3 values less than (to_date('2017-04-01', 'yyyy-mm-dd')),

partition p4 values less than (to_date('2017-05-01', 'yyyy-mm-dd')),

partition p5 values less than (to_date('2017-06-01', 'yyyy-mm-dd')),

partition p6 values less than (to_date('2017-07-01', 'yyyy-mm-dd')),

partition p7 values less than (to_date('2017-08-01', 'yyyy-mm-dd')),

partition p8 values less than (to_date('2017-09-01', 'yyyy-mm-dd')),

partition p9 values less than (to_date('2017-10-01', 'yyyy-mm-dd')),

partition p10 values less than (to_date('2017-11-01', 'yyyy-mm-dd')),

partition p11 values less than (to_date('2017-12-01', 'yyyy-mm-dd')),

partition p12 values less than (to_date('2018-01-01', 'yyyy-mm-dd')),

partition p_max values less than (maxvalue));

--以下是插入2023年一整年日期隨機數和表示福建地區號含義(591到599)的隨機數記錄,共有10萬條,如下:

insert into range_part_tab (id,deal_date,area_code,contents)

select rownum,

to_date( to_char(sysdate-365,'j')+trunc(dbms_random.value(0,365)),'j'),

ceil(dbms_random.value(590,599)),

rpad('*',400,'*')

from dual

connect by rownum <= 100000;

commit;

--分割槽原理分析之普通表插入

drop table norm_tab purge;

create table norm_tab (id number,deal_date date,area_code number,contents varchar2(4000));

insert into norm_tab(id,deal_date,area_code,contents)

select rownum,

to_date( to_char(sysdate-365,'j')+trunc(dbms_random.value(0,365)),'j'),

ceil(dbms_random.value(590,599)),

rpad('*',400,'*')

from dual

connect by rownum <= 100000;

commit;

--分割槽清除的方便例子

delete from norm_tab where deal_date>=to_date('2012-09-01', 'yyyy-mm-dd')  and deal_date <= to_date('2012-09-30', 'yyyy-mm-dd');

--為了後續章節試驗的方便,本處暫且將刪除的記錄回退。

rollback;

select * from range_part_tab partition(p9);

alter table range_part_tab truncate partition p9;

set linesize 1000

set autotrace on 

select count(*) from norm_tab where deal_date>=to_date('2017-09-01', 'yyyy-mm-dd')  and deal_date <= to_date('2017-09-30', 'yyyy-mm-dd');

select count(*) from range_part_tab where deal_date>=to_date('2017-09-01', 'yyyy-mm-dd')  and deal_date <= to_date('2017-10-30', 'yyyy-mm-dd');

oracle將普通表改為分割槽表

oracle的普通表沒有辦法通過修改屬性的方式直接轉化為分割槽表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,並說明它們各自的特點。方法一 利用原表重建分割槽表。步驟 sql create table t id number primary key,time date 表已建立。sql...

Postgresql之分割槽表

參考 建立步驟 注意 以下針對10.0版本之前的用法,新版本見 1 建立主表。不用為該錶定義任何檢查限制,除非需要將該限制應用到所有的分割槽表中。同樣也無需為該錶建立任何索引和唯一限制。create table almart date key date,hour key smallint,clien...

普通表變為分割槽表

將已存在資料的普通表轉變為分割槽表,沒有辦法通過修改屬性的方式直接轉化為分割槽表,必須通過重建的方式進行轉變,一般可以有三種方法,視不同場景使用 用例 方法一 利用原表重建分割槽表。create table t id number primary key,time date insert into ...