亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > DB2 > 正文

DB2中提高Insert性能的技巧

2024-09-06 23:57:57
字體:
來源:轉載
供稿:網友

本文詳細地講述了DB2數據庫中對INSERT語句性能優化的過程。

1、INSERT的執行步驟。

這些步驟中的每一步都有優化的潛力,對此我們在后面會一一討論。

(1)在客戶機準備語句。對于動態 SQL,在語句執行前就要做這一步,此處的性能是很重要的;對于靜態 SQL,這一步的性能實際上關系不大,因為語句的準備是事先完成的。

(2)在客戶機,將要插入的行的各個 列值組裝起來,發送到 DB2 服務器。

(3)DB2 服務器確定將這一行插入到哪一頁中。

(4)DB2 在 用于該頁的緩沖池中預留一個位置。如果 DB2 選定的是一個已有的頁,那么就需要讀磁盤;如果使用一個新頁,則要在表空間(如果是SMS,也就是系統管理存儲的表空間)中為該頁物理地分配空間。插入了新行的每一頁最后都要從緩沖池寫入到磁盤。

(5)在目標頁中對該行進行格式化,并獲得該行上的一個X(exclusive,獨占的) 行鎖。

(6)將反映該 insert 的一條記錄寫入到日志緩沖區中。

(7)最后提交包含該 insert 的事務,如果這時日志緩沖區中的記錄還沒有被寫入日志文件的話,則將這些記錄寫到日志文件中。

此外,還可能發生很多類型的附加處理,這取決于數據庫配置,例如,索引或觸發器的存在。這種額外的處理對于性能來說也是意義重大的,我們在后面會討論到。

2、insert 的替代方案

在詳細討論 insert 的優化之前,讓我們先考慮一下 insert 的兩種替代方案:load 和 import。import 實用程序實際上是 SQL INSERT 的一個前端,但它的某些功能對于您來說也是有用的。load 也有一些有用的額外功能,但是我們使用 load 而不使用 insert 的主要原因是可以提高性能。

(1)load 直接格式化數據頁,而避免了由于插入導致的對每一行進行處理的大部分開銷(例如,日志記錄在這里實際上是消除了)。而且,load 可以更好地利用多處理器機器上的并行性。在 V8 load 中有兩個新功能,它們對于 load 成為 insert 的替代方案有著特別的功效,這兩個功能是:從游標裝載和從調用層接口(CLI)應用程序裝載。

(2)從游標裝載

這種方法可用于應用程序的程序代碼(通過 db2Load API),或用于 DB2 腳本。下面是后一種情況的一個例子:

以下是代碼片段:
declare staffcursor cursor forselect * from staff;
  load from staffcursor of cursor insert into myschema.new_staff;

這兩行可以用下面一行替代:

以下是代碼片段:
insert into myschema.new_staff select * from staff

同等效的 INSERT ... SELECT 語句相比,從游標裝載幾乎可以提高 20% 的性能。

(3)從 CLI 裝載

這種方法顯然只限于調用層接口(CLI)應用程序,但是它非常快。這種技巧非常類似于數組插入,DB2 附帶了這樣的示例,使用 load 時的速度是使用經過完全優化的數組插入時的兩倍,幾乎要比未經優化的數組插入快 10 倍。

3、所有 insert 可以改進的地方

讓我們看看插入處理的一些必要步驟,以及我們可以用來優化這些步驟的技巧。

(1) 語句準備

作為一條 SQL 語句,INSERT 語句在執行之前必須由 DB2 進行編譯。這一步驟可以自動發生(例如在 CLP 中,或者在一次 CLI SQLExecDirect 調用中),也可以顯式地進行(例如,通過一條 SQL Prepare、CLI SQLPrepare 或 JDBC prepareStatement 語句)。該編譯過程牽涉到授權檢查、優化,以及將語句轉化為可執行格式時所需的其他一些活動。在編譯語句時,語句的訪問計劃被存儲在包緩存中。

如果重復地執行相同的 INSERT 語句,則該語句的訪問計劃(通常)會進入到包緩存中,這樣就免除了編譯的開銷。然而,如果 insert 語句對于每一行有不同的值,那么每一條語句都將被看成是惟一的,必須單獨地進行編譯。因此,將像下面這樣的重復語句:

