儲存過程優化

2022-08-18 08:03:13 字數 2669 閱讀 4584

--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...