--im_cons_integral表為分割槽表按照org_no(單位編碼)分割槽---有效期歷史資料處理
begin
for cur in (select * from sgpm.o_org where org_type in ('04','05', '06')) loop
insert into a_temp_ly_log
select '有效期更新1', sysdate, '', cur.org_no, '', '' from dual; ---日誌表
update im_cons_integral a
set a.expire_date =
(period + 2) || '1231'
where a.release_date < '20190501'
and a.integral_type<>'09'
and org_no = cur.org_no; ---5月前改成兩年後的12月31日
update im_cons_integral a
set a.expire_date = to_char((add_months(to_date(release_date,
'yyyymmdd'),
36) - 1),
'yyyymmdd')
where a.release_date >= '20190501'
and a.integral_type<>'09'
and org_no = cur.org_no; ---5月後加365*3天
update a_temp_ly_log
set end_date = sysdate
where remark = cur.org_no
and job_name = '有效期更新1';
commit;
end loop;
end;
開發反應效率很低從早上到晚上,只更新了完成了幾個單位。
分析:然後兩個update語句,im_cons_integral表資料量很大,每個分割槽有幾百萬到幾千萬資料不等,共396個分割槽。
兩次update,im_cons_integral表掃瞄了兩次分割槽的資料。
我們可以用casen when改寫
update im_cons_integral a
set expire_date =
(case when a.release_date < '20190501' then (period + 2) || '1231' else
to_char((add_months(to_date(release_date, 'yyyymmdd'), 36) - 1),
'yyyymmdd'))
where a.integral_type <> '09'
and org_no = cur.org_no;
im_cons_integral表只需掃瞄一次。
最簡單效率的方法就是全表更新,但是資料量太大,擔心資料庫undo空間壓力大。
我們可以對sgpm.o_org表的org_no進行分組,平均分配到4個表中。
create table sgpm.o_org1 as
select * from(
select org_no,row_number()over(order by org_no) num from sgpm.o_org
where org_type in ('04','05', '06')
) where num<100;
sgpm.o_org2
sgpm.o_org3
sgpm.o_org4
分表按照sgpm.o_org1-4同時執行四個過程,並且調整會話的並行
alter session force parallel dml parallel 4;
alter session force parallel query parallel 4;
資料庫層面將undo調整為自動擴充套件且加入了乙個資料檔案,限制了5g大小,擔心undo有壓力。
begin
for cur in (select org_no from sgpm.o_org1) loop
insert into a_temp_ly_log
select '有效期更新1', sysdate, '', cur.org_no, '', '' from dual; ---日誌表
update im_cons_integral a
set expire_date =
(case when a.release_date < '20190501' then (period + 2) || '1231' else
to_char((add_months(to_date(release_date, 'yyyymmdd'), 36) - 1),
'yyyymmdd'))
where a.integral_type <> '09'
and org_no = cur.org_no;
update a_temp_ly_log
set end_date = sysdate
where remark = cur.org_no
and job_name = '有效期更新1';
commit;
end loop;
end;
/1小時內就完成了所有單位的執行。
使用SET NOCOUNT優化儲存過程
每次我們在使用查詢分析器除錯sql語句的時候,通常會看到一些資訊,提醒我們當前有多少個行受到了影響,這是些什麼資訊?在我們呼叫的時候這些資訊有用嗎?是否可以關閉呢?答案是這些資訊在我們的客戶端的應用程式中是沒有用的,這些資訊是儲存過程中的每個語句的done in proc 資訊。我們可以利用set ...
儲存過程編寫經驗優化
1 開發人員如果用到其他庫的table或view,務必在當前庫中建立view來實現跨庫操作,最好不要直接使用 databse.dbo.table name 因為sp depends不能顯示出該sp所使用的跨庫table或view,不方便校驗。2 開發人員在提交sp前,必須已經使用set showpl...
搞定計費儲存過程優化,
單位 秒 取樣數量 之前 之後 平均耗時 之前 之後 最長耗時 之前 之後 最短耗時 之前 之後 77 64 8.623 0.466 17.015 1.125 3.688 0.359 優化提高效率 倍數 18.50 15.12 10.27 效果相當顯著,標記乙個.這周上班時間的8小時全滿,算是用了3...