亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 淺談PL/SQL批處理語句:BULK COLLECT與FORALL對優化做出的貢獻

淺談PL/SQL批處理語句:BULK COLLECT與FORALL對優化做出的貢獻

熱門標簽:百度地圖標注素材 征服者火車站地圖標注 外呼線路外顯本地號碼 word地圖標注方向 美圖秀秀地圖標注 開封智能外呼系統廠家 人工智能地圖標注自己能做嗎 阿爾巴尼亞地圖標注app 征服眼公司地圖標注
我們知道PL/SQL程序中運行SQL語句是存在開銷的,因為SQL語句是要提交給SQL引擎處理
這種在PL/SQL引擎和SQL引擎之間的控制轉移叫做上下文卻換,每次卻換時,都有額外的開銷

請看下圖:

但是,FORALL和BULK COLLECT可以讓PL/SQL引擎把多個上下文卻換壓縮成一個,這使得在PL/SQL中的要處理多行記錄的SQL語句執行的花費時間驟降
請再看下圖:

下面詳解這爺倆

㈠ 通過BULK COLLECT 加速查詢

⑴ BULK COLLECT 的用法


采用BULK COLLECT可以將查詢結果一次性地加載到collections中,而不是通過cursor一條一條地處理
可以在select into ,fetch into , returning into語句使用BULK COLLECT
注意在使用BULK COLLECT時,所有的INTO變量都必須是collections

舉幾個簡單例子:

① 在select into語句中使用bulk collect

復制代碼 代碼如下:

DECLARE
TYPE sallist IS TABLE OF employees.salary%TYPE;
sals sallist;
BEGIN
SELECT salary BULK COLLECT INTO sals FROM employees where rownum=50;
--接下來使用集合中的數據
END;
/

② 在fetch into中使用bulk collect

復制代碼 代碼如下:

DECLARE
TYPE deptrectab IS TABLE OF departments%ROWTYPE;
dept_recs deptrectab;
CURSOR cur IS SELECT department_id,department_name FROM departments where department_id>10;
BEGIN
OPEN cur;
FETCH cur BULK COLLECT INTO dept_recs;
--接下來使用集合中的數據
END;
/

③ 在returning into中使用bulk collect

復制代碼 代碼如下:

CREATE TABLE emp AS SELECT * FROM employees;

DECLARE
TYPE numlist IS TABLE OF employees.employee_id%TYPE;
enums numlist;
TYPE namelist IS TABLE OF employees.last_name%TYPE;
names namelist;
BEGIN
DELETE emp WHERE department_id=30
RETURNING employee_id,last_name BULK COLLECT INTO enums,names;
DBMS_OUTPUT.PUT_LINE('deleted'||SQL%ROWCOUNT||'rows:');
FOR i IN enums.FIRST .. enums.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('employee#'||enums(i)||':'||names(i));
END LOOP;
END;
/

deleted6rows:
employee#114:Raphaely
employee#115:Khoo
employee#116:Baida
employee#117:Tobias
employee#118:Himuro
employee#119:Colmenares

EATE TABLE emp AS SELECT * FROM employees;DECLARE TYPE numlist IS TABLE OF employees.employee_id%TYPE; enums numlist; TYPE namelist IS TABLE OF employees.last_name%TYPE; names namelist;BEGIN DELETE emp WHERE department_id=30 RETURNING employee_id,last_name BULK COLLECT INTO enums,names; DBMS_OUTPUT.PUT_LINE('deleted'||SQL%ROWCOUNT||'rows:'); FOR i IN enums.FIRST .. enums.LAST LOOP DBMS_OUTPUT.PUT_LINE('employee#'||enums(i)||':'||names(i)); END LOOP;END;/deleted6rows:employee#114:Raphaelyemployee#115:Khooemployee#116:Baidaemployee#117:Tobiasemployee#118:Himuroemployee#119:Colmenares


⑵ BULK COLLECT 對大數據DELETE UPDATE的優化

這里舉DELETE就可以了,UPDATE同理

舉個案例:
需要在一個1億行的大表中,刪除1千萬行數據
需求是在對數據庫其他應用影響最小的情況下,以最快的速度完成

如果業務無法停止的話,可以參考下列思路:
根據ROWID分片、再利用Rowid排序、批量處理、回表刪除
在業務無法停止的時候,選擇這種方式,的確是最好的
一般可以控制在每一萬行以內提交一次,不會對回滾段造成太大壓力
我在做大DML時,通常選擇一兩千行一提交
選擇業務低峰時做,對應用也不至于有太大影響
代碼如下:

復制代碼 代碼如下:

