精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在DB2中提高Insert性能

運(yùn)維 數(shù)據(jù)庫運(yùn)維 數(shù)據(jù)庫
本文向您介紹了在IBM DB2數(shù)據(jù)庫中優(yōu)化和提高Insert性能的一些方法、原理以及Insert的替代方案。

 INSERT處理過程概述

首先讓我們快速地看看insert一行時(shí)的處理步驟。這些步驟中的每一步都有優(yōu)化的潛力,對(duì)此我們?cè)诤竺鏁?huì)一一討論。

1、在客戶機(jī)準(zhǔn)備語句。對(duì)于動(dòng)態(tài)SQL,在語句執(zhí)行前就要做這一步,此處的性能是很重要的;對(duì)于靜態(tài)SQL,這一步的性能實(shí)際上關(guān)系不大,因?yàn)檎Z句的準(zhǔn)備是事先完成的。

2、在客戶機(jī),將要插入的行的各個(gè)列值組裝起來,發(fā)送到DB2服務(wù)器。

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

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

5、在目標(biāo)頁中對(duì)該行進(jìn)行格式化,并獲得該行上的一個(gè)X(exclusive,獨(dú)占的)行鎖。

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

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

此外,還可能發(fā)生很多類型的附加處理,這取決于數(shù)據(jù)庫配置,例如,索引或觸發(fā)器的存在。這種額外的處理對(duì)于性能來說也是意義重大的,我們?cè)诤竺鏁?huì)討論到。

INSERT的替代方案

在詳細(xì)討論insert的優(yōu)化之前,讓我們先考慮一下insert的兩種替代方案:load和import。import實(shí)用程序?qū)嶋H上是SQLINSERT的一個(gè)前端,但它的某些功能對(duì)于您來說也是有用的。load也有一些有用的額外功能,但是我們使用load而不使用insert的主要原因是可以提高性能。

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

從游標(biāo)裝載

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

declarestaffcursorcursorforselect*fromstaff;

loadfromstaffcursorofcursorinsertintomyschema.new_staff;

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

insertintomyschema.new_staffselect*fromstaff

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

從CLI裝載

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

所有INSERT可以改進(jìn)的地方

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

1.語句準(zhǔn)備

作為一條SQL語句,INSERT語句在執(zhí)行之前必須由DB2進(jìn)行編譯。這一步驟可以自動(dòng)發(fā)生(例如在CLP中,或者在一次CLISQLExecDirect調(diào)用中),也可以顯式地進(jìn)行(例如,通過一條SQLPrepare、CLISQLPrepare或JDBCprepareStatement語句)。該編譯過程牽涉到授權(quán)檢查、優(yōu)化,以及將語句轉(zhuǎn)化為可執(zhí)行格式時(shí)所需的其他一些活動(dòng)。在編譯語句時(shí),語句的訪問計(jì)劃被存儲(chǔ)在包緩存中。

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

insertintomytablevalues(1,'abc')

insertintomytablevalues(2,'def')

換成帶有參數(shù)標(biāo)記的語句,一次準(zhǔn)備,重復(fù)執(zhí)行,這樣做是十分可取的:

insertintomytablevalues(?,?)

使用參數(shù)標(biāo)記可以讓一系列的insert的運(yùn)行速度提高數(shù)倍。(在靜態(tài)SQL程序中使用主機(jī)變量也可以獲得類似的好處。)

2.發(fā)送列值到服務(wù)器

可以歸為這一類的優(yōu)化技巧有好幾種。最重要的一種技巧是在每條insert語句中包括多行,這樣就可以避免對(duì)于每一行都進(jìn)行客戶機(jī)-服務(wù)器通信,同時(shí)也減少了DB2開銷。可用于多行插入的技巧有:

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

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

在JDBC中使用批處理操作。這跟CLI中的數(shù)組插入一樣,基于相同的概念,但是實(shí)現(xiàn)細(xì)節(jié)有所不同。當(dāng)通過prepareStatement方法準(zhǔn)備了insert語句之后,剩下的步驟是針對(duì)每一列調(diào)用適當(dāng)?shù)膕etXXXX方法(例如,setString或setInt),然后是addBatch。對(duì)于要插入的每一行,都要重復(fù)這些步驟,然后調(diào)用executeBatch來執(zhí)行插入。要查看這方面的例子,請(qǐng)參閱“參考資料”一節(jié)中的JDBCTutorial。

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

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

在SQL中,復(fù)合語句是通過BEGINATOMIC或BEGINCOMPOUND語句創(chuàng)建的。

在CLI中,復(fù)合語句可以通過SQLExecDirect和SQLExecute調(diào)用來建立。對(duì)于DB2V8FixPak4,另一種生成復(fù)合語句的方法是在(對(duì)一條預(yù)處理語句)發(fā)出多個(gè)SQLExecute調(diào)用之前設(shè)置語句屬性SQL_ATTR_CHAINING_BEGIN,并在調(diào)用之后設(shè)置語句屬性SQL_ATTR_CHAINING_END。

