欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 淺談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對優化做出的貢獻的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    韩国三级hd两男一女| 欧美日本韩国一区二区三区视频 | 亚洲天堂视频一区| 欧美美女视频在线观看| 夜夜嗨av一区二区三区网页| 99视频热这里只有精品免费| 人妻少妇精品一区二区三区| 国产精品色呦呦| 成人性生交大合| 私库av在线播放| 中文字幕一区二区三区色视频| 风流少妇一区二区| 中文字幕电影av| 中文字幕一区二区三区精华液| 成人午夜免费av| 一本大道久久a久久综合| 亚洲四区在线观看| 下面一进一出好爽视频| 欧美精品精品一区| 爽好多水快深点欧美视频| av在线网站观看| www国产成人免费观看视频 深夜成人网| 精久久久久久久久久久| 天天色天天综合| 中文字幕日韩av资源站| 国产男女无遮挡猛进猛出| 欧美浪妇xxxx高跟鞋交| 日韩av电影天堂| 国产精品免费无码| 国产精品视频一二三区| 91丨porny丨最新| 制服.丝袜.亚洲.中文.综合| 日本欧美加勒比视频| 少妇无套高潮一二三区| 国产精品免费观看视频| 91视频在线观看| 日韩一区二区三| 国产一区二三区好的| 9999热视频| 亚洲一区二区三区小说| 亚洲av无码一区二区三区观看| 久久美女艺术照精彩视频福利播放| 国产精品自在在线| 欧美性受xxxx黑人xyx| 视频一区在线视频| 国产精品国产三级国产专业不 | 国产成人免费在线观看不卡| 色综合久久久久网| 三级一区在线视频先锋| 国产激情av在线| 亚洲卡通欧美制服中文| 不卡一区二区在线观看| 中文字幕高清不卡| 精品久久久久久无码人妻| 精品国产乱码久久久久久久久| 国产98色在线|日韩| 欧美日韩在线免费视频| 黄页视频在线91| 欧洲色大大久久| 久久精品国产99国产精品| 久久久久亚洲AV成人| 五月天国产精品| 日本午夜在线观看| 婷婷久久综合九色国产成人| 日韩一区二区三区四区视频| 亚洲综合一二三区| 日日操免费视频| 舔着乳尖日韩一区| 久久国产高清视频| 日本美女视频一区二区| 色综合天天综合网国产成人综合天| 天天av天天翘天天综合网色鬼国产 | 亚洲人精品午夜| 黄色在线观看av| 亚洲精品国产a久久久久久| 韩国三级hd中文字幕| 亚洲综合久久av| 精品人体无码一区二区三区| 亚洲电影视频在线| 日日噜噜夜夜狠狠久久波多野| 日韩精品91亚洲二区在线观看 | 黑人精品欧美一区二区蜜桃| 欧美日韩一二三| 成人综合在线网站| 精品免费一区二区三区| 中文字幕无码毛片免费看| 国产欧美视频在线观看| 亚洲中文字幕一区| 亚洲激情五月婷婷| 99成人在线观看| 捆绑变态av一区二区三区| 欧美午夜精品一区二区蜜桃| 国产91高潮流白浆在线麻豆| 欧美大片顶级少妇| 国产chinese中国hdxxxx| 亚洲精品高清在线观看| caoporn91| 国产一区二区看久久| 91精品国产麻豆| 92精品国产成人观看免费| 国产欧美一区视频| 久久久久久亚洲中文字幕无码| 亚洲成a人片在线观看中文| 日本道精品一区二区三区| 国产98色在线|日韩| 久久婷婷国产综合精品青草| 亚洲av成人无码一二三在线观看| 亚洲精品日韩专区silk| 色综合中文字幕国产| 激情丁香综合五月| 中文字幕精品久久久| 亚洲女人的天堂| 在线免费看av网站| 亚洲免费av观看| 成人性生活毛片| 国产成人综合在线| 久久久久久亚洲综合影院红桃 | 天堂久久久久va久久久久| 欧美日韩在线免费视频| av午夜一区麻豆| 亚洲美腿欧美偷拍| 色老综合老女人久久久| 99久久精品一区| 亚洲男人的天堂网| 色婷婷综合久色| 99久久99久久精品国产片果冻| 成人欧美一区二区三区| 色婷婷av一区二区| 91丨porny丨首页| 亚洲专区一二三| 欧美美女一区二区在线观看| 国产一线在线观看| 同产精品九九九| 欧美一级片免费看| 爱爱的免费视频| 精品一区二区三区在线播放| 久久这里只精品最新地址| 调教驯服丰满美艳麻麻在线视频| 国产一区二区网址| 国产精品蜜臀av| 欧洲精品一区二区三区在线观看| 亚洲成人av免费观看| 亚洲午夜激情av| 日韩欧美视频一区| 亚洲无人区码一码二码三码的含义| 久久国产精品99久久人人澡| 国产亚洲欧美激情| 久久r这里只有精品| 久久久精品人妻一区二区三区| 午夜精品福利在线| 精品少妇一区二区| 黄色一级片一级片| 成人亚洲一区二区一| 亚洲免费观看高清完整版在线观看熊| 在线欧美日韩国产| 亚洲 欧美 日韩在线| 欧美日韩极品在线观看一区| 国产乱了高清露脸对白| 久久精品av麻豆的观看方式| 国产日本欧洲亚洲| 色一情一伦一子一伦一区| 岛国精品一区二区三区| 老司机免费视频一区二区| 日本一区二区三区久久久久久久久不 | 欧美日韩高清一区二区三区| 三级黄色片网站| 国产福利91精品一区二区三区| 自拍视频在线观看一区二区| 欧美精三区欧美精三区| 亚洲区自拍偷拍| 97久久超碰国产精品| 日韩成人免费电影| 国产女人18水真多18精品一级做| 色网站国产精品| 18禁裸乳无遮挡啪啪无码免费| 国产九九视频一区二区三区| 夜夜夜精品看看| 精品欧美一区二区久久| 一本一道久久a久久精品 | 亚洲丝袜制服诱惑| 91精品国产一区二区人妖| 欧美xxxx精品| 一级黄色免费视频| 国产91露脸合集magnet| 婷婷夜色潮精品综合在线| 国产丝袜欧美中文另类| 欧美唯美清纯偷拍| 99精品全国免费观看| 国产成人精品一区二区三区在线观看 | 欧美在线视频不卡| 男女做爰猛烈刺激| 韩国三级在线播放| 国产乱子伦视频一区二区三区| 亚洲最大成人综合| 久久精品免视看| 91精品国产欧美一区二区| 五月天av网站| 37p粉嫩大胆色噜噜噜| 91麻豆精品秘密| 国产高清在线精品|