DECLARE
--按rowid排序的cursor
--刪除條件是oo=xx,這個需根據實際情況來定
CURSOR mycursor IS SELECT rowid FROM t WHERE OO=XX ORDER BY rowid;
TYPE rowid_table_type IS TABLE OF rowid index by pls_integer;
v_rowid rowid_table_type;
BEGIN
OPEN mycursor;
LOOP
FETCH mycursor BULK COLLECT INTO v_rowid LIMIT 5000;--5000行提交一次
EXIT WHEN v_rowid.count=0;
FORALL i IN v_rowid.FIRST..v_rowid.LAST
DELETE t WHERE rowid=v_rowid(i);
COMMIT;
END LOOP;
CLOSE mycursor;
END;
/

⑶ 限制BULK COLLECT 提取的記錄數

語法:
FETCH cursor BULK COLLECT INTO ...[LIMIT rows];
其中,rows可以是常量,變量或者求值的結果是整數的表達式

假設你需要查詢并處理1W行數據,你可以用BULK COLLECT一次取出所有行,然后填充到一個非常大的集合中
可是,這種方法會消耗該會話的大量PGA,APP可能會因為PGA換頁而導致性能下降

這時,LIMIT子句就非常有用,它可以幫助我們控制程序用多大內存來處理數據

例子:

復制代碼 代碼如下:

DECLARE
CURSOR allrows_cur IS SELECT * FROM employees;
TYPE employee_aat IS TABLE OF allrows_cur%ROWTYPE INDEX BY BINARY_INTEGER;
v_emp employee_aat;
BEGIN
OPEN allrows_cur;
LOOP
FETCH allrows_cur BULK FETCH INTO v_emp LIMIT 100;

/*通過掃描集合對數據進行處理*/
FOR i IN 1 .. v_emp.count
LOOP
upgrade_employee_status(v_emp(i).employee_id);
END LOOP;

EXIT WHEN allrows_cur%NOTFOUND;
END LOOP;

CLOSE allrows_cur;
END;
/

⑷ 批量提取多列

需求:
提取transportation表中的油耗小于 20公里/RMB的交通具體的全部信息
代碼如下:

復制代碼 代碼如下:

DECLARE
--聲明集合類型
TYPE vehtab IS TABLE OF transportation%ROWTYPE;
--初始化一個這個類型的集合
gas_quzzlers vehtab;
BEGIN
SELECT * BULK COLLECT INTO gas_quzzlers FROM transportation WHERE mileage 20;
...

⑸ 對批量操作使用RETURNING子句

有了returning子句后,我們可以輕松地確定剛剛完成的DML操作的結果,無須再做額外的查詢工作
例子請見BULK COLLECT 的用法的第三小點


㈡ 通過FORALL 加速DML

FORALL告訴PL/SQL引擎要先把一個或多個集合的所有成員都綁定到SQL語句中,然后再把語句發送給SQL引擎

⑴ 語法

未完待續。。。

您可能感興趣的文章:
  • 開啟SQLSERVER數據庫緩存依賴優化網站性能
  • SQLServer 優化SQL語句 in 和not in的替代方案
  • SQL語句優化方法30例(推薦)
  • SQL Server數據庫的高性能優化經驗總結
  • MySQL 大數據量快速插入方法和語句優化分享
  • MySQL性能優化的一些技巧幫助你的數據庫
  • MySQL查詢優化:連接查詢排序limit(join、order by、limit語句)介紹
  • 淺談MySQL中優化sql語句查詢常用的30種方法
  • 如何優化SQL語句的心得淺談
  • SQL語句優化提高數據庫性能

標簽:泰安 海北 葫蘆島 孝感 酒泉 淮南 六安 宜春

