使用本地索引提速5倍+

记录:NO.252

场景

在Oracle数据库一张数据表T_SENSOR_DATA,每日增加1000万条数据。使用日期字段GATHER_DATE建立分区表。

全局索引

初期,由于业务使用频繁,为了提高查询速度,在T_SENSOR_DATA建立一个联合索引和一个联合主键,均使用了全局索引。全局索引建表语句如下:

create table T_SENSOR_DATA_GLOBAL
(
  id            NUMBER(12) not null,
  gather_date   DATE not null,
  position_dir  NUMBER(2) not null,
  gather_time   DATE,
  t1        NUMBER(12,2),
  t2        NUMBER(12,2),
  t3        NUMBER(12,2),
  t4        NUMBER(12,2),
  t5        NUMBER(12,2),
  t6        NUMBER(12,2)
)
partition by range (GATHER_DATE)
(
  partition T20210701 values less than 
   (TO_DATE(' 2021-07-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace SENSOR_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 8M
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition T20210702 values less than 
   (TO_DATE(' 2021-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace SENSOR_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 8M
      next 1M
      minextents 1
      maxextents unlimited
    )
  );
create index IDX_T_SENSOR_DATA_GLOBAL_ID on T_SENSOR_DATA_GLOBAL (ID,GATHER_DATE, T1);
alter table T_SENSOR_DATA_GLOBAL
  add constraint PK_T_SENSOR_DATA_GLOBAL primary key (ID,GATHER_DATE, POSITION_DIR);

本地索引

数据表T_SENSOR_DATA在连续运行一周后,表内存储7个分区数据共计7000万+。每天插入1000万数据耗时15分钟以上不等。甚至在任务高峰期时,插入1000万数据超过120分钟。已经影响到下游任务开展。为此,经过验证,在T_SENSOR_DATA建立的联合索引和联合主键由全局索引变更为本地索引。插入1000万数据维持在3分钟内。持续运行2周均保持在3分钟内。本地索引建表语句如下:

create table T_SENSOR_DATA_LOCAL
(
  id            NUMBER(12) not null,
  gather_date   DATE not null,
  position_dir  NUMBER(2) not null,
  gather_time   DATE,
  t1        NUMBER(12,2),
  t2        NUMBER(12,2),
  t3        NUMBER(12,2),
  t4        NUMBER(12,2),
  t5        NUMBER(12,2),
  t6        NUMBER(12,2)
)
partition by range (GATHER_DATE)
(
  partition T20210701 values less than 
   (TO_DATE(' 2021-07-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace SENSOR_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 8M
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition T20210702 values less than 
   (TO_DATE(' 2021-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace SENSOR_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 8M
      next 1M
      minextents 1
      maxextents unlimited
    )
  );
create index IDX_T_SENSOR_DATA_LOCAL_ID on T_SENSOR_DATA_LOCAL (ID, GATHER_DATE, T1)
  local;
alter table T_SENSOR_DATA_LOCAL
  add constraint PK_T_SENSOR_DATA_LOCAL primary key (ID, GATHER_DATE, POSITION_DIR)
  using index 
  local;

常用SQL

本例中1000万级别数据全局索引和本地索引,插入速度相差5倍+。因此记录排查过程中使用过的SQL。

-- 查看表列字段信息
select usc.column_name from user_tab_columns usc where table_name='T_SENSOR_DATA_LOCAL';
-- 查看表注释信息
select * from user_tab_comments usc where table_name='T_SENSOR_DATA_LOCAL';
-- 查看表字段注释信息
select * from user_col_comments usc where table_name='T_SENSOR_DATA_LOCAL';
-- 查看表
select * from user_tables;
select * from all_tables  where owner='SENSOR_DEMO';
select * from dba_tables  where owner='SENSOR_DEMO';
-- 查看分区表分区信息
select * from dba_tab_partitions where table_name='T_SENSOR_DATA_LOCAL';
-- 查看分区表索引信息
select * from dba_ind_partitions where index_name='PK_T_SENSOR_DATA_LOCAL';
-- 查看表的索引信息
select * from dba_indexes where table_name='T_SENSOR_DATA_LOCAL';
-- 查看表空间大小分布
select * from dba_data_files where tablespace_name='SENSOR_DATA';
select * from dba_segments where segment_name='T_SENSOR_DATA_LOCAL';
select * from dba_free_space where tablespace_name='SENSOR_DATA';
-- 查看视图
select * from dba_views aa where  aa.view_name like 'DBA_%';
-- 查看分区表字段
select * from dba_part_key_columns where name='PK_T_SENSOR_DATA_LOCAL';
-- 查看索引使用的表字段
select * from dba_ind_columns where table_name='T_SENSOR_DATA_LOCAL';

以上,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值