下面是關(guān)于該話題的其他一些建議:

如果可能的話,讓客戶機(jī)與要存取的數(shù)據(jù)庫使用相同的代碼頁,以避免在服務(wù)器上的轉(zhuǎn)換代價(jià)。數(shù)據(jù)庫的代碼頁可以通過運(yùn)行“getdbcfgfor”來確定。

在某些情況下,CLI會(huì)自動(dòng)執(zhí)行數(shù)據(jù)類型轉(zhuǎn)換,但是這樣同時(shí)也會(huì)帶來看不見的(小小的)性能損耗。因此,盡量使插入值直接處于與相應(yīng)列對(duì)應(yīng)的格式。

將應(yīng)用程序中與插入相關(guān)的設(shè)置開銷最小化。例如,當(dāng)在CLI中使用數(shù)組插入時(shí),對(duì)于整個(gè)一組插入,應(yīng)該盡量保證對(duì)于每一列只執(zhí)行一次SQLBindParameter,而不是對(duì)每一組數(shù)組內(nèi)容都執(zhí)行一次。對(duì)于個(gè)體來說,這些調(diào)用的代價(jià)并不高,但是這些代價(jià)是累積的。#p#

3.找到存儲(chǔ)行的地方

DB2使用三種算法中的一種來確定將行插入到哪里。(如果使用了多維群集(Multi-dimensionalClustering,MDC),則另當(dāng)別論,我們?cè)谶@里不予討論。)

缺省模式是,DB2搜索散布在表的各頁上的自由空間控制記錄(FreeSpaceControlRecords,F(xiàn)SCR),以找到有足夠自由空間存放新行的頁。顯然,如果每頁上的自由空間都比較少的話,就要浪費(fèi)很多的搜索時(shí)間。為了應(yīng)付這一點(diǎn),DB2提供了DB2MAXFSCRSEARCH注冊(cè)表變量,以便允許將搜索范圍限制為少于缺省的5頁。

當(dāng)表是通過ALTERTABLE以APPEND模式放置時(shí),就要使用第二種算法。這樣就完全避免了FSCR搜索,因?yàn)橹恍韬?jiǎn)單地將行直接放到表的末尾。

當(dāng)表有群集索引(clusteringindex)時(shí),就要用到最后一種算法。在這種情況下,DB2試圖將每一行插入到有相似鍵值的一頁中。如果那一頁沒有空間了,DB2就會(huì)嘗試附近的頁,如果附近的頁也沒有空間,DB2就進(jìn)行FSCR搜索。

如果只考慮插入時(shí)間的優(yōu)化,那么使用APPEND模式對(duì)于批量插入是最快的一種方法,但是這種方法的效果遠(yuǎn)不如我們這里討論的很多其他方法那么成效顯著。第二好的方法應(yīng)該是采用缺省算法,但是,如果在最佳環(huán)境中,更改DB2MAXFSCRSEARCH的值影響很小,而在一個(gè)I/O約束較少的環(huán)境中,這種更改所造成的影響就比較可觀了。

如果有群集索引,則對(duì)insert的性能會(huì)有很大的負(fù)面影響,這一點(diǎn)也不驚奇,因?yàn)槭褂萌杭饕哪康木褪峭ㄟ^在插入時(shí)做額外的工作來提高查詢(即select)性能的。如果的確需要群集索引,那么可以通過確保有足夠的自由空間來使其對(duì)插入的影響降至最小:使用ALTERTABLE增加PCTFREE,然后使用REORG預(yù)留自由空間。不過,如果允許太多自由空間的存在,則可能導(dǎo)致查詢時(shí)需要讀取額外的頁,這反而大大違反了使用群集索引的本意。另一種選擇是,在批量插入之前先刪除群集索引,而后再重新創(chuàng)建群集索引,也許這是最優(yōu)的方法(創(chuàng)建群集索引的開銷跟創(chuàng)建常規(guī)索引的開銷差不多,都不是很大,只是在插入時(shí)有額外的開銷)。

4.緩沖池、I/O和頁清除

每一條insert在執(zhí)行時(shí),都是先將新行存儲(chǔ)在一個(gè)頁中,并最終將那個(gè)頁寫到磁盤上。一旦像前面討論的那樣指定了頁,那么在將行添加到該頁之前,該頁必須已經(jīng)在緩沖池中。對(duì)于批量插入,大部分頁都是最新指派給表的,因此讓我們關(guān)注一下對(duì)新頁的處理。

如果表在系統(tǒng)管理存儲(chǔ)的(SystemManagedStorage,SMS)表空間中,當(dāng)需要新頁時(shí),缺省情況下是從文件系統(tǒng)中分別為每一頁分配空間。但是,如果對(duì)數(shù)據(jù)庫運(yùn)行了db2empfa命令,那么每個(gè)SMS表空間就會(huì)為新頁一次性分配一個(gè)區(qū)段。我們建議運(yùn)行db2empfa命令,并使用32頁的區(qū)段。

