oracle分区、oracle索引、oracle服务器集群解决、范围分区range、hash分区、List分区、组合分区
分区
概念-背景:
由于表中数据量越来越大,导致查询速度越来越慢。为了缓解查询压力,出现表分区的解决方案。
select * from tablaA where name = ‘andy’
为了提高查询效率的解决方案:
解决方案1: 加入索引index
解决方案1: 加入索引index (二分法)
1024 n 1024 遍历法
1024 log2n+1 11 二分法
解决方案2: 分区:
解决方案2: 分区:(解决了单人次的查询效率问题,无法本质上解决高并发问题)
石家庄市 --> 表空间a --> 物理文件a上。 百万以下。几十万。
邯郸市 -->表空间b --> 物理文件b上。
解决方案3: 服务器集群解决。
解决方案3: 服务器集群解决。
多台服务器同步数据,应对高并发的应用场景。
分区的分类:
分区的分类:
范围分区range
范围分区range: 连续的
– 按行分区 10万行一个区
– 按时间分区 一个月的数据一个区
CREATE TABLE part_table
(
ORDER_ID NUMBER(7) NOT NULL,
ORDER_DATE DATE,
OTAL_AMOUNT NUMBER,
CUSTOTMER_ID NUMBER(7),
PAID CHAR(1)
)
PARTITION BY RANGE (ORDER_DATE) --根据时间分区
(
PARTITION p_2017 VALUES LESS THAN (TO_DATE('2017-12-31', 'yyyy-mm-dd')) ,
PARTITION p_2018 VALUES LESS THAN (TO_DATE('2018-12-31', 'yyyy-mm-dd')) ,
PARTITION p_2019 VALUES LESS THAN (TO_DATE('2019-12-31', 'yyyy-mm-dd')) ,
partition p_other values less than (maxvalue)
);
hash分区
hash分区:
– 按照数据的hash值来分区 特点:比列表分区和范围分区更均匀。通过hash算法实现的。
create table part_table
(
transaction_id number primary key,
item_id number(8) not null
)
partition by hash(transaction_id)
(
partition part_01 ,
partition part_02 ,
partition part_03
);
– 由于是hash分区,无法根据用户提供的id,直接判断分区名。如何解决?
解决方案: 根据提供的id,进入各个区进行搜索,如果大于零,即可锁定分区位置。
函数案例实现:
FUNCTION GetPartition(P_A IN VARCHAR2) RETURN varchar2 IS
i number;
BEGIN
select count(1) into i from T partition(part_1) where A=P_A and rownum=1;
if i>0 then
return 'part_1';
end if;
select count(1) into i from T partition(part_2) where A=P_A and rownum=1;
if i>0 then
return 'part_2';
end if;
select count(1) into i from T partition(part_3) where A=P_A and rownum=1;
if i>0 then
return 'part_3';
end if;
return null;
END;
List分区 离散的
3、List分区 离散的
– 按找省份名分区
– 按照班级名分区
create table banji
(
bjid varchar2(15) not null,
bjname varchar2(20)
)
partition by list (bjname)
(
partition y2_t01 values ('一班'),
partition y2_t02 values ('二班') ,
partition y2_t03 values ('三班'),
partition p_other values (default)
);
组合分区
组合分区
– RANGE-RANGE
– LIST-RANGE
– LIST-HASH
– LIST-LIST
–range+list
CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE, --销售时间
SALES_COST NUMBER(10),
STATUS VARCHAR2(20) --状态
)
PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS) --时间分区后,再根据状态子分区
(
PARTITION P_2017 VALUES LESS THAN(TO_DATE('2017-12-31', 'yyyy-mm-dd'))
(
SUBPARTITION P2017SUB1 VALUES ('ACTIVE') ,
SUBPARTITION P2017SUB2 VALUES ('INACTIVE')
),
PARTITION P_2018 VALUES LESS THAN (TO_DATE('2018-12-31', 'yyyy-mm-dd'))
(
SUBPARTITION P2018SUB1 VALUES ('ACTIVE') ,
SUBPARTITION P2018SUB2 VALUES ('INACTIVE')
)
);
查询分区信息
-
查询分区信息
分区表:user_tab_partitions
查询表名以及分区名:
select table_name,partition_name from user_tab_partitions; -
在分区中查询数据:
select 字段 表名 分区名
select * from banji2 partition (y2_t01)
参考链接:https://www.cnblogs.com/andy6/p/6238512.htmlails/90270940