以下是代碼片段:
insert into mytable values (1, 'abc')
  insert into mytable values (2, 'def')

等等,換成帶有參數標記的語句,一次準備,重復執行,這樣做是十分可取的:

以下是代碼片段:
insert into mytable values (?, ?)

使用參數標記可以讓一系列的 insert 的運行速度提高數倍。(在靜態 SQL 程序中使用主機變量也可以獲得類似的好處。)

(2)發送列值到服務器

可以歸為這一類的優化技巧有好幾種。最重要的一種技巧是在每條 insert 語句中包括多行,這樣就可以避免對于每一行都進行客戶機-服務器通信,同時也減少了 DB2 開銷??捎糜诙嘈胁迦氲募记捎校?/p>

在 VALUES 子句中包含多行的內容。例如,下面的語句將插入三行:INSERT INTO mytable VALUES (1, 'abc'), (2, 'def'), (3, 'ghi')

在 CLI 中使用數組插入(array insert)。這需要準備一條帶參數標記的 INSERT 語句,定義一個用于存儲要插入的值的數組,將該數組綁定到參數標記,以及對于每個數組中的一組內容執行一次 insert。而且,示例程序 sqllib/samples/cli/tbload.c 提供了數組插入的基本框架(但是執行的是 CLI LOAD)。從不使用數組改為使用包含 100 行的數組,可以將時間縮短大約 2.5 倍。所以應該盡可能地使用包含至少 100 行的數組。

在 JDBC 中使用批處理操作。這跟 CLI 中的數組插入一樣,基于相同的概念,但是實現細節有所不同。當通過 prepareStatement 方法準備了 insert 語句之后,剩下的步驟是針對每一列調用適當的 setXXXX 方法(例如,setString 或 setInt),然后是 addBatch。對于要插入的每一行,都要重復這些步驟,然后調用 executeBatch 來執行插入。要查看這方面的例子,請參閱“參考資料”一節中的 JDBC Tutorial。

