婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談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對優化做出的貢獻的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品这里都是精品| 欧美高清视频一二三区| 一区二区在线免费| 26uuu亚洲| 亚洲精品国产精品乱码不99| 国产片一区二区| 色成人在线视频| 91精品免费观看| 国产亚洲视频系列| 亚洲精品欧美综合四区| 亚洲午夜三级在线| 黄页视频在线91| 91亚洲国产成人精品一区二三 | 一本久久a久久精品亚洲 | 国产欧美精品一区二区色综合| 亚洲欧洲国产专区| 国产在线精品免费| 一本一道综合狠狠老| 91精品欧美久久久久久动漫| 中文字幕一区免费在线观看| 污片在线观看一区二区| 国产白丝网站精品污在线入口| 久久精品国产久精国产爱| 91视频一区二区三区| 在线不卡中文字幕播放| 国产精品视频一区二区三区不卡| 亚洲444eee在线观看| 国产91富婆露脸刺激对白| 亚洲va在线va天堂| 午夜精品影院在线观看| 国产亚洲欧美日韩日本| 中文字幕免费一区| 免费在线看成人av| 欧美日韩免费高清一区色橹橹| 精品粉嫩超白一线天av| 亚洲人午夜精品天堂一二香蕉| 国内精品在线播放| 日韩精品中文字幕一区| 天堂成人免费av电影一区| 日本韩国精品在线| 精品视频1区2区3区| av激情成人网| 欧美一三区三区四区免费在线看| 一区二区三区.www| 蜜臂av日日欢夜夜爽一区| 欧美日韩高清影院| 亚洲福中文字幕伊人影院| 波多野结衣精品在线| 中文字幕在线不卡一区二区三区 | 欧美在线视频不卡| 欧美三级电影在线看| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 中文字幕一区二区三区视频| av在线不卡免费看| 亚洲精品自拍动漫在线| 色妞www精品视频| 亚洲在线观看免费| 制服丝袜国产精品| 成人av在线一区二区| 国产精品久久久久国产精品日日 | 欧美精品一二三区| 一区二区三区精品视频在线| 日本vs亚洲vs韩国一区三区二区 | 欧美中文字幕亚洲一区二区va在线 | 欧美丝袜第三区| 亚洲福利视频三区| 日韩欧美国产一区二区在线播放| 欧美在线观看禁18| 91香蕉视频在线| 久久蜜桃av一区二区天堂| 国产一区二区三区不卡在线观看| 色婷婷激情久久| 婷婷激情综合网| 欧美一级淫片007| 亚洲狠狠爱一区二区三区| 成人久久视频在线观看| 久久精品亚洲精品国产欧美| 夜色激情一区二区| 日韩亚洲欧美中文三级| 高清国产一区二区| 在线电影一区二区三区| 日本韩国欧美一区二区三区| 亚洲二区在线视频| 亚洲精品videosex极品| 欧美tickling网站挠脚心| 精东粉嫩av免费一区二区三区| 中文字幕乱码一区二区免费| 一本久久a久久精品亚洲| 激情久久久久久久久久久久久久久久| 1000部国产精品成人观看| 欧美男女性生活在线直播观看| 国产精品网站在线观看| 欧美三级视频在线播放| 免费精品视频在线| 亚洲精品国产精华液| 欧美激情一区二区三区蜜桃视频| 91福利区一区二区三区| 国产精品资源站在线| 五月激情综合色| 又紧又大又爽精品一区二区| 国产免费久久精品| 在线观看成人小视频| 国产91在线观看丝袜| 国产精品自在在线| 中文字幕精品—区二区四季| 国产日韩精品一区二区三区在线| 国精产品一区一区三区mba视频| 亚洲一区二区三区爽爽爽爽爽| 日韩国产精品久久| 午夜伦理一区二区| 国产成人免费视频精品含羞草妖精| 奇米888四色在线精品| 日韩一区二区三区四区五区六区| 久久99久久99| 精品欧美黑人一区二区三区| 666欧美在线视频| 日韩精品三区四区| 美女网站色91| 亚洲一二三专区| 欧美日韩www| 国产一区二区按摩在线观看| 亚洲精品欧美专区| 亚洲r级在线视频| 日本三级亚洲精品| 国产午夜精品在线观看| 久久99这里只有精品| 欧洲av在线精品| 日韩激情视频在线观看| 欧美日韩在线播放一区| 日韩欧美国产一区二区在线播放 | 国产成人精品午夜视频免费| 欧美视频一区二区三区四区| 午夜精品久久久久久久久| 国产一区不卡视频| 美女网站一区二区| 亚洲成人你懂的| 日韩一级片在线观看| 国产精品丝袜91| 精品久久久三级丝袜| 国产成人综合网站| 99re这里都是精品| 国产精品人妖ts系列视频| 国产福利一区在线| 日韩欧美一区二区在线视频| 久久久综合精品| 中文幕一区二区三区久久蜜桃| 国产精品久久久久影院亚瑟| 一区二区三区欧美在线观看| 91精品国产综合久久精品性色| 亚洲一区二区中文在线| 欧美视频在线观看一区| 日韩精品专区在线影院观看 | 中文天堂在线一区| 欧美一区二区三区视频在线观看| 一区二区视频在线看| 日韩午夜激情av| 亚洲精品国产品国语在线app| 国产成人免费视频网站高清观看视频| 亚洲激情av在线| 久久激情综合网| 国产一区二区女| 亚洲一区二区视频| 亚洲少妇屁股交4| 欧美三级午夜理伦三级中视频| 99久久99久久精品免费看蜜桃| 精品久久久久99| 欧美国产日本视频| 另类小说欧美激情| 国产成人夜色高潮福利影视| 日韩精品欧美精品| 国产午夜亚洲精品午夜鲁丝片| 欧美性猛交xxxxxxxx| 国产欧美一区视频| 五月婷婷久久丁香| 国产精品一区二区无线| 成人美女视频在线看| 一本大道久久a久久综合婷婷| 91黄色免费版| 亚洲一卡二卡三卡四卡无卡久久| 中文无字幕一区二区三区| 美女在线观看视频一区二区| 国产麻豆91精品| 在线亚洲高清视频| 亚洲日本欧美天堂| 欧美亚洲国产一区二区三区va| 亚洲综合色区另类av| 成人欧美一区二区三区黑人麻豆 | 韩国女主播一区二区三区| 一区二区三区在线免费观看| 精品国产a毛片| 国产偷国产偷精品高清尤物 | 91社区在线播放| 国产盗摄精品一区二区三区在线| 日本亚洲电影天堂| 中文字幕一区二区三中文字幕| 亚洲精品国产a| 看电视剧不卡顿的网站| 一区二区三区在线观看动漫| 国产成人免费av在线| 欧美片网站yy|