巨人網絡通訊聲明:本文標題《淺談PL/SQL批處理語句:BULK COLLECT與FORALL對優化做出的貢獻》,本文關鍵詞  淺談,SQL,批處理,語句,BULK,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談PL/SQL批處理語句:BULK COLLECT與FORALL對優化做出的貢獻》相關的同類信息!
  • 本頁收集關于淺談PL/SQL批處理語句:BULK COLLECT與FORALL對優化做出的貢獻的相關信息資訊供網民參考!
  • 推薦文章
    成人免费一级毛片在线播放视频| 欧美a级大片| 久久国产一区二区| 国产成人精品综合在线| 成人免费观看的视频黄页| 青青久久精品| 精品视频在线观看视频免费视频| 99久久视频| 九九免费精品视频| 久久精品店| 夜夜操天天爽| 日本伦理片网站| 高清一级做a爱过程不卡视频| 天天做人人爱夜夜爽2020毛片| 亚洲第一页色| 成人影视在线观看| 成人影视在线播放| 免费的黄视频| 亚洲爆爽| 欧美另类videosbestsex高清 | 91麻豆精品国产片在线观看| 高清一级片| 国产a一级| 九九免费精品视频| 天天色成人| 国产网站免费观看| 夜夜操网| 一级女性全黄久久生活片| 国产伦精品一区三区视频| 日本在线不卡视频| 国产伦精品一区三区视频| 二级片在线观看| 国产一区二区精品尤物| 久久精品店| 日本在线不卡视频| 亚洲精品久久久中文字| 亚洲精品久久久中文字| 色综合久久天天综合绕观看| 青青青草影院 | 欧美激情在线精品video| 欧美日本免费| 欧美a免费| 免费国产在线视频| 91麻豆精品国产片在线观看| 国产极品精频在线观看| 国产视频一区在线| 国产极品白嫩美女在线观看看| 日韩专区一区| 黄色短视频网站| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产国语对白一级毛片| 欧美1区2区3区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 91麻豆国产| 精品毛片视频| 成人a级高清视频在线观看| 欧美另类videosbestsex高清| 久草免费在线色站| 午夜家庭影院| 青青久在线视频| 久草免费在线观看| 在线观看成人网| 日韩欧美一二三区| 国产综合91天堂亚洲国产| 亚洲天堂免费| 欧美激情影院| 91麻豆国产| 国产视频久久久久| 亚洲精品中文一区不卡| 天堂网中文字幕| 欧美1区| 美女免费毛片| 韩国毛片基地| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 尤物视频网站在线观看| 日本特黄特色aaa大片免费| 国产伦精品一区二区三区在线观看| 日本伦理黄色大片在线观看网站| 亚洲精品久久久中文字| 欧美激情中文字幕一区二区| 国产视频久久久久| 午夜久久网| 成人免费高清视频| 成人免费网站久久久| 午夜久久网| 国产激情一区二区三区| 四虎久久影院| 日本特黄一级| 久久精品欧美一区二区| 91麻豆精品国产综合久久久| 日韩专区第一页| 日本免费看视频| 国产网站免费观看| 99久久精品国产免费| 麻豆系列 在线视频| 国产视频久久久久| 亚欧乱色一区二区三区| 日本特黄一级| 国产一区二区精品久久| 国产国语在线播放视频| 久久精品人人做人人爽97| 国产成+人+综合+亚洲不卡| 精品久久久久久免费影院| 久草免费在线视频| 日韩av片免费播放| 亚洲精品中文字幕久久久久久| 毛片成人永久免费视频| 韩国三级视频网站| 欧美大片a一级毛片视频| 日韩中文字幕在线观看视频| 久草免费在线色站| 色综合久久天天综合绕观看| 毛片成人永久免费视频| 色综合久久天天综合| 韩国三级视频网站| 国产一区二区精品久久91| 日韩中文字幕在线亚洲一区 | 99久久网站| 欧美激情在线精品video| 国产成人欧美一区二区三区的| 黄色免费三级| 99久久精品国产麻豆| a级毛片免费全部播放| 久久精品大片| 日韩免费在线| 国产伦理精品| 亚洲精品久久玖玖玖玖| 精品在线视频播放| 高清一级做a爱过程不卡视频| 久久国产一久久高清| 一本高清在线| 欧美电影免费看大全| 韩国三级视频网站| 精品国产一级毛片| 久久成人亚洲| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩一级黄色片| 免费一级片在线| 国产91素人搭讪系列天堂| 99热精品在线| 二级片在线观看| 免费国产在线观看| 欧美大片a一级毛片视频| 日韩综合| 日韩在线观看视频黄| 国产网站免费视频| 欧美激情一区二区三区在线播放 | 欧美日本免费| 日日夜夜婷婷| 韩国三级视频在线观看| 国产网站在线| 日韩专区亚洲综合久久| 成人影视在线播放| 91麻豆精品国产自产在线观看一区| 国产不卡在线观看| 黄视频网站免费观看| 欧美国产日韩久久久| 免费一级生活片| 天天做日日爱| 免费国产一级特黄aa大片在线| 欧美日本二区| 午夜久久网| 麻豆午夜视频| 欧美一区二区三区在线观看| 国产网站免费| 亚洲精品中文一区不卡| 午夜激情视频在线观看 | 久久99欧美| 国产一区二区福利久久| 精品国产亚洲一区二区三区| 四虎影视久久久| 香蕉视频久久| 黄色免费网站在线| 精品久久久久久中文| 国产精品自拍在线观看| 色综合久久天天综合绕观看| 成人a大片在线观看| 欧美爱爱网| 四虎影视久久| 成人免费福利片在线观看| 国产麻豆精品hdvideoss| 国产一级生活片| 久久国产精品自线拍免费| 国产国语在线播放视频| 美国一区二区三区| 日韩免费在线视频| 国产成人啪精品| 一级毛片视频免费| 韩国三级视频网站| 日本在线www| 国产成人精品综合| 日本在线www| 国产伦久视频免费观看视频| 超级乱淫伦动漫| 精品国产亚洲一区二区三区| 黄视频网站在线看| 精品视频在线看| 亚欧视频在线| 免费一级生活片|