使用 load 將數據快速地裝入到一個 staging 表中,然后使用 INSERT ... SELECT 填充主表。(通過這種方法節省下來的代價源于 load 的速度非???,再加上 INSERT ... SELECT 是在 DB2 內(在服務器上)傳輸數據的,從而消除了通信上的代價。一般情況下我們不會使用這種方法,除非在 INSERT ... SELECT 中還要另外做 load 無法完成的處理。

如果不可能在一條 insert 語句中傳遞多行,那么最好是將多條 insert 語句組成一組,將它們一起從客戶機傳遞到服務器。(不過,這意味著每條 insert 都包含不同的值,都需要準備,因而其性能實際上要比使用參數標記情況下的性能更差一些。)將多條語句組合成一條語句可以通過 Compound SQL 來實現:

在 SQL 中,復合語句是通過 BEGIN ATOMIC 或 BEGIN COMPOUND 語句創建的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
激情av一区二区| 亚洲一区二区久久久久久久| 国产v综合ⅴ日韩v欧美大片| 亚洲sss综合天堂久久| 在线日韩精品视频| 亚洲人成在线一二| 国产精品成人aaaaa网站| 日韩免费观看网站| 日韩精品视频在线免费观看| 66m—66摸成人免费视频| 色偷偷av一区二区三区| 久久久久久国产精品| 九色成人免费视频| 日韩有码在线视频| 亚洲天堂网在线观看| 欧美激情videoshd| 欧美精品电影在线| 2018国产精品视频| 国产精品视频区1| 国产日韩在线看片| 另类美女黄大片| 性色av一区二区三区免费| 欧美成人在线影院| 亚洲精品美女网站| 亚洲激情在线观看视频免费| 毛片精品免费在线观看| 在线观看中文字幕亚洲| 久久久久久这里只有精品| 亚洲天堂影视av| 川上优av一区二区线观看| 91九色蝌蚪国产| 日韩美女主播视频| 麻豆成人在线看| 亚洲深夜福利网站| www.日韩.com| 91精品久久久久久久久久久久久久| 国产精品久久久久久av下载红粉| 国产一区二区三区在线播放免费观看| 欧美最近摘花xxxx摘花| 欧美激情影音先锋| 欧美黄色片视频| 亚洲女人初尝黑人巨大| 精品中文字幕在线| 91免费人成网站在线观看18| 国产精自产拍久久久久久蜜| 欧美日韩另类视频| yw.139尤物在线精品视频| 青青草99啪国产免费| 亚洲一区精品电影| 自拍视频国产精品| 久久久女女女女999久久| 亚洲人成在线免费观看| 亚洲999一在线观看www| 欧美一级bbbbb性bbbb喷潮片| 国产综合福利在线| 亚洲电影免费观看高清完整版在线观看| 国产玖玖精品视频| 精品久久久精品| 久久天天躁日日躁| 久久免费视频观看| 亚洲午夜国产成人av电影男同| 神马国产精品影院av| 精品久久久久久亚洲精品| 国产精品欧美亚洲777777| 美女黄色丝袜一区| 国产精品视频导航| 5278欧美一区二区三区| 国内精品小视频在线观看| 欧美成人全部免费| 日韩美女毛茸茸| 丝袜一区二区三区| 午夜免费在线观看精品视频| 91精品一区二区| 久久国产精品99国产精| 97视频在线观看免费高清完整版在线观看| 欧美日在线观看| 亚洲国产97在线精品一区| 亚洲欧美国产一本综合首页| 欧美激情中文网| 日韩精品中文字幕视频在线| 午夜精品久久17c| 自拍偷拍亚洲精品| 亚洲精品av在线播放| 亚洲人成在线观看| 亚洲在线免费看| 国产亚洲精品久久久久久777| 亚洲国产精品va在线| 911国产网站尤物在线观看| 亚洲欧美一区二区三区情侣bbw| 欧美一级在线亚洲天堂| 日韩欧美成人免费视频| 91经典在线视频| 欧美亚洲另类制服自拍| 国产在线视频2019最新视频| 北条麻妃99精品青青久久| 欧美电影在线观看高清| 久青草国产97香蕉在线视频| 久久久久999| 亚洲第一视频在线观看| 成人欧美一区二区三区在线湿哒哒| 黑人狂躁日本妞一区二区三区| 国产一区二区欧美日韩| 国产亚洲精品久久久久久777| 日韩在线观看精品| 欧美精品在线极品| 精品国产一区二区三区久久狼黑人| 一本一本久久a久久精品综合小说| 高跟丝袜一区二区三区| 国产精品av在线| 国产精品视频一区二区高潮| 国产极品jizzhd欧美| 亚洲精品之草原avav久久| 亚洲2020天天堂在线观看| 国产精品观看在线亚洲人成网| 欧美另类xxx| 久久噜噜噜精品国产亚洲综合| 久久精品中文字幕一区| 成人黄色影片在线| 色妞一区二区三区| 国产精品久久久久久五月尺| 欧美裸身视频免费观看| 亚洲视频在线观看| 亚洲v日韩v综合v精品v| 国产精品免费视频xxxx| 91av在线精品| 国产一区二区日韩| 日韩中文在线观看| 亚洲在线视频观看| 亚洲人成绝费网站色www| 最近2019年中文视频免费在线观看| 亚洲免费电影在线观看| 在线a欧美视频| 日韩亚洲欧美中文高清在线| 亚洲香蕉伊综合在人在线视看| 欧美电影在线观看| www.久久撸.com| 国产偷国产偷亚洲清高网站| 亚洲男人天堂2024| 久久久久久久亚洲精品| 欧美成人黑人xx视频免费观看| 97精品在线观看| 日本亚洲欧洲色α| 欧美激情极品视频| 久久久久国产一区二区三区| 91精品视频免费观看| 国产免费一区二区三区在线能观看| 日本高清+成人网在线观看| 国产亚洲欧美aaaa| www.国产精品一二区| 欧美最猛性xxxxx免费| 久久深夜福利免费观看| 大胆人体色综合| 日韩一区二区在线视频| 日本不卡免费高清视频| 国产精品美乳一区二区免费| 国产91精品网站| 久久久久久久久电影| 91精品国产乱码久久久久久蜜臀| 亚洲性视频网址| 亚洲男人第一网站| 欧洲成人免费视频| 亚洲人成网站免费播放| 亚洲第一级黄色片| 91精品国产91久久久久久久久|