對(duì)于數(shù)據(jù)庫管理的存儲(chǔ)(DatabaseManagedStorage,DMS)表空間,空間是在創(chuàng)建表空間時(shí)就預(yù)先分配的,但是頁的區(qū)段則是在插入處理過程中指派給表的。與SMS相比,DMS對(duì)空間的預(yù)分配可以提高大約20%的性能--使用DMS時(shí),更改區(qū)段大小并沒有明顯的效果。

如果表上有索引,則對(duì)于每個(gè)插入的行,都要添加一個(gè)條目到每條索引。這要求在緩沖池中存在適當(dāng)?shù)乃饕摗M硇r(shí)候我們將討論索引的維護(hù),但是現(xiàn)在只需記住,插入時(shí)對(duì)緩沖池和I/O的考慮也類似地適用于索引頁,對(duì)于數(shù)據(jù)頁也是一樣。

隨著插入的進(jìn)行,越來越多的頁中將填入被插入的行,但是,DB2不要求在insert或Commit后將任何新插入的或更新后的數(shù)據(jù)或索引寫入到磁盤。(這是由于DB2的writeahead日志記錄算法。但是有一個(gè)例外,這將在關(guān)于日志記錄的小節(jié)中論述到。)然而,這些頁需要在某一時(shí)刻寫到磁盤上,這個(gè)時(shí)刻可能會(huì)在數(shù)據(jù)庫關(guān)閉時(shí)才會(huì)輪到。

一般來說,對(duì)于批量插入,您會(huì)希望積極地進(jìn)行異步頁清除(asynchronouspagecleaning),這樣在緩沖池中就總有可用于新頁的空余位置。頁清除率,或者說總?cè)表撀剩赡軐?dǎo)致計(jì)時(shí)上的很大不同,使得性能比較容易產(chǎn)生誤解。例如,如果使用100,000頁的緩沖池,并且不存在頁清除,則批量插入在結(jié)束前不會(huì)有任何新的或更改過的(“臟的”)頁寫到磁盤上,但是隨后的操作(例如選擇,甚至乎關(guān)閉數(shù)據(jù)庫)都將被大大推遲,因?yàn)檫@時(shí)有至多100,000個(gè)在插入時(shí)產(chǎn)生的臟頁要寫到磁盤上。另一方面,如果在同一情況下進(jìn)行了積極的頁清除,則批量插入過程可能要花更長(zhǎng)的時(shí)間,但是此后緩沖池中的臟頁要少一些,從而使得隨后的任務(wù)執(zhí)行起來性能更佳。至于那些結(jié)果中到底哪個(gè)要更好些,我們并不是總能分得清,但是通常來說,將所有臟頁都存儲(chǔ)在緩沖池中是不可能的,所以為了取得最佳性能,采取有效的頁清除是有必要的。

為了盡可能好地進(jìn)行頁清除:

將CHNGPGS_THRESH數(shù)據(jù)庫配置參數(shù)的值從缺省的60減少到5這么低。這個(gè)參數(shù)決定緩沖池中臟頁的閾值百分比,當(dāng)臟頁達(dá)到這個(gè)百分比時(shí),就會(huì)啟動(dòng)頁清除。

嘗試啟用注冊(cè)表變量DB2_USE_ALTERNATE_PAGE_CLEANING(在DB2V8FixPak4中最新提供)。通過將這個(gè)變量設(shè)置成ON,可以為頁清除提供一種比缺省方法(基于CHNGPGS_THRESH和LSN間隙觸發(fā)器)更積極的方法。我沒有評(píng)測(cè)過其效果。請(qǐng)參閱FixPak4ReleaseNotes以了解這方面的信息。

確保NUM_IOCLEANERS數(shù)據(jù)庫配置參數(shù)的值至少等于數(shù)據(jù)庫中物理存儲(chǔ)設(shè)備的數(shù)量。

至于I/O本身,當(dāng)需要建立索引時(shí),可以通過使用盡可能大的緩沖池來將I/O活動(dòng)減至最少。如果不存在索引,則使用較大的緩沖池幫助不大,而只是推遲了I/O。也就是說,它允許所有新頁暫時(shí)安放在緩沖池中,但是最終仍需要將這些頁寫到磁盤上。

當(dāng)發(fā)生將頁寫到磁盤的I/O時(shí),通過一些常規(guī)的I/O調(diào)優(yōu)步驟可以加快這一過程,例如:

將表空間分布在多個(gè)容器(這些容器映射到不同磁盤)。

盡可能使用最快的硬件和存儲(chǔ)管理配置,這包括磁盤和通道速度、寫緩存以及并行寫等因素。

避免RAID5(除非是與像Shark這樣有效的存儲(chǔ)設(shè)備一起使用)。#p#

5.鎖

缺省情況下,每一個(gè)插入的行之上都有一個(gè)X鎖,這個(gè)鎖是在該行創(chuàng)建時(shí)就開始有的,一直到insert被提交。有兩個(gè)跟insert和鎖相關(guān)的性能問題:

◆為獲得和釋放鎖而產(chǎn)生的CPU開銷。

