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')
   )
  );

查询分区信息

  1. 查询分区信息
    分区表:user_tab_partitions
    查询表名以及分区名:
    select table_name,partition_name from user_tab_partitions;

  2. 在分区中查询数据:
    select 字段 表名 分区名
    select * from banji2 partition (y2_t01)

参考链接:https://www.cnblogs.com/andy6/p/6238512.htmlails/90270940

发布了43 篇原创文章 · 获赞 61 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43583693/article/details/90289763
今日推荐