每月将对数据库超大表进行数据裁剪,原理是通过 alter table <table_name> truncate partition (partition_name) update indexes 命令在truncate 分区的同时对索引进行更新。生产经验告诉我:“不加update indexes 会导致全局索引失效”。 裁剪任务每月凌晨自动执行,今天正好是裁剪任务执行完成,开发反馈:“裁剪任务期间订单失败率偏高”,根据开发提供的时间段查看执行日志,发现当时正是在裁剪:AATD_DTL(脱敏处理)表。
CREATE INDEX <index name> ON <column> REVERSE
CREATE INDEX <index name> ON <table name >(<column>) GLOBAL PARTITION BY HASH (<column>) PARTITIONS <part_num>
-- 分区索引重建
alter index <index name> rebuild partition <partition name> online tablespace <tablespace name>;
-- 索引重建
alter index <index name> rebuild online tablespace <tablespace name>;
create table t1
( id varchar2(50),
session_id varchar2(5), -- session id
create_date date) -- 创建日期
PARTITION BY RANGE(create_date)INTERVAL(numtoyminterval(1,'month'))
(PARTITION part202107 VALUES LESS THAN(TO_DATE('20210801','yyyymmdd')),
PARTITION part202108 VALUES LESS THAN(TO_DATE('20210901','yyyymmdd'))
);
-- 索引
alter table t1 add constraint pk_t1_id primary key (id)
using index tablespace two_ind_dat;
-- 序列
drop SEQUENCE t1_seq;
CREATE SEQUENCE t1_seq
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999
CACHE 2000;
create or replace procedure proc_insert(v_tab_name varchar2)
as
v_month number;
v_day number;
v_sid varchar2(10);
v_part_date varchar2(20);
v_seq varchar2(20) := v_tab_name||'_seq.NEXTVAL';
v_sql varchar2(500);
begin
select USERENV('SID') into v_sid from dual;
for x in 1..10 loop
v_month := mod(x,12);--月份
if v_month = 0 then
v_month:=12;
end if;
v_day :=mod(x,28); --日
if v_day = 0 then
v_day:=28;
end if;
v_part_date:='2024-'||to_char(v_month)||'-'||to_char(v_day);
v_sql:='insert into '||v_tab_name||' (id, session_id,CREATE_DATE) values('||v_seq||','''||v_sid||''' ,to_date('''||v_part_date ||''','||'''yyyy-mm-dd'''||'))';
-- dbms_output.put_line(v_sql);
execute immediate v_sql;
commit;
end loop;
end;
declare
v_job pls_integer;
begin
for i in 1 .. 200 loop
dbms_job.submit(v_job,
what => 'BEGIN proc_insert(''t1''); END;',
next_date => sysdate,
Interval => 'sysdate+ 1/(24 * 60 * 60)');
commit;
end loop;
end;
/
declare
CURSOR c1
IS
select job from user_jobs where schema_user='TWO';
BEGIN
for v_c in c1
loop
dbms_job.remove(v_c.job);
-- dbms_output.put_line('drop job:'||v_c.job|| 'succeed');
end loop;
END;
/
col event for a45
SELECT inst_id,EVENT, SUM(DECODE(WAIT_TIME, 0, 0, 1)) "Prev", SUM(DECODE(WAIT_TIME, 0, 1, 0)) "Curr", COUNT(*) "Tot" , sum(SECONDS_IN_WAIT) SECONDS_IN_WAIT
FROM GV$SESSION_WAIT
WHERE event NOT
IN ('smon timer','pmon timer','rdbms ipc message','SQL*Net message from client','gcs remote message')
AND event NOT LIKE '%idle%'
AND event NOT LIKE '%Idle%'
AND event NOT LIKE '%Streams AQ%'
GROUP BY inst_id,EVENT
ORDER BY 1,5 desc;
SQL> select session_id,count(*) from t1 group by session_id;
SESSI COUNT(*)
----- ----------
1423 1050
1481 1170
972 10
1350 570
849 1210
967 1090
528 1040
......略
create table t3
( id varchar2(50),session_id varchar2(5),create_date date)
PARTITION BY RANGE(create_date)INTERVAL(numtoyminterval(1,'month'))
(PARTITION part202107 VALUES LESS THAN(TO_DATE('20210801','yyyymmdd')),
PARTITION part202108 VALUES LESS THAN(TO_DATE('20210901','yyyymmdd'))
);
-- 索引
alter table t3 add constraint un_t3_hash_id unique (id)
using index (CREATE UNIQUE INDEX pk_t3_hash_id ON t3(ID)
TABLESPACE two_ind_dat GLOBAL PARTITION BY HASH(ID)PARTITIONS 64 );
-- 序列
drop SEQUENCE t3_seq;
CREATE SEQUENCE t3_seq
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999
CACHE 2000;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。