◆可能由于鎖沖突而導(dǎo)致的并發(fā)問題。

對(duì)于經(jīng)過良好優(yōu)化的批量插入,由獲得每一行之上的一個(gè)X鎖以及后來釋放該鎖引起的CPU開銷是比較可觀的。對(duì)于每個(gè)新行之上的鎖,惟一可以替代的是表鎖(DB2中沒有頁鎖)。當(dāng)使用表鎖時(shí),耗時(shí)減少了3%。有3種情況可以導(dǎo)致表鎖的使用,在討論表鎖的缺點(diǎn)之前,我們先用一點(diǎn)時(shí)間看看這3種情況:

運(yùn)行ALTERTABLELOCKSIZETABLE。這將導(dǎo)致DB2為隨后使用該表的所有SQL語句使用一個(gè)表鎖,直到locksize參數(shù)改回到ROW。

運(yùn)行LOCKTABLEINEXCLUSIVEMODE。這將導(dǎo)致表上立即上了一個(gè)X鎖。注意,在下一次提交(或回滾)的時(shí)候,這個(gè)表將被釋放,因此,如果您要運(yùn)行一個(gè)測(cè)試,測(cè)試中每N行提交一次,那么就需要在每次提交之后重復(fù)執(zhí)行LOCKTABLE。

使用缺省鎖,但是讓LOCKLIST和MAXLOCKS數(shù)據(jù)庫配置參數(shù)的值比較小。當(dāng)獲得少量的行鎖時(shí),行鎖就會(huì)自動(dòng)地逐漸升級(jí)為表鎖。

當(dāng)然,所有這些的缺點(diǎn)就在于并發(fā)的影響:如果表上有一個(gè)X鎖,那么其他應(yīng)用程序除非使用了隔離級(jí)別UR(未提交的讀),否則都不能訪問該表。如果知道獨(dú)占訪問不會(huì)導(dǎo)致問題,那么就應(yīng)該盡量使用表鎖。但是,即使您堅(jiān)持使用行鎖,也應(yīng)記住,在批量插入期間,表中可能存在數(shù)千個(gè)有X鎖的新行,所以就可能與其他使用該表的應(yīng)用程序產(chǎn)生沖突。通過一些方法可以將這些沖突減至最少:

確保鎖的升級(jí)不會(huì)無故發(fā)生。您可能需要加大LOCKLIST和/或MAXLOCKS的值,以允許插入應(yīng)用程序有足夠的鎖。

對(duì)于其他的應(yīng)用程序,使用隔離級(jí)別UR。

對(duì)于V8FixPak4,或許也可以通過DB2_EVALUNCOMMITTED注冊(cè)表變量來減少鎖沖突:如果將該變量設(shè)置為YES,那么在很多情況下,只能獲得那些符合某個(gè)謂詞的行上的鎖,而并不是獲得被檢查的所有行上的鎖。

發(fā)出一個(gè)COMMIT命令以釋放鎖,因此如果更頻繁地提交的話就足以減輕鎖沖突的負(fù)擔(dān)。

注意

在V7中,存在涉及insert和鍵鎖的并發(fā)問題,但是在V8中,由于提供了type-2索引,這些問題實(shí)際上已經(jīng)不見了。如果要遷移到V8中來,那么應(yīng)該確保使用帶CONVERT關(guān)鍵字的REORGINDEXES命令,以便將索引從type-1轉(zhuǎn)換為type-2。

在V7中,插入過程中可能使用W或NW鎖,但是在V8中只有在使用了type-1索引或者隔離級(jí)別為RR的情況下才會(huì)出現(xiàn)這兩種鎖。因此,應(yīng)盡可能避免這兩種情況。

一條insert所據(jù)有的鎖(通常是一個(gè)X鎖)通常不會(huì)受隔離級(jí)別的影響。例如,使用隔離級(jí)別UR不會(huì)阻止從插入的行上獲得鎖。然而,如果使用了INSERT...SELECT,則隔離級(jí)別將影響從SELECT獲得的鎖。#p#

6.日志記錄

缺省情況下,每條insert都會(huì)被記錄下來,以用于恢復(fù)。日志記錄首先被寫到內(nèi)存中的日志緩沖池,然后再寫到日志文件,通常是在日志緩沖池已滿或者發(fā)生了一次提交時(shí)寫到日志文件的。對(duì)批量插入的日志記錄的優(yōu)化實(shí)際上就是最小化日志記錄寫的次數(shù),以及使寫的速度盡可能快。

這里首先考慮的是日志緩沖池的大小,這由數(shù)據(jù)庫配置參數(shù)LOGBUFSZ來控制。該參數(shù)缺省值為8頁或32K,這與大多數(shù)批量插入所需的理想日志緩沖池大小相比要小些。舉個(gè)例子,對(duì)于一個(gè)批量插入,假設(shè)對(duì)于每一行的日志內(nèi)容有200字節(jié),則在插入了160行之后,日志緩沖池就將被填滿。如果要插入1000行,因?yàn)槿罩揪彌_池將被填滿幾次,再加上提交,所以大概有6次日志寫。如果將LOGBUFSZ的值增加到64頁(256K)或者更大,緩沖池就不會(huì)被填滿,這樣的話對(duì)于該批量插入就只有一次日志寫(在提交時(shí))。通過使用更大的LOGBUFSZ可以獲得大約13%的性能提升。較大日志緩沖池的不利之處是,緊急事故恢復(fù)所花的時(shí)間可能要稍微長(zhǎng)一點(diǎn)。

減少日志寫的另一種可能性是對(duì)新行要插入到的那個(gè)表使用“ALTERTABLEACTIVATENOTLOGGEDINITIALLY”(NLI)。如果這樣做了,那么在該工作單元內(nèi)不會(huì)記錄任何insert操作,但是這里存在兩個(gè)與NLI有關(guān)的重要問題:

如果有一條語句失敗,那么這個(gè)表將被標(biāo)記為不可訪問的,并且需要被刪除掉。這與其他恢復(fù)問題(請(qǐng)參閱SQLReference關(guān)于CreateTable的討論)一起使得NLI在很多情況下不能成為可行的方法。

在工作單元最后進(jìn)行的提交,必須等到在此工作單元內(nèi)涉及的所有臟頁都被寫到磁盤之后才能完成。這意味著這種提交要占用大量的時(shí)間。如果沒有積極地進(jìn)行頁清除,那么在使用NLI的情況下,Insert加上提交所耗費(fèi)的總時(shí)間要更長(zhǎng)一些。將NLI與積極的頁清除一起使用的時(shí)候,可以大大減少耗時(shí)。如果使用NLI,就要瞪大眼睛盯緊提交操作所耗費(fèi)的時(shí)間。

至于提高日志寫的速度,有下面一些可能性:

將日志與新行所要插入到的表分別放在不同的磁盤上。

在操作系統(tǒng)層將日志分放到多個(gè)磁盤。

考慮為日志使用原始設(shè)備(rawdevice),但是要注意,這樣管理起來要更困難些。

避免使用RAID5,因?yàn)樗贿m合于寫密集型(write-intensive)活動(dòng)。

7.提交

提交迫使將日志記錄寫到磁盤上,以保證提交的插入肯定會(huì)存在于數(shù)據(jù)庫中,并且釋放新行上的鎖。這些都是有價(jià)值的活動(dòng),但是因?yàn)镃ommit總是要牽涉到同步I/O(對(duì)于日志),而insert則不會(huì),所以Commit的開銷很容易高于insert的開銷。因此,在進(jìn)行批量插入時(shí),每一行都提交一次的做法對(duì)于性能來說是很糟糕的,所以應(yīng)確保不使用自動(dòng)提交(對(duì)于CLI和CLP來說缺省情況正是如此)。建議大約每1000行提交一次:當(dāng)每1000行而不是一兩行提交一次時(shí),性能可以提高大概10倍。不過,一次提交多于1000行只能節(jié)省少量的時(shí)間,但是一旦出現(xiàn)失敗,恢復(fù)起來所花的時(shí)間要更多。

對(duì)上述方法的一種修正:如果MINCOMMIT數(shù)據(jù)庫配置參數(shù)的值大于1(缺省值),則DB2就不必對(duì)每次commit都進(jìn)行一次同步I/O,而是等待,并試圖與一組事件一起共享日志I/O。對(duì)于某些環(huán)境來講,這樣做是有好處,但是對(duì)于批量插入常常沒有作用,甚至有負(fù)作用,因此,如果要執(zhí)行的關(guān)鍵任務(wù)是批量插入,就應(yīng)該讓MINCOMMIT的值保持為1。

可以選擇性地進(jìn)行改進(jìn)的地方

對(duì)于一次insert,有幾種類型的處理將自動(dòng)發(fā)生。如果您的主要目標(biāo)只是減少插入時(shí)間,那么最簡(jiǎn)單的方法是避免所有這些處理的開銷,但是如果從總體上考慮的話,這樣做未必值得。讓我們依次進(jìn)行討論。

索引維護(hù)

對(duì)于插入的每一行,必須添加一個(gè)條目到表上的每個(gè)索引中(包括任何主鍵索引)。這一過程主要有兩方面的代價(jià):

遍歷每個(gè)索引樹,在樹的每一層搜索一個(gè)頁,以確定新條目必須存儲(chǔ)在哪里(索引條目總是按鍵順序存儲(chǔ)的),這一過程所引起的CPU開銷;

將所有搜索到的頁讀入緩沖池,并最終將每個(gè)更新后的頁寫到磁盤上的I/O開銷。

更壞的場(chǎng)景是,在索引維護(hù)期間有大量的隨機(jī)I/O。假設(shè)要插入10,000行,在索引的緩沖池中有5000頁,并且要插入的各行的鍵值隨機(jī)分布在整個(gè)鍵范圍內(nèi)。那么,有10,000個(gè)這么多的葉子頁(可能還有些非葉子頁)需要進(jìn)入緩沖池,以便對(duì)它們進(jìn)行搜索和/或更新,對(duì)于一個(gè)給定的葉子頁,它預(yù)先已經(jīng)在緩沖池中的概率只有10%。對(duì)于每次的insert,需要讀磁盤的概率如此之高,使得這種場(chǎng)景往往性能很差。

對(duì)于逐行插入,將新行添加到已有的索引中比起創(chuàng)建一個(gè)新索引來代價(jià)要高得多。如果是插入到一個(gè)空表,應(yīng)該總是在進(jìn)行了列插入之后創(chuàng)建索引。(注意,如果使用了load,則應(yīng)該預(yù)先創(chuàng)建索引。)如果要插入到一個(gè)已經(jīng)填充過的表,那么在列插入之前刪除索引,并在列插入之后重新創(chuàng)建索引,這種方法可能是最快的,但是只有在要插入相當(dāng)多的行--大概大于表的10-20%的時(shí)候,才能這么說。如果為索引表空間使用較大的緩沖池,并且盡可能地將不同insert排序,以便鍵值是排好序的,而不是隨機(jī)的,就可以幫助加快索引維護(hù)。

【編輯推薦】

  1. 使用DB2必須了解的幾個(gè)知識(shí)點(diǎn)
  2. 淺談IBM DB2的數(shù)據(jù)庫備份與恢復(fù)
  3. DB2數(shù)據(jù)庫性能優(yōu)化技巧詳解
責(zé)任編輯:佚名 來源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2009-04-16 15:38:18

DB2IMPORT性能

2010-08-31 15:08:14

DB2INSERT優(yōu)化

2011-05-17 09:32:25

DB2

2010-07-29 15:34:37

IBM DB2

2011-03-16 14:16:05

DB2查詢

2010-08-05 15:17:43

DB2提高IMPORT

2011-03-21 09:51:04

DB2性能優(yōu)化

2010-08-06 13:45:11

DB2提高IMPORT

2010-07-28 14:07:51

DB2數(shù)據(jù)庫

2010-08-02 13:05:01

DB2應(yīng)用

2010-07-27 13:46:08

DB2提高IMPORT

2010-07-29 10:19:18

提高DB2 IMPOR

2010-08-18 09:42:11

DB2性能調(diào)優(yōu)

2010-09-06 15:00:40

DB2 9 XML

2010-08-18 09:26:56

DB2性能調(diào)優(yōu)

2010-08-03 09:59:30

DB2數(shù)據(jù)庫

2022-10-27 08:00:00

數(shù)據(jù)庫分片數(shù)據(jù)庫系統(tǒng)分層分區(qū)

2010-08-09 15:59:42

2010-08-17 17:29:06

DB2性能優(yōu)化

2009-01-03 14:43:55

ibmdwaIXI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产日本一区二区三区| 欧美mv日韩mv亚洲| 亚洲国产精品久久久久婷婷老年| 免费黄色小视频在线观看| 欧美1级片网站| 日韩一区二区三区电影| 国产精品沙发午睡系列| 久久77777| www.成人网.com| 成人免费看黄网站| 影音先锋亚洲天堂| 我不卡伦不卡影院| 亚洲天堂免费视频| 国产精品熟妇一区二区三区四区| 欧美性片在线观看| 午夜婷婷国产麻豆精品| 综合一区中文字幕| 国产视频精品久久| 国产91精品在线观看| 国产福利精品在线| 日本一区二区三区免费视频| 色135综合网| 亚洲精品一区二区久| 1314成人网| 中韩乱幕日产无线码一区| 亚洲电影一级黄| 免费观看黄色大片| 成人午夜电影在线观看| 99re6这里只有精品视频在线观看| 成人激情视频在线播放| 小泽玛利亚一区二区三区视频| 在线欧美三区| 久久99久久亚洲国产| 最新日韩免费视频| 精品久久久久久久| 亚洲美女免费精品视频在线观看| 人妻互换一二三区激情视频| 国产精品视频一区二区三区综合| 色系网站成人免费| 欧美亚洲另类色图| 国产极品在线观看| 亚洲国产一区在线观看| www国产免费| 高清全集视频免费在线| 国产精品久久久久影院色老大| 麻豆成人91精品二区三区| 欧美一级专区免费大片| 91 视频免费观看| 久久99国产精品二区高清软件| 狠狠久久亚洲欧美专区| 激情伊人五月天| 国产高清视频色在线www| 性欧美疯狂xxxxbbbb| 成人免费a级片| 白白色在线观看| 亚洲国产另类av| 国产婷婷一区二区三区| 98色花堂精品视频在线观看| 午夜欧美一区二区三区在线播放| 欧美日韩福利在线| 欧产日产国产精品视频| 欧美日韩亚洲激情| 丁香婷婷激情网| 国产精品成人国产| 欧美老人xxxx18| 国产chinesehd精品露脸| 亚洲一区二区三区中文字幕在线观看| 欧美成人精精品一区二区频| 中文字幕一区二区三区乱码不卡| 国产精品色呦| 亚洲天堂av高清| 九九九视频在线观看| 四虎8848精品成人免费网站| 久久人人爽人人爽爽久久| 国产区精品在线观看| 欧美激情精品久久久久久免费| 91精品在线观看国产| 久久av资源网站| 国产中文字幕免费| 香蕉成人久久| 国产在线观看一区二区三区| 亚洲第一天堂影院| 97精品国产露脸对白| 日本视频一区二区不卡| 天堂地址在线www| 亚洲免费在线看| 91专区在线观看| 成人在线中文| 欧美xxxx老人做受| 日韩人妻无码一区二区三区| 四季av一区二区三区免费观看| 欧美精品xxx| 欧美a视频在线观看| 激情五月婷婷综合| 国产精品日本一区二区| 国产精品ⅴa有声小说| 一区二区在线免费观看| 人妻少妇被粗大爽9797pw| 亚洲综合视频| 日韩精品中文字幕有码专区| 成年人二级毛片| 99国产精品| 91精品久久久久久久久青青| 日韩在线观看视频一区| 中文字幕免费观看一区| 日韩av中文字幕第一页| 国产精品亲子伦av一区二区三区 | 国产91视频一区| 性感女国产在线| 日韩欧美一级二级三级| 成人激情五月天| 亚洲一区网站| 97影院在线午夜| 91九色在线porn| 精品高清美女精品国产区| 在线播放免费视频| 久久91成人| 国自在线精品视频| 国产v片在线观看| 欧美韩国一区二区| 国产男女无遮挡| 91亚洲无吗| 久久综合久中文字幕青草| 欧美性猛交xxxx乱大交hd| 91色在线porny| 日本黄大片在线观看| 高清一区二区| xvideos亚洲人网站| 中文字幕免费观看| 91视频一区二区三区| 日韩精品在线观看av| 欧美午夜在线播放| 精品国产欧美一区二区三区成人| 在线免费观看av网址| xfplay精品久久| 国产精品专区在线| 国产精品美女在线观看直播| 欧美激情一区二区三级高清视频| 999国产精品视频免费| 国产精品久久久一本精品 | 国产午夜精品视频免费不卡69堂| 日韩av片在线播放| 成人av资源站| 岛国大片在线播放| 久久男人av| 91爱视频在线| 日韩精品视频在线观看一区二区三区| 亚洲一区二区黄色| 星空大象在线观看免费播放| 国产日韩欧美一区二区三区在线观看| 国产在线一区二区三区播放| 国产调教在线| 亚洲免费一在线| 欧美黄色一级大片| 国产日韩欧美a| 激情视频免费网站| 偷偷www综合久久久久久久| 亚洲最大的网站| 激情av在线播放| 亚洲精品国产精品国自产在线| 国产成人一级片| 国产日韩三级在线| 在线观看日本一区二区| 欧美电影免费观看高清| 成人免费在线网址| 18加网站在线| 日韩av中文字幕在线| 无码视频在线观看| 欧美国产精品一区二区| 亚洲天堂av一区二区| 欧美日韩精选| 久久综合一区二区三区| av在线一区不卡| 久热爱精品视频线路一| 人妻与黑人一区二区三区| 欧美色播在线播放| 99热6这里只有精品| 国产99久久久久| 日本成人在线免费视频| 99久久国产综合精品成人影院| 亚洲a中文字幕| 蜜桃视频m3u8在线观看| 视频在线观看99| 国产综合视频在线| 欧美性xxxxxx少妇| 久草视频中文在线| 国产免费观看久久| 亚洲欧美日韩中文字幕在线观看| 香蕉久久夜色精品| 色乱码一区二区三区熟女| 天堂成人娱乐在线视频免费播放网站| 视频在线观看一区| 国产a级全部精品| 51xtv成人影院| 亚洲人线精品午夜| av在线免费在线观看| 天天色综合天天| 国产美女福利视频| 久久只精品国产| 老女人性生活视频| 奇米888四色在线精品| 国产无限制自拍| 色综合蜜月久久综合网| 乱一区二区三区在线播放| **日韩最新| 国产成人精品免费视频| 欧美xxxx性xxxxx高清| 色哟哟网站入口亚洲精品| 日韩一级免费视频| 91精品国产色综合久久| 国产午夜麻豆影院在线观看| 亚洲一区电影777| 国产精品99久久久久久成人| 久久精品亚洲国产奇米99| av免费观看不卡| 国产一区二区免费看| 日日躁夜夜躁aaaabbbb| 国产精品毛片在线| 蜜臀av色欲a片无码精品一区| 午夜精品毛片| 亚洲欧美电影在线观看| 国产精品一区二区av交换| 精品国产二区在线| 91成人短视频| 亚洲自拍小视频| 久久久久久久性潮| 国产精品v片在线观看不卡| 鲁鲁在线中文| 97精品在线视频| wwww亚洲| 久久久久久九九九| 综合操久久久| 99精品国产九九国产精品| 国产精品美乳在线观看| av高清一区| 日本视频久久久| 亚洲欧美韩国| 日韩av免费在线观看| 在线精品亚洲欧美日韩国产| 3344国产精品免费看| 日本在线高清| 欧美中文字幕第一页| 伊人久久精品一区二区三区| 2019中文字幕在线| 26uuu亚洲电影| 日本精品va在线观看| 亚洲欧美电影| 国产精品国语对白| 国产精品亚洲d| 国产人妖伪娘一区91| 欧美a一级片| 亚洲一区二区三区香蕉| 久久精品九色| 国产精品免费视频一区二区| 免费观看成人www动漫视频| 久久天堂国产精品| 国产一区二区精品久| 亚洲.欧美.日本.国产综合在线| 日韩一区二区中文| 国产福利片一区二区| 国产精品videosex极品| 精品丰满人妻无套内射| 国产精品普通话对白| 日本成人中文字幕在线| 捆绑变态av一区二区三区| 在线视频日韩欧美| 成人aaaa免费全部观看| 亚洲第一页av| 国产精品伦一区二区三级视频| 911国产在线| 亚洲国产色一区| 麻豆精品久久久久久久99蜜桃| 欧美日韩午夜影院| www.激情五月| 亚洲免费视频在线观看| 成人午夜在线影视| 91国自产精品中文字幕亚洲| 日韩成人高清| 99在线视频播放| 国产精品午夜一区二区三区| 日本一二三区视频在线| 亚洲人妖在线| 国产3p在线播放| 成人动漫视频在线| 丁香激情五月少妇| 黄网站在线观看| 亚洲片在线观看| 成人av黄色| 日本一本a高清免费不卡| va天堂va亚洲va影视| 国产自产精品| 欧美高清视频在线观看mv| 黄色大片中文字幕| 蜜乳av一区二区| 视频免费在线观看| 国产精品久久毛片a| 中文字幕在线字幕中文| 欧美日韩国产成人在线免费| 视频一区 中文字幕| 最近中文字幕2019免费| 成人免费观看在线观看| 91视频国产精品| 一区三区在线欧| 日韩欧美视频免费在线观看| 视频一区免费在线观看| 国产国语老龄妇女a片| 中文字幕av一区二区三区高 | 日韩一级不卡| 国产欧美一区二| 337p粉嫩大胆色噜噜噜噜亚洲| 国产成人综合在线视频| 欧美在线观看你懂的| 黄色福利在线观看| 久久亚洲电影天堂| 蜜桃精品在线| 九九九九精品| 欧美日本三区| 欧美日韩久久婷婷| 欧美韩日一区二区三区四区| 欧美日韩乱国产| 精品嫩草影院久久| а√天堂官网中文在线| 国产精品精品一区二区三区午夜版 | 99综合视频| 韩国精品一区二区| 欧美一区二区三区日韩| 欧美黑人一区二区| 欧美一级精品在线| 成人性爱视频在线观看| 奇米成人av国产一区二区三区| 香蕉成人app| 日本免费黄色小视频| 日本伊人午夜精品| 加勒比综合在线| 疯狂欧美牲乱大交777| 色欲av永久无码精品无码蜜桃| 欧美巨乳美女视频| 精品国产不卡一区二区| 曰韩不卡视频| 国内欧美视频一区二区| 99热99这里只有精品| 欧美视频一区在线| 国产区av在线| 国产成人精品最新| 国产精品手机在线播放| 在线观看av日韩| 中文乱码免费一区二区| 亚洲天堂自拍偷拍| 久久精品国产一区二区电影| 999精品嫩草久久久久久99| 中文字幕久久综合| 极品美女销魂一区二区三区 | 久久精品亚洲精品国产欧美kt∨| 一二三区免费视频| 在线视频欧美性高潮| 国产精品高潮久久| 黄色网络在线观看| 国产成人在线看| 国产成人无码精品| 亚洲日韩欧美视频一区| 成人亚洲免费| 青青视频免费在线| 99国产精品久| 中文字幕 日韩有码| 久久久精品免费| 99re8这里有精品热视频免费| 亚洲精品无码国产| 2020国产精品| 日韩av电影在线观看| 欧美电影免费| 亚洲区 欧美区| 午夜精品福利一区二区三区av| 三级国产在线观看| 国产精品免费久久久久影院| 国产高清一区| 一级黄色片毛片| 欧洲精品中文字幕| huan性巨大欧美| 精品久久蜜桃| 美女精品自拍一二三四| 免费在线观看一级片| 日韩av影视综合网| 欧美一级做a| 日本午夜激情视频| 国产精品久久久久久久久免费丝袜 | 国产精品分类| 美女又爽又黄视频毛茸茸| 欧美日韩在线播放一区| 免费在线看污片| 手机看片福利永久国产日韩| 国产精品影视天天线| 久久夜色精品国产噜噜亚洲av| 北条麻妃一区二区三区中文字幕| 9l视频自拍九色9l视频成人| 青青青在线视频免费观看| 一区二区成人在线| youjizz在线播放| 国产一区免费在线观看| 精品写真视频在线观看| 久久人妻免费视频|