WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗嗘慨娑氱磽娴e搫鈻堢紒鐘崇墵瀵顓奸崼顐n€囬梻浣告啞閹歌顫濋妸鈺佺闁靛繒濮Σ鍫熺箾閸℃ê濮囨い搴㈡崌濮婃椽宕ㄦ繝鍌氼潓閻庢鍠栭悥濂哥嵁閺嶎厼绠涙い鏃傚亾閿涘繘姊洪崨濠冨瘷闁告洦鍋呴悾顒勬⒒娴e摜鏋冩い顐㈩樀瀹曞綊宕稿Δ鈧粻鏍煃閸濆嫬鏆婇柛瀣崌瀹曠兘顢橀悙鎰╁灪閵囧嫰濡烽敂鍓х杽濠殿喖锕ら幖顐f櫏闂佹悶鍎滈埀顒勫磻閹炬緞鏃堝川椤撶媴绱遍梻浣筋潐瀹曟﹢顢氳椤㈠﹪姊绘担鍛婂暈婵炶绠撳畷褰掑箥椤斿彞绗夊┑鐐村灟閸ㄦ椽鎮¢弴鐔翠簻闁规澘澧庣粙鑽ょ磼閳ь剟宕橀埞澶哥盎闁硅壈鎻槐鏇熸櫏婵犳鍠栭敃銊モ枍閿濆洤鍨濇繛鍡楃箚閺嬪酣鏌熼鍡楀暙椤ユ劙姊婚崒娆戭槮闁硅姤绮嶉幈銊╂偨缁嬭法顦┑鐐叉閸旀帞鎹㈤崱娑欑厽闁靛繆鎳氶崷顓犵焼閻庯綆鍋佹禍婊堟煛瀹ュ啫濮€濠㈣锕㈤弻娑㈡倷椤忓嫬顫囧┑顔硷攻濡炶棄螞閸愵煁褰掑Χ閸℃瑢濮囬梺鐟板槻閹虫﹢鐛幘璇茬鐎广儱鎷嬪Λ婊堟⒒閸屾瑧顦︽繝鈧柆宥呯?闁靛牆顦埀顒€鍟村畷鍗炩槈濡厧骞堥梻浣告贡閸庛倝銆冮崱娑欏亗闁哄洢鍨洪悡娑㈡煕閵夛絽鍔氬┑锛勫帶闇夋繝濠傚閻鏌曢崶褍顏紒鐘崇洴閺佹劙宕ㄩ鐘垫綁闂傚倷绀侀幖顐e緞閸ヮ剙鐒垫い鎺嗗亾缁剧虎鍙冨鎶藉幢濞戞瑥鈧敻鏌ㄥ┑鍡涱€楀褌鍗抽弻锟犲幢濞嗗繆鏋呴梺鍝勭潤閸曨偒鍤ゅ┑鐐叉閸ㄧ敻宕哄畝鍕拺闂傚牊绋掗ˉ鐐烘偨椤栨稑娴柨婵堝仜閳规垹鈧綆鍋勬禍妤呮煙閼圭増褰х紒鎻掋偢閹粙鎳¢妶鍥╋紳婵炶揪缍€椤曟牕鈻撻弴銏$厱闁靛ǹ鍎虫禒銏°亜椤愩垻绠崇紒杈ㄥ笒铻i悹鍥ф▕閳ь剚鎸剧槐鎾存媴閸︻厸妲堝銈嗗灥閹冲酣鍩㈤幘娲绘晣闁绘劏鏅滈弬鈧俊鐐€栧褰掑几婵犳艾绀傛い鎺戝€荤壕濂告煟濡寧鐝€规洖鐭傞弻鏇㈠幢閺囩媭妲銈庡亝缁诲牓鐛崶銊﹀闁稿繐顦伴悗鍛婄節閻㈤潧啸闁轰礁鎲¢幈銊╊敇閵忕姷锛涢梺瑙勫礃缁夘喛銇愰幒鎾存珳闂佹悶鍎弬鍌炲焵椤掆偓閿曨亪寮婚敓鐘茬劦妞ゆ帊鑳堕々鐑芥倵閿濆骸浜為柛妯挎閳规垿鍩ラ崱妤冧画濡炪倖鍨堕悷鈺佺暦閻㈢鍋撻敐搴″幋闁稿鎸鹃幉鎾礋椤掆偓娴犫晠姊虹粙鎸庡攭缂侇噣绠栭幃姗€宕橀瑙f嫼缂傚倷鐒﹂埣銈夘敂閸曢潧娈ㄩ梺鍓插亝濞叉牠鎮块鈧弻锝夊箛椤旇姤姣勭紒鐐劤閵堟悂寮诲☉姘勃闁绘劦鍓涘▓銈夋煛娴e摜澧﹂柟顔筋殘閹叉挳宕熼鍌ゆО缂傚倷绶¢崰鏍崲濡寧顥ら梺璇查叄濞佳囧箺濠婂吘娑㈩敍閻愬鍘靛銈嗙墪濡梻绮堟担鍦浄妞ゆ洍鍋撻柟顔筋殔閳绘捇宕归鐣屼邯闂備胶绮悧婊堝储瑜旈幃楣冩倻閼恒儱浜楅柟鐓庣摠钃辨い顐㈢Т閳规垿鍩ラ崱妤冧户闁荤姭鍋撻柨鏇炲€归崐鐢碘偓瑙勬礀濞层劎澹曟禒瀣厱閻忕偛澧介幊鍛存煕閺傝法校闁靛洤瀚版俊鎼佸Ψ閿旂粯顥i梻浣风串缁插墽鎹㈤崼銉у祦闁哄秲鍔嶆刊瀛樻叏濠靛棙婀伴柟韫嵆濮婄粯鎷呴搹鐟扮濠碘槅鍋勯崯纾嬫"闂佽宕橀褍效閺屻儲鍊甸柨婵嗛閺嬬喖鏌i幘璺烘瀾濞e洤锕俊鍫曞磼濮橆偄顥氶梻鍌欒兌缁垶銆冮崨顓囨稑螖閸涱厾鍘洪梺鍦亾缁剁偤寮崼婵嗙獩濡炪倖妫侀~澶屸偓姘偢濮婃椽鎳¢妶鍛呫垺绻涢懠顒€鈻堥柛鈹惧亾濡炪倖甯掗崯顖炴偟椤忓牊鐓熼煫鍥э工娴滈箖姊婚崒姘偓椋庣矆娓氣偓楠炴牠顢曢敃鈧粻鐘绘煙闁箑骞楅柛娆忕箻閺岀喓绱掗姀鐘崇亶闂佺ǹ顑傞弲鐘诲蓟閿濆围閹艰揪绱曟禒婊勭箾鐎涙ḿ鐭婄紓宥咃躬瀵鎮㈤崗鐓庘偓缁樹繆椤栨繂浜归柣锝嗘そ濮婃椽宕崟顒€娅ょ紓浣筋嚙閻楀棝锝炶箛鎾佹椽顢旈崪浣诡棃婵犵數鍋為崹鍫曟嚌妤e啨鈧倿宕崟銊︽杸闂佸疇妫勫Λ妤佺濠靛鐓熼柣鏂垮级濞呭﹪鏌曢崱鏇狀槮闁宠閰i獮鎺楀籍閸屾稒绶梻鍌欑閹碱偊宕锕€纾瑰┑鐘崇閸庡﹪鏌涢鐘插姕闁抽攱鍨堕幈銊╂偡閻楀牊鎮欓梺璇茬箰瀵墎鎹㈠☉娆愬闁告劖褰冮顐c亜閳哄啫鍘撮柡灞诲姂瀵挳鎮欏ù瀣壕鐟滅増甯楅崑鍌炴煛閸ャ儱鐏柣鎾崇箰閳规垿鎮欓懠顑胯檸闂佸憡鏌i崐婵嬪蓟濞戙垹鐓涢悗锝庡墰钃辨俊鐐€戦崝濠囧磿閻㈢ǹ绠栨繛鍡樻尭缁狙囨煙鐎涙ḿ绠ユ繛鍏肩娣囧﹪濡堕崶顬儵鏌涚€n剙浠遍柡浣稿暣婵偓闁靛牆鍟犻崑鎾存媴缁洘鐎婚梺鍦亾濞兼瑥鈻撻幇鐗堚拺闁告劕寮堕幆鍫熴亜閹存繃鍠橀柣娑卞櫍婵偓闁靛牆妫岄幏濠氭⒑缁嬫寧婀伴柣鐕傚缁﹪鎮ч崼娑楃盎濡炪倖鍔戦崺鍕i幖浣圭厽闁挎繂鎳庡Σ濠氭懚閿濆鐓犳繛鏉戭儐濞呭洭鏌i幘鎰佸剰妞ゎ亜鍟存俊鍫曞幢濮楀棙鈷栭梻浣芥硶閸犲棝宕曢懠顒傜焿鐎广儱鐗勬禍褰掓煙閻戞ɑ灏甸柛妯兼暬濮婅櫣绱掑Ο铏逛桓闁藉啴浜堕幃妯跨疀閿濆懎绠归梻鍥ь槹缁绘繃绻濋崒姘缂備礁顦遍崕銈夊箞閵婏妇绡€闁告侗鍣禒鈺冪磽娴d粙鍝洪悽顖涘笩閻忔帡姊洪幆褏绠婚柍褜鍓氱粙鎺椼€佸鈧濠氬磼濞嗘垵濡介柣搴g懗閸忕姴鎼鍏煎緞婵犲嫭鐓f繝鐢靛仦閸ㄥ墎鍒掓惔銏㈩洸闂侇剙绉甸埛鎺懨归敐鍛暈闁哥喓鍋炵换娑氭嫚瑜忛悾鐢碘偓瑙勬礀缂嶅﹪寮婚崱妤婂悑闁告侗鍨伴獮鍫ユ⒒娴d警鏀伴柟娲讳邯濮婁粙宕熼娑樹簵濠电偛妫欓幐濠氭偂閻樺磭绠鹃柡澶嬪焾閸庢劖绻涢崨顓熷櫣闂囧鏌eΟ铏癸紞闁活厼锕弻宥囨喆閸曨偆浼岄梺鎼炲姂缁犳牠骞冨▎鎾村癄濠㈣泛顦崹婵嬫⒒閸屾瑦绁版い鏇熺墵瀹曟澘螖閸涱偀鍋撻崘顔煎窛闁哄鍨归崣鈧┑鐘灱閸╂牠宕濋弴鐘典笉闁规儼濮ら悡娆撴煙椤栧棗鑻▓鍫曟偡濠婂嫭绶叉繛灞傚妿濡叉劙骞樼拠鑼紲濠电偛妫欓崹鑲╃玻濡ゅ懏鈷戦柛婵勫劚鏍¢梺缁橆殘婵炩偓闁靛棔绶氬浠嬵敇閻愯尙鐛╅梻浣告贡閳峰牓宕㈡禒瀣柧闁挎繂顦伴埛鎴犵磼鐎n厽纭剁紒鐘冲▕閺屾稑螣閻樺弶鍣烘い鎰矙閺岋綁骞囬鍓х槇缂備浇顕уΛ娆撳Φ閸曨垰鍐€闁靛ě鍛帓闂佹眹鍩勯崹杈╃矙閹烘梹宕叉繛鎴欏灩瀹告繃銇勯幘璺烘瀻闁哄濮撮埞鎴︻敊绾嘲濮涚紓渚囧櫘閸ㄥ爼鐛箛娑樺窛閻庢稒锚娴狀參姊绘笟鍥у伎缂佺姵鍨甸埢鎾斥攽閸垻锛濋梺绋挎湰閻燂妇绮婇悧鍫涗簻闁哄洤妫楀ú銈囧瑜版帗鐓曟い顓熷灥濞呮﹢鏌涢妶鍡樼缂佽鲸鎸婚幏鍛嫻椤栨粎绐楃紓鍌欒濡狙囧磻閹剧粯鈷掑ù锝堫潐閸嬬娀鏌涙惔顔肩仸鐎规洘绻傞濂稿川椤忓懐鈧椽姊洪幖鐐插姶闁告挻宀搁崺娑㈠箣閻樼數锛滈柣搴秵閸嬪嫰顢氬⿰鍕瘈闁逞屽墴楠炲秹顢欓崜褝绱查梺璇插嚱缂嶅棝宕戦崨顓犳殾鐎光偓閳ь剟鍩€椤掑喚娼愭繛鎻掔箻瀹曡绂掔€n亞鐣烘繛瀵稿Т椤戝懎顔忓┑鍡忔斀闁绘ɑ褰冮鈺傤殽閻愭惌娈滄慨濠冩そ閹兘寮堕幐搴♀偓顖炴⒑娴兼瑧绉靛ù婊庝簻閻i鎲撮崟顓犵槇濠殿喗锕╅崜娑㈠储閹扮増鈷戦柛婵嗗閸屻劑鏌涢妸锔姐仢闁诡噯绻濇俊鐑芥晜閽樺浼庢繝纰樻閸ㄤ即鎮樺┑瀣亗闁规壆澧楅悡鐔兼煙閹规劖纭鹃柡瀣洴閺岋綁骞欓崘銊ゅ枈閻庤娲栭悥鍏间繆閻戣棄唯闁靛鍎涢幋鐘电=闁稿本鐟чˇ锔姐亜閹存繄澧曢柣锝囧厴閹粙宕归顐g稐闂備礁婀遍崕銈咁潖閼姐倕顥氶柛蹇涙?缁诲棙銇勯弽銊х畵濞存粌缍婇弻锝夋晲閸噥浠╃紓浣介哺閹稿骞忛崨瀛樻優闁荤喐澹嗛鑲╃磽閸屾瑦绁版い鏇嗗洦鍋嬮柛鈩冪⊕閸嬧晝鈧懓瀚伴崑濠傖缚閵娾晜鐓冪憸婊堝礈濮橆厾鈹嶅┑鐘插亞濞兼壆鈧厜鍋撳┑鐘插敪閵娧呯=闁稿本鐟︾粊鏉款渻閺夋垶鎲搁柟骞垮灲瀹曠厧鈹戦幇顓犵▉缂傚倸鍊烽悞锕佹懌婵犳鍨伴顓犳閹烘垟妲堟慨妤€妫楅崜鏉库攽閻愯尙澧涢柛鏃€鐟ラ~蹇撁洪鍕啇闂佺粯鍔栬ぐ鍐€栭崱娑欌拺闁告稑饪村▓鏃堟煕閻旈攱鍋ラ柟顕€绠栭幃婊呯驳鐎n偅娅栭梻浣虹帛閸旀ḿ浜稿▎鎰垫闁搞儺鍓氶埛鎴︽煟閻旂厧浜伴柛銈囧枎閳规垿顢氶埀顒€岣胯閸┿垽骞樺ǎ顒€浜濋梺鍛婂姀閺備線骞忛搹鍦=闁稿本鐟ч崝宥夋嫅闁秵鐓冮梺鍨儏濞搭噣鏌$仦鐣屝㈤柣锝忕節楠炲秹顢欑亸鏍у緧闂佽瀛╅鏍闯椤曗偓瀹曟垶绻濋崒婊勬闂佸湱鍎ら〃鍡涘磹閻戣姤鍊甸柣銏㈡瑜版帞宓侀柛顐犲劜閳锋帒霉閿濆洦鍤€闁崇粯娲熼弻鈩冪瑹閸パ勭彎閻庤娲橀崹鍧楃嵁濡偐纾兼俊顖滃帶楠炴劙姊绘担鍛婂暈濞撴碍顨婂畷鏉款潩鐠鸿櫣鐤囬梺鍛婁緱閸犳洜鎹㈤崱娑欑厱婵炲棗娴氬Σ绋库攽椤斿吋鍠橀柟钘夌埣閺佹劖寰勭€n亙鍝楁繝鐢靛仦閸ㄥ墎鏁幒鎾存珷闁哄被鍎查悡娑㈡煕鐏炵虎娈斿ù婊堢畺濮婂宕掑顑藉亾閻戣姤鍤勯柛鎾茬閸ㄦ繃銇勯弽顐粶缂佲偓婢舵劖鐓涢柛銉㈡櫅閳ь剨缍侀幃銏ゅ传閵壯呮闂備焦鎮堕崕婊堝礃閳轰礁濮冮梻鍌氬€烽懗鍓佸垝椤栫偛钃熼柕濞炬櫆閸庡秵绻濋棃娑卞剰缂備讲鏅犻弻銈夊箒閹烘垵濮屾繛瀛樼矋缁捇寮婚敓鐘茬闁靛⿵绠戦ˇ鈺侇渻閵堝啫鍔氭い锔炬暬瀵鈽夐姀鐘愁棟闁荤姴娲︾粊鎾磻閹炬枼鏀介悗锝庝簽椤旀垿姊洪崜鎻掍簼婵炲弶锕㈠畷鎰版倻閼恒儳鍘介梺鐟邦嚟閸嬪秶绱撳鑸电厱婵せ鍋撳ù婊嗘硾椤繐煤椤忓嫪绱堕梺鍛婃处閸撴瑩宕戝澶嬧拺闁告稑锕ラ悡銉╂煛閸偄澧寸€殿喗鐓″畷濂稿即閵婏附娅栭梻浣虹帛閸旀洟顢氶銏犲偍闁告鍋愰弨浠嬫煟閹邦剙绾фい銉︾矌缁辨帞绱掑Ο铏诡儌缂備緡鍠氱划顖滄崲濠靛棭娼╂い鎾跺Т楠炴劙姊虹拠鑼闁稿鍠栧鏌ヮ敃閿濆棙鐝¢梻浣筋嚙濮橈箓锝炴径濞掓椽鏁冮崒姘憋紱婵犵數濮撮崐濠氬汲閿曞倹鐓熼柡鍐ㄥ€甸幏锟犳煛娴e憡顥㈤柡灞界Х椤т線鏌涢幘瀵告噰闁糕斂鍨归鍏煎緞鐎n偅鐝抽梻浣规偠閸庮噣寮插┑瀣櫖婵犻潧娲ㄧ粻楣冨级閸繂鈷旂紒瀣吹閹叉悂寮堕崹顔芥缂備礁鍊哥粔褰掑箖濞嗘搩鏁嗛柛灞剧矌濡插洭姊绘笟鈧ḿ褎顨ヨ箛鏇炵筏闁告挆鍕幑闂佺粯鍔﹂崗娆愮濠婂牊鐓欓悗娑欋缚缁犳牜鈧懓鎲$换鍕閹烘鏁婇柛鎾楀啰顐奸梻渚€娼ч悧鐐电礊娴e摜鏆︽慨妞诲亾闁糕晪绻濆畷姗€濡搁妷褜鍚嬮梻鍌氬€峰ù鍥敋瑜忛埀顒佺▓閺呮繄鍒掑▎鎾崇闁瑰濮寸粻鐢告煟閻樺厖鑸柛鏂垮缁嬪顓奸崱妯哄伎濠碉紕鍋犻褎绂嶆ィ鍐┾拺闁告繂瀚~锕傛煕閺傝法鐒搁柛鈹垮劜瀵板嫭绻涢姀銏犳瀾鐎垫澘瀚伴幆鍌炲传閵夘灖鎴︽⒑闂堟稒鎼愰悗姘卞娣囧﹪骞栨担瑙勬珳闂佸憡渚楅崢鑹邦杺闂傚倸鍊峰ù鍥敋閺嶎厼绐楁俊銈呮噺閸嬶繝鏌嶉崫鍕櫡闁逞屽厸缁舵艾顕i鈧畷鐓庘攽閸偅效濠碉紕鍋戦崐鏍箰閼姐倖宕查柛鏇ㄥ幘閻棝鏌涢弴銊ョ仭闁抽攱甯¢弻娑氫沪閸撗勫櫗缂備椒鑳舵晶妤呭Φ閸曨垰鍗抽柣鏂挎惈閳峰矂鎮楃憴鍕;闁告鍟块锝嗙鐎e灚鏅濋梺闈涚墕濞村倸危缁嬪簱鏀介柣妯虹仛閺嗏晛鈹戦鑺ュ唉鐎规洘鍔栫换婵嗩潩椤掍浇绶㈤梻浣瑰濞叉牠宕愯ぐ鎺撳亗婵炲棙鍔戞禍婊堟煛瀹ュ骸浜滃ù鐘崇矊闇夋繝濠傛噹椤g厧菐閸パ嶈含闁瑰磭濮甸敍鎰攽閸℃﹩鍞查梻鍌欑閻ゅ洭锝炴径鎰瀭闁秆勵殔閺勩儵鏌涢弴銊ョ仩缂佲偓閸愵喗鐓忓┑鐐戝啯鍣烽柛瀣р偓鏂ユ斀闁挎稑瀚禍濂告煕婵炲灝鈧繂鐣烽姀掳鍋呴柛鎰╁妿椤ρ冣攽閳藉棗鐏熼悹鈧敃鍌氬惞闁哄洢鍨洪崑锝夋煕閵夛絽濡块柕鍫濈摠娣囧﹪骞撻幒鏂库叺闂佸搫鏈ú婵堢不濞戙垹鍗抽柣鎴濇缂嶅矂姊绘担绋挎毐闁圭⒈鍋婇獮濠呯疀濞戞瑥浜楅棅顐㈡处閹尖晠鎮㈤崱娑欏仯濡わ附瀵ч鐘差熆瑜庡ú鐔煎蓟濞戙垹绫嶉柍褜鍓熼獮鎰板箮閽樺鎽曞┑鐐村灟閸ㄧ懓螞濡崵绠鹃柛鈩冪懃娴滄儳螖閺冨倻纾介柛灞剧懄缁佹澘顪冪€涙ɑ鍊愭鐐村姈缁绘繂顫濋鍌ゅ數闂備礁鎲℃笟妤呭垂閹惰姤鍎楁繛鍡樻尭缁犲綊鎮楀☉娅虫垹浜搁鐏荤懓饪伴崼銏㈡毇闂佸搫鏈粙鎴﹀煘閹达箑绀嬫い鎰╁灩琚橀梻鍌欑劍濡炲潡宕㈡禒瀣濡わ絽鍟粻鐔兼煙闂傚鍔嶉柛瀣儔閺屾盯顢曢敐鍥╃暭闂佽崵鍠嗛崝鎴濐潖濞差亜浼犻柛鏇㈡涧閸擃喚绱撴担钘夌厫鐎光偓缁嬫鍤曞┑鐘崇閸嬪嫰鏌i幘铏崳妞わ富鍙冮幃宄扳堪閸愵亞顔婇梺杞扮贰閸犳牠鍩ユ径鎰潊闁挎稑瀚獮鎰版⒒娴e憡鍟炲〒姘殜瀹曟澘螖閸涱厾锛欓梺瑙勫婢ф鎮″☉銏″€堕柣鎰邦杺閸ゆ瑥鈹戦鐓庘偓鍧楀蓟閻旂⒈鏁婇柛婵嗗閸嬫挸鈹戦崱娆愭闂佸湱鍎ら崹鐔肺i崼鐔稿弿婵°倐鍋撴俊顐f⒒濡叉劙鏁撻敓锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚敐澶婄闁挎繂鎲涢幘缁樼厱濠电姴鍊归崑銉╂煛鐏炶濮傜€殿噮鍣e畷濂告偄閸涘⿴鍞堕梻鍌欒兌鏋い鎴濇楠炴劙宕滆閸ㄦ繃銇勯幘璺轰汗婵℃彃鐗婃穱濠囶敍濮橆厽鍎撶紓浣哄Ь椤曆囧煘閹达附鍊烽柛娆忣槴閺嬫瑦绻涚€涙ḿ鐭嬬紒顔芥崌楠炲啴鍨鹃弬銉︻潔闂侀潧楠忕槐鏇㈠储閸楃偐鏀介柣鎰綑閻忋儳鈧娲﹂崜鐔兼偘椤斿槈鐔沸ч崶锔剧泿闂備礁鎼崐鍦偓绗涘泚澶愬閳╁啫寮挎繝鐢靛Т閹冲繘顢旈悩缁樼厵闁荤喐婢橀顓炩攽閳╁啯鍊愬┑锛勫厴閺佸倿骞嗚缁嬪牓姊婚崒姘偓鐑芥嚄閸洖绠犻柟鎹愵嚙閸氬綊鏌″搴″箹缂佺媭鍨堕弻銊╂偆閸屾稑顏�
开发学院数据库DB2 DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性... 阅读

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

 2008-09-17 16:30:52 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨奸柟鐧哥秮閺岋綁顢橀悙鎼闂侀潧妫欑敮鎺楋綖濠靛鏅查柛娑卞墮椤ユ艾鈹戞幊閸婃鎱ㄩ悜钘夌;婵炴垟鎳為崶顒佸仺缂佸瀵ч悗顒勬⒑閻熸澘鈷旂紒顕呭灦瀹曟垿骞囬悧鍫㈠幍缂傚倷鐒﹂敋缂佹う鍥ㄧ厓鐟滄粓宕滈敃鍌氱煑闁告劦鐓堝ḿ鏍煕濠靛棗鐝旂憸鏂跨暦閹偊妲炬繛瀵稿Т閵堢ǹ顫忛搹瑙勫珰闁肩⒈鍓涢澶愭⒑閻撳海绉虹紒鐘崇墵楠炲啯銈i崘鈺佲偓濠氭煢濡警妲奸柟鑺ユ礋濮婃椽妫冨☉杈€嗘繝纰樷偓铏枠鐎规洏鍨介幃浠嬪川婵炵偓瀚奸梺鑽ゅ枑閻熴儳鈧氨鍏樺畷顖濈疀濞戞瑧鍘遍梺缁樏壕顓熸櫠閻㈠憡鐓忛柛鈩冾殔閳ь剙婀辩紓鎾寸鐎n亜绐涙繝鐢靛Т鐎氼剟鐛崼銉︹拺缁绢厼鎳庨ˉ宥夋煙濞茶绨芥俊鍙夊姍瀵挳鎮㈤崫鍕ㄥ彏闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥囧弲闂侀潧鐗嗗ú鐘诲磻閹炬剚娼╂い鎰╁灩缁侇噣姊虹紒妯圭繁闁革綇缍侀悰顕€骞掗幊铏閸┾偓妞ゆ帒鍊绘稉宥夋煥濠靛棙顥犵紒鈾€鍋撻梻鍌氬€搁悧濠勭矙閹达箑姹叉繛鍡楃贩閻熸壋鍫柛顐犲灮閺嗩偊姊洪崫鍕効缂傚秳鐒﹂幈銊╁焵椤掑嫭鐓冮柟顖滃绾偓绻濋埀顒佹綇閵娧呭骄闂佸搫娲ㄩ崰鎾跺姬閳ь剙鈹戦鏂や緵闁告﹢绠栧畷銏ゆ偨閸涘ň鎷虹紓鍌欑劍閿氬┑顕嗙畵閺屾盯骞橀弶鎴濇懙闂佽鍠楄摫婵炵厧绻樻俊鎼佸Χ閸モ晝鏆伴梻鍌欑濠€杈╁垝椤栨粍鏆滈柣鎰摠濞呯姵绻涢幋鐐寸殤缁炬崘鍋愮槐鎾存媴鐠愵垳绱板┑鐐村絻椤曨參鍩€椤掑喚娼愭繛鍙夌墪閻g兘顢楅崘顏冪胺闂傚倷绀侀幉锟犲礉閺囥垹鐤柣妯款嚙缁€鍫熺節闂堟稓澧涚€规洖寮剁换娑㈠箣閻愩劎绱伴梺鍝勬濡鍩為幋锔藉亹閺夊牜鍋勯崢锟犳⒑鏉炴壆鍔嶉柣妤佺矌濡叉劙骞樼€涙ê顎撴繛瀵稿Т椤戝懘骞楅悽鍛娾拺闁革富鍘介崵鈧┑鐐茬湴閸婃繈骞冩ィ鍐╁€婚柦妯侯槺椤斿﹪姊虹憴鍕剹闁告ü绮欏畷鎾绘偨閸涘ň鎷洪梺鑽ゅ枑濠㈡﹢骞冩笟鈧弻锝夊箳閻愮數鏆ら梺璇″枟椤ㄥ﹪鐛弽銊﹀闁稿繐顦扮€氳棄鈹戦悙鑸靛涧缂佹彃娼″畷鏇㈠Χ婢跺﹤鎯為梺閫炲苯澧存慨濠冩そ楠炴牠鎮欏ù瀣壕闁哄稁鍘介崑瀣煟濡灝鍚圭€规挷绶氶悡顐﹀炊閵娧€濮囬梺鍝勬噺閹倿寮婚妸鈺傚亞闁稿本绋戦锟�濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁樺灴婵$敻宕熼姘鳖啋闂佸憡顨堥崑鐔哥閼测晝纾藉ù锝呮惈椤庡矂鏌涢妸銉у煟鐎殿喛顕ч埥澶愬閻樼數鏉搁梻鍌氬€搁悧濠勭矙閹烘鍊堕柛顐犲劜閸婄敻鏌i悢鍝勵暭闁哥喓鍋熺槐鎺旀嫚閹绘帗娈绘繝纰夌磿閺佽鐣烽悢纰辨晬婵﹢纭搁崯瀣⒑鐠囨煡鍙勬繛浣冲洤绠烘繝濠傜墛閸嬧晛鈹戦崒姘暈闁抽攱鍨归惀顏堫敇閻愭潙顎涘┑鐐插悑閸旀牜鎹㈠☉銏″殤妞ゆ巻鍋撻柡瀣閵囧嫰顢曢姀銏㈩唺缂備浇椴哥敮鎺曠亽闂佸吋绁撮弲婊堝吹瀹€鍕拻濞撴埃鍋撻柍褜鍓涢崑娑㈡嚐椤栨稒娅犳い鏃囧亹閺嗗棝鏌ㄥ┑鍡欏闁告柨鐏氶妵鍕晜閻e苯寮ㄩ梺璇″櫙缁绘繃淇婇懜闈涚窞閻庯綆鍓欑敮楣冩⒒娴gǹ顥忛柛瀣噽閹广垽宕橀鑲╋紱濡炪倕绻愰幊鎰不閸撗€鍋撻悷鏉款棌闁哥姵娲滈懞杈ㄧ節濮橆剛鐣鹃梺缁樻煥閸氬鍩涢幋锔藉€甸柛锔诲幖鏍¢梺闈涙閸熸挳寮婚妶澶婄闁肩⒈鍓欓悡鐔兼倵鐟欏嫭绀冪紒璇茬墦瀵偊宕橀鑲╁姦濡炪倖甯掔€氀囧焵椤掍焦顥堢€规洘锕㈤、娆撳床婢诡垰娲﹂悡鏇㈡煃閳轰礁鏋ゆ繛鍫燂耿閺岋綁鎮㈢粙鍨潚濠殿喖锕ュ浠嬪箖閳╁啯鍎熼柍鈺佸暞閻︼綁姊绘担铏瑰笡闁绘娲熸俊鍓佺矙鐠恒劍娈鹃梺缁樺灦宀h法寮ч埀顒勬⒑閹肩偛鍔€闁告劑鍔庨妶顕€姊婚崒娆戠獢婵炰匠鍕垫闊洦娲橀~鏇㈡煛閸ャ儱鐏╅柛灞诲妽閵囧嫯绠涢幘璺侯杸闂佹娊鏀遍崹鍧楀蓟閻斿吋鍤冮柍杞版缁爼姊洪崨濠冣拹妞ゃ劌锕濠氭晸閻樻彃绐涘銈嗘閺侇喗鎱ㄩ崶鈺冪=濞达絿枪閳ь剙婀遍弫顕€鎮㈡俊鎾虫川閳ь剟娼ч幗婊呭婵傜ǹ绾ч柛顐g☉婵¤偐绱掑Δ浣侯暡缂佺粯鐩幃鈩冩償閿濆浂鍟嬮梻浣虹《閺備線宕滃┑瀣闁告稑鐡ㄩ悡銉╂倵閿濆懐浠涚紓宥嗩殜濮婂宕掑顑藉亾瀹勬噴褰掑炊瑜滃ù鏍煏婵炵偓娅嗛柛濠傛健閺屻劑寮撮悙娴嬪亾閸濄儳涓嶉柡灞诲劜閻撴洟鏌曟径妯烘灈濠⒀屽櫍閺岋紕鈧絺鏅濈粣鏃堟煛瀹€鈧崰鏍х暦濠婂棭妲鹃柣銏╁灡閻╊垶寮婚敓鐘插窛妞ゆ棁妫勯埀顒佸姍閺岋紕浠︾拠鎻掝潎闂佽鍠撻崐婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚敐澶婄闁挎繂鎲涢幘缁樼厱闁靛牆鎳庨顓㈡煛鐏炶鈧繂鐣烽锕€唯闁挎棁濮ら惁搴♀攽閻愬樊鍤熷┑顕€娼ч~婵嬪Ω瑜庨~鏇㈡煙閹规劦鍤欑痪鎯у悑缁绘盯宕卞Ο铏圭懆闂佸憡锕槐鏇犳閹惧鐟归柛銉戝嫮褰梻浣规偠閸斿矂鎮ラ崗闂寸箚闁圭虎鍠栫粈鍐┿亜閺冨倸甯剁紒鎰洴濮婃椽宕崟鍨ч梺鎼炲妼缂嶅﹤鐣烽姀鐘嗘椽顢旈崨顓涘亾閸偒娈介柣鎰皺娴犮垽鏌涢弮鈧喊宥夊Φ閸曨垱鏅滈悹鍥皺娴犳悂鎮楃憴鍕┛缂佺粯绻堥悰顔芥償閵婏箑娈熼梺闈涳紡閸愩劌顩梻鍌氬€搁オ鎾磻閸曨個娲晝閳ь剛鍙呴梺鍝勭Р閸斿孩鏅堕敓鐘斥拻闁稿本鐟︾粊鐗堛亜閺囧棗鎳夐崑鎾诲垂椤愩垺璇為悗瑙勬礃缁捇骞冮姀锛勯檮濠㈣泛顑囩粙渚€姊绘担鐟板姢缂佺粯鍔曢敃銏℃綇閳轰緡妫滈梺绋跨箻濡法鎹㈤崱妯镐簻闁哄秲鍔庨。鏌ユ煙椤栨氨澧涢柕鍥у椤㈡洟濮€閵忋垹濮辨繝娈垮枛閿曘劌鈻嶉敐澶婄闁绘ḿ绮崵鎴炪亜閹烘垵浜為柛鐐额潐缁绘繂鈻撻崹顔界亶闁煎灕鍥ㄧ厱闁哄啠鍋撻柛銊ョ仢閻e嘲煤椤忓嫮鍔﹀銈嗗笂闂勫秵绂嶅⿰鍫熺厵闁告繂瀚倴濡炪倧璁g粻鎾诲蓟濞戙垹围閹肩补鈧枼鎷梻浣告惈閺堫剟鎯勯鐐靛祦婵☆垰鍚嬪畷澶愭煟閹寸偍缂氶柍褜鍓濋褔鈥旈崘顔嘉ч幖绮光偓鑼泿缂傚倷鑳剁划顖炲礉濡ゅ懎鐭楅柛娑卞弾濞撳鏌曢崼婵囧櫧缂佺姳鍗抽幃妤€顫濋悡搴♀拫闂佽鍠楅〃濠囥€佸鈧幃婊堝幢濡櫣妲i梻鍌欑窔濞佳囨偋閸℃あ娑樷枎閹寸姷鐒奸梺閫炲苯澧存慨濠冩そ閹兘寮堕幐搴㈢槪闂傚倷绀佹惔婊呭緤娴犲鍋╃€瑰嫭澹嬮崼顏堟煕閺囥劌浜介柛銈冨€濋弻锝嗘償閵忊懇濮囬柤瑁ゅ€濋弻鐔兼煥鐎n偁浠㈠┑顔硷功缁垳绮悢鐓庣倞鐟滃瞼鑺辨禒瀣拺缂佸顑欓崕鎰版煟閳哄﹤鐏︽鐐诧躬閹垻鍠婃潏銊︽珫婵犵數鍋為崹鍫曟偡閿曞倹鍋熺€瑰嫰鍋婂〒濠氭煏閸繃顥為柣鎾卞劚椤儻顦撮柡鍜佸亝缁旂喖寮撮姀鈥充簵闁瑰吋鎯岄崰姘跺船閻㈠憡鐓熼柣妯煎劋椤忕娀鎮樿箛瀣鐎规洘绻堥幃銏ゆ惞閸︻叏绱插┑鐘灱濞夋稓鈧稈鏅犻、鏃堟偐缂佹ḿ鍘撻悷婊勭矒瀹曟粌顫濇0婵囨櫓闂佸搫绋侀崢鑲╃玻濡ゅ懏鐓涚€广儱楠搁獮鎰版煃瑜滈崜銊х不閹捐钃熼柕濞р偓閸嬫捇鏁愰崒娑欑彇缂備胶濮甸懝楣冨煘閹达富鏁婇柣锝呯灱閻g敻姊哄ú璇插箹闁绘妫楀畵鍕⒑缂佹ê鐏卞┑顔哄€濋崺娑㈠箣閻樼數锛滈柣搴秵閸嬫帡宕曢妷鈺傜厱閹兼番鍨规慨宥夋煛瀹€鈧崰鏍箖閻戣姤鍋嬮柛顐ゅ枑閸婄兘姊洪幑鎰惞闁稿鍊濆璇测槈閵忕姷鐤€闂佸疇妗ㄧ粈浣告暜濠电姷顣介崜婵娿亹閸愵喗鍋嬪┑鐘插瀹曞弶绻涢幋娆忕仼妤犵偑鍨烘穱濠囧Χ閸涱厽娈跺銈嗘煥椤︻垶鍩為幋锔藉€烽柤纰卞墮椤も偓闂備焦瀵уú蹇涘垂瑜版帪缍栭煫鍥ㄦ礈绾惧吋淇婇婵愬殭妞ゅ孩鎸绘穱濠囨倷瀹割喖鍓扮紓浣靛姀閸嬫劙骞夋导鏉戝耿婵炲棙鍨归敍婵嬫⒑缁嬫寧婀版慨妯稿姀閳敻姊绘担鍛靛綊顢栭崱娑樼闁煎鍊栧畷鍙夌箾閹寸偛鐒归柛瀣尭閳藉鈻庣€n剛绐楅梻浣规た閸樺綊宕愬┑瀣摕婵炴垯鍨圭粻濠氭偣閾忕懓鍔嬮柣蹇撶墦閹鎲撮崟顒傤槰濠碉紕鍋樼划娆忕暦濞差亜鐒垫い鎺嶉檷娴滄粓鏌熼崫鍕ф俊鎯у槻闇夋繝濠傚閻帡鏌″畝鈧崰鏍箖濠婂吘鐔兼惞闁稒妯婇梻鍌欑窔閳ь剛鍋涢懟顖涙櫠椤斿墽纾界€广儱鎷戝銉︺亜閺囶亞绉鐐叉捣缁數鈧綆鍋呭▍宀勬⒒娴e憡鍟炴繛璇х畵瀹曟粌鈽夐姀鐘插亶闂備緡鍓欑粔鐢告偂閻旂厧绠归柟纰卞幖閻忥絿绱掓径鎰锭闂囧绻濇繝鍌涘櫣闁告ɑ鎸抽弻锝夊箼閸愩劌鈷嬪銈冨灪椤ㄥ﹤鐣烽幒鎳虫棃鍩€椤掍胶顩插Δ锝呭暞閸嬧剝绻涢崱妤冪妞ゅ浚浜為惀顏堝箚瑜滈悡濂告煛鐏炲墽鈽夐摶鏍煃瑜滈崜鐔风暦椤栫偛閿ゆ俊銈咃攻閺咁亪姊洪幐搴g畵妞わ富鍨虫竟鏇°亹閹烘挾鍘介梺鍝勬处濮樸劑宕濆澶嬵棄閻庯綆鍠楅埛鎺楁煕鐏炲墽鎳呮い锔肩畵閺岀喓鍠婇崡鐐扮盎闁捐崵鍋ら幃妤呮濞戞瑦鍠愭繛鎴炴尭缁夊綊寮婚悢鐓庣闁逛即娼у▓顓㈡⒑閽樺鏆熼柛鐘崇墵瀵寮撮悢铏诡啎闂佺粯鍔﹂崜姘舵偟閺囥垺鈷戠紒瀣儥閸庡繑淇婇锝囩疄鐎殿喛顕ч埥澶婎潩椤愶絽濯伴梻浣告啞閹稿棝鍩€椤掆偓鍗遍柛顐g箥濞撳鏌曢崼婵囧殗闁绘稒绮撻弻鐔煎礄閵堝棗顏�
核心提示: 和其他数据库一样,DB2® V8 XML Extender 提供了两种针对 XML 的存储和访问模型:XML 文档可作为未解析文本完整地存储在 CLOB 列中,DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比,也可以被映射和分解到一套关系表中,这两种选择都有一些已知的性能

和其他数据库一样,DB2® V8 XML Extender 提供了两种针对 XML 的存储和访问模型:XML 文档可作为未解析文本完整地存储在 CLOB 列中,也可以被映射和分解到一套关系表中。这两种选择都有一些已知的性能限制。DB2® 9 中新的 pureXML™ 技术试图通过以其固有的层次格式存储和查询 XML 的方式来消除这些限制。本文描述了一系列度量方法,这些方法用于确定 pureXML 是否能够提供性能优势,并量化 pureXML 和 CLOB 或分解式存储之间的性能差异。

简介

DB2® 9 中的 pureXML™ 技术旨在为 XML 数据管理提供最高级别的性能。本文比较了 pureXML™ 技术与字符型大对象 (CLOB) 和分解式 XML 存储的性能。许多数据库系统允许将 XML 数据存储为 CLOB 格式,或将数据“分解”到关系表中。DB2® V8 也支持这两种选择(通过 XML Extender),DB2 9 中仍然提供了 XML Extender,来实现向后兼容性。然而,它们将被 pureXML 特性所取代。

DB2 XML Extender 包括一套存储过程、用户定义的函数 (UDF),以及用户定义的数据类型 (UDT)(这些类型将 XML 功能添加到核心 DB2 引擎之上)。XML Extender 的过程和 UDF 中配有 XML 解析器和特定于 XML 的逻辑,因而能够执行由传统 DB2 引擎特性支持的 XML 存储和检索。您能够使用 XML Extender 的 XML Extender Column 或 XML Extender Collection 特性。

XML Extender Column 允许将 XML 文档完整地存储为未解析的纯文本。此过程非常简单,但是忽略了 XML 文档的内部结构。您可选择将 CLOB 列、VARCHAR 列或文件系统内的文件用作基础存储。在 VARCHAR 列中,XML Extender 仅能存储最大 3KB 的文档 —— 许多应用程序很难保证满足此限制。高水平的数据库管理员 (DBA) 能够将此限制提高到 32k,但是通常情况下即使是这个最大值,应用程序也无法保证能够满足。外部文件存储更为灵活,但是无法从数据库管理的持久性和完整性中获益。这就是 CLOB(能够存储最大 2GB 的文档)成为 XML Extender Column 的最常用选择的原因。本文将在后面探究 XML Extender CLOB 列的性能。

XML Extender Collection 允许将 XML 数据转换为关系格式。这需要从预期的 XML 结构到数据库模式中的关系表集合的固定映射。基于此映射,存储过程从 XML 文档中提取原子数据值,并将其插入到传统关系行和列中。此过程称为分解("shredding" 或 decomposition)。它涉及 XML 解析,并将单一逻辑 XML 文档插入翻译为一系列 SQL 行插入。在实际应用程序中,它能够轻松使用数十个关系表来代表原始 XML 结构中的全部一对多关系。因此,映射很快就变得复杂起来,XML 插入性能也相应受到影响。一旦使用关系格式的数据可用,纯 SQL 就可用于数据访问和操作。然而,原始 XML 文档的重构也非常昂贵。它需要以多路方式加入和生成合适的 XML 标签。这些标签可由标准化的 SQL/XML 发布函数 定义,来重构原始文档或新的不同文档。但是,XML Extender Collection 无法保留原始 XML 文档的任何数字签名。

以关系格式提供 XML 数据仍然是一个重要的需求。最常见的原因是需要向仅使用关系数据的遗留 SQL 应用程序、打包业务应用程序和商业智能 (BI) 工具馈送数据。因此,DB2 9 提供了新的 “分解” 解决方案,这种解决方案也称为 “注释模式分解” 或“新分解”,这种解决方案的速度是 XML Extender Collection 分解速度的 7 到 8 倍。本文将在后面比较这种新的高速分解方案和 IBM DB2 9 中的 IBM pureXML™ 支持的性能。

DB2 9 中的 新 pureXML 技术 和 CLOB 或分解式 XML 存储有非常大的区别。它不将文档存储为纯文本,也不将 XML 映射到关系或对象关系表。相反,它使用其固有的层次格式(这种格式匹配 XML 数据模型)存储 XML。每个 XML 文档均是定义良好的元素和属性树,并使用树遍历来表示 XML 查询。因此,对应的层次存储和处理格式会让 XML 数据管理更为有效,这一点很自然。为了详细解释此观点,本文将比较 DB2 9 中的 pureXML 和基于 CLOB 和分解式 XML 处理的性能。

测试设置

表 1 总结了本文进行的比较。本文对比了 CLOB 和分解式存储的关键 XML 操作与对应的 pureXML 操作。

表 1:比较 CLOB 和分解式 XML 处理与 pureXML

CLOB 中的 XML DB2 9 pureXML
将 XML 插入到 XML Extender CLOB 列将 XML 插入到 XML 列
对 CLOB 进行完整的文档检索对 XML 列进行完整的文档检索
在 CLOB 中使用 XML Extender “提取”功能查询 XML(在查询时解析 XML)对 XML 列进行 XQuery 操作
分解到关系表的 XML DB2 9 pureXML
使用 DB2 9 的新分解特性,将 XML 分解到关系表将 XML 插入到 XML 列
发布 SQL/XML,从关系数据构建 XML 文档

(例如之前分解的 XML)

对 XML 列进行 XQuery 操作

全部测试均使用以下数据和设置执行:

一个安装了 IBM® AIX® 5.2 (64位) 和单一 DB2 9 实例的 4-CPU pSeries 系统

使用了 1,000 到 100,000 个 CustAcc 文档(4kb 到 20kb 大小),这些文档来自文章 “DB2 9 XML 性能特征” 中的金融场景

页面大小为 32kb 的数据库管理的 (DMS) 表空间

全部表空间均使用 no file system caching 选项定义,除非另外声明(用于某些 CLOB 存储测试)

全部表空间分布在 10 个物理磁盘上,数据库日志位于独立的等量列中

全部测试均使用了相同的数据库配置和调优,来确保性能比较的公平性和有效性

比较 CLOB 和 pureXML 列

这种比较是很有趣的,因为对于当今相当多的 XML 应用程序来说,CLOB 列是 XML 存储最常用的选择。在 DB2 9 出现之前,没有更好的备选方案。CLOB 存储和 pureXML 处理之间的基本区别在于 XML 解析及其对插入和查询性能的巨大影响。

如果 XML 文档被插入到 CLOB 列中,那么它们就是作为未解析文本对象插入的。避免在插入时进行 XML 解析对性能有益,对于 CPU-bound 型系统尤其如此。然而,如果不进行 XML 解析,XML 文档的结构会被完全忽略。因此数据库无法对存储的文本对象执行智能和有效的搜索和提取操作。惟一的补救方法是,在执行查询时调用 XML 解析器来“搜索” XML 文档,以便找到符合搜索条件的内容。XML 解析巨大的 CPU 占用率通常会导致很低的搜索和提取性能。只有盲目、全面的文档检索(这会再次忽略内部 XML 结构)能够快速从 CLOB 列读取 XML 文档。

DB2 9 中的 pureXML 技术在插入时(而不是查询时)解析 XML 文档。XML 文档以已解析的格式被存储和查询,这在 DB2 9 中使用一种新的数据类型 “XML” 来表示。这种已解析格式使用节点树结构,有别于 XML 文档的文本表示。搜索和提取操作的执行无需进行 XML 解析,这会获得巨大的性能益处,因为 XML 解析开销发生在插入时。类似地,对 XML 列进行文档检索需要串行化,即,将已解析的 XML 格式转换回其原始文本表示。当从 CLOB (在 CLOB 中 XML 本来就是以文本形式存储的)读取完整的 XML 文档时,不存在此开销。

总之,CLOB 存储为插入和全文档检索操作提供了优秀的性能,这通常是以搜索和提取性能下降为代价的。DB2 9 中的 XML 数据类型牺牲了某些插入和检索性能,来获得更高的搜索和提取性能。这是一种合理的折衷方案,因为业务数据的搜索和分析频率要高于插入频率。通常是一次插入、多次搜索。另外,因为 XML 列在缓冲池中缓存而 CLOB 列不是,所以 XML 列的潜在开销通常会增加。

下一节介绍用于量化这些折衷方案的性能度量指标。

比较 CLOB 插入和 XML 插入

在第一个测试中,我们顺序插入 100,000 个具有或不具有索引的文档,像许多 OLTP 应用程序那样在每个文档之后提交。图 1 中的结果显示了 XML 和 CLOB 列插入之间的相对占用时间(越低越好)。将 XML 插入的占用时间用作比较基线 (100%),维护 6 个 XML 索引仅需很小的开销(在我们的场景中是 5%)。

图 1:比较 XML 和 CLOB 列的单用户插入性能

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

向 CLOB 列插入相同的 XML 数据约占用一半的时间(53%)。这是因为避免了 XML 解析和对 XML 数据的进一步处理。简单地说,XML Extender “索引表”对应 CLOB 列,真正的 XML 索引对应 XML 列。在插入时维护索引表需要 XML 解析和额外的关系插入,因为选择的 XML 元素和属性值是分别提取和存储的。因此,插入占用时间至少等于 pureXML 插入的占用时间,在我们的场景中甚至高出了 23%。。

图 1 中的试验对 DB2 表空间使用了 no file system caching 选项。如果您允许 DMS 表空间容器使用文件系统缓冲(图 2),那么 XML 插入性能仅有少量改进,而 CLOB 插入性能却会下降。因为 CLOB 插入使用直接写入的方式,所以无需文件系统缓存,而仅有纯开销。然而,如果不涉及 XML 解析,那么文件系统缓存能够帮助提高对 CLOB 列的读操作。

图 2:文件系统缓存对 XML 和 CLOB 列插入的影响(无索引或索引表)

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

单用户数据库应用程序非常少见,因此考察并发工作负载的性能行为十分重要。我们将插入测试修改为使用 10 个各自具有到数据库的独立连接的并发线程,每个线程连续插入 10,000 个文档。 图 3 显示增加的工作负载密度大大影响了 CLOB 性能。虽然 CLOB 插入的速度在单用户测试中是 XML 插入的两倍(图 1),但是它们在多用户测试中却慢了两倍(207%)。这是因为 CLOB 插入从并行性中的获益不如 XML 列插入多。随着并发程度的提高,XML 列缓冲的插入比 CLOB 的并发直接写入更具伸缩性。

图 3:XML 和 CLOB 列的多用户插入性能比较

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

图 4 表明并发性加速对 XML 列的作用要远远高于对 CLOB 列的作用。将单用户 XML 插入用作 100% 基线,我们的系统和配置允许 10 个并发插入流在 18% 的时间内插入相同的 100,000 个文档,速度快了 5 倍。CLOB 插入无法从并发性中获得相同的益处,是基线的37%,仅是非并发 CLOB 插入的 1.4 倍。

图 4:XML 和 CLOB 列插入的并发加速

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

我们还使用了 1000、5000、10,000 和 50,000 个文档进行了全部这些插入测试。正如所料,CLOB 和 XML 列占用的插入时间和插入的文档数成线性比例。因此为了简便起见,我们省略了相应的图表。

CLOB 和 XML 列的 XML 查询比较

为了评估 XML 和 CLOB 列之间的查询性能差异,本文设计了 5 个查询来涵盖以下常见的搜索和检索情况:

对全部文档进行全文档检索,无谓词

对匹配某个标准的一个文档进行全文档检索(一个谓词)

对匹配某个标准的多个文档进行全文档检索(多个谓词)

对全部文档进行部分检索

对匹配某个标准的全部文档进行部分检索

这些操作使用如下 5 个查询实现:

Q1 (Select*):选择全部 XML 文档(选择 <table>中的全部文档)

Q2 (1Pred1Doc):返回一个给定帐号的客户文档

Q3 (5PredSome):返回全部主要地址在加利福尼亚、拥有美元帐户、尚未达到高级客户级别的女性客户的客户文档

Q4 (PartialAll):返回每个客户的姓名及其帐户的余额总数

Q5 (PartialSome):获取全部在其任意帐户中持有 IBM 股票的客户的主要电子邮件地址

对于 CLOB 来说,这些查询使用具有 XML Extender 提取函数的 SQL 表示。 对于 XML 列来说,这些查询使用 XQuery 表示法。无论 XQueries 是嵌入在 SQL 中还是单独执行,在我们的测试中并没有性能区别。全部查询和某些示例数据在 可下载的 zip 文件 中提供。

图 5 显示了对 pureXML 和 CLOB 进行的全部 5 个测试查询的查询性能(占用时间)。您可看到 pureXML 查询的速度可以很轻松地达到 CLOB 列中的 XML 速度的 20、30 或 40 倍。这些是没有用于表空间的系统文件缓存的默认设置的结果。图 6 包括具有 文件系统缓存的相同结果。文件系统缓存仅对查询 Q1(检索全部文档,无谓词运算)有较大影响。在没有文件系统缓存的情况下,XML 和 CLOB 列的 Q1 执行效果类似,不在缓冲池进行缓冲的 CLOB 列略微落后(10%)。文件系统缓存大大改进了 CLOB 检检索性能(参见 图 6),因此查询 Q1 速度能够达到 XML 列的两倍以上。这是因为从 XML 列读取数据需要串行化或将已解析的 XML 转换回文本格式。在没有文件系统缓存的情况下,XML 列在 DB2 缓冲池进行缓冲而 CLOB 列则不是,从而可降低开销。

图 5:查询性能,无索引,无文件系统缓存

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

对于查询 2 到查询 5,文件系统缓存的影响不大。这些查询通常需要子文档级访问来运算谓词和提取文档片段。这是 pureXML 的真正的妙处所在:XML 以已解析格式存储,因此在查询执行时不需要解析。在我们的测试中,这会获得 7 到 44 倍的性能加速。

图 6:查询性能,无索引,有文件系统缓存

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

XML 列和 CLOB 列之间的查询响应时间差异随着需要解析(针对 CLOB)或遍历(针对 pureXML)的数据量的增加而显著增加,注意到这一点是很重要的。图 7 显示查询响应时间作为表中文档数(范围从 1,000 到 100,000)的函数(不使用索引或索引表)。

图 7:查询 2 的性能作为数据量的函数

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

XML Extender 提供索引表的概念来加速对 XML 文档的搜索,以便避免针对谓词运算的 XML 分析。在插入时,特定元素和属性被提取到关系表。您已经知道这会给 CLOB 插入增加巨大开销,但是这也会使索引表被有效地搜索,并和包含 CLOB 的主表结合。我们的 5 个测试查询中的 3 个(q2、q3 和 q5)包含过滤谓词,这些谓词能够从索引表查找中获益。索引表能够避免许多针对 CLOB 的 XML 解析,这通常能够使 CLOB 查询速度快 100 倍或更多。

在 图 8 中,让我们将其和能够提供类似获益的具有实际 XML 索引的 pureXML 进行比较。图 8 中的全部 6 个示意条都代表不大于一秒的占用时间。而具有索引的 pureXML 的速度是具有索引表的 CLOB 列的速度的 6 到 35 倍。造成这种情况有多种原因。pureXML 索引直接指向具有对应文档的行。在使用索引表的情况下,DB2 首先对索引表执行索引查找,然后将对应的行和包含 CLOB 的主表相结合。查询 Q3 (5PredSome) 具有多个谓词、使用 3 个索引表和主表,因此它需要计算一个 4 路结合。Query Q5 对谓词使用索引表,但是需要提取函数(具有 XML 分析)来检索客户电子邮件地址。

图 8:具有索引 (pureXML) 和索引表 (CLOB) 的谓词运算

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

图 8 说明,即使索引表能够降低必须解析的 CLOB 数,DB2 9 中的 XML 索引也能够类似地降低必须针对谓词运算进行遍历的文档数。因此,使用索引和索引表通常能够缩短 XML 和 CLOB 的绝对占用时间,但是不会消除 XML 相对 CLOB 列较大的相对性能优势。

对 CLOB 和 XML 使用 10 个用户进行多用户查询测试。因为 CLOB 和 pureXML 存储之间的相对性能差异类似于上述单用户测试,所以这里省略了测试结果。

比较分解式存储和 XML 列

将 XML 数据分解到关系表仍然是常见的一种需求。一个典型原因是现有应用程序可能还不能理解 XML,因而需要关系格式的数据。这包括遗留 SQL 应用程序、打包业务应用程序以及 BI 和报告工具。DB2 9 中的注释 XML 模式分解(“新分解”)解决了较老的 XML Extender 分解的功能和性能限制。下一节比较了新的 DB2 9 分解性能和 DB2 9 中的 pureXML 技术。

对这些测试使用了和之前测试相同的客户数据。因为存在各种重复的元素,所以需要 12 个表中共 87 个列来代表传统关系模式中的 XML 数据。此模式如 图 9 所示,图 9 指示了在分解了 100,000 个客户文档之后,每个表中的列数和行数。总之,这些表包含 350 万个关系行,来代表这 100,000 个 XML 文档。图 9 中的箭头指示一对多关系。全部主键和外键均定义了索引,来支持 12 个表之间有效的结合。

图 9:使用关系模式持有分解式 XML 数据

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

比较分解方法和具有 pureXML 插入的关系表

使用此关系模式(具有DB2 9 中新的注释模式分解)分解 100,000 个文档的速度比将相同的 XML 文档插入 XML 列慢了 1.75 倍(参见 图 10)。此操作在每个文档之后执行,这是 OLTP 应用程序的典型操作。

图 10:比较 pureXML 插入和 DB2 9 分解(在每个文档之后执行)

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

如果降低执行的频率,就能提高 XML 列相当于分解的性能优势。每隔一个文档执行可使 XML 插入比分解快 2.56 倍(在我们的场景和配置中)。对于大量的插入或导入操作来说,如果每隔 50 或 100 个文档执行一次,可使 XML 列插入比分解快 4 到 5 倍(参见 图 11)。XML 列插入能够从较大的间隔中获得比分解(每个日志 I/O 请求有更多的日志页面)更多的益处。

图 11:比较 pureXML 插入和 DB2 9 分解(不同的执行间隔)

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

在执行间隔为 50 的情况下,图 12 比较了 DB2 9 中新的注释模式分解与 V8 中的 XML Extender 分解和 pureXML 插入。在我们的测试中,新的分解比 XML Extender 分解快 7 倍,pureXML 插入甚至比 V8 分解快 30 倍。

图 12:比较 DB2 V8 XML Extender 分解和 DB2 9 技术(执行间隔 = 50)

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

比较分解数据上和 pureXML 列上的 XML 查询

假设您需要为面向 XML 的应用程序和 web 服务(需要 XML 格式的查询结果)提供服务。如果 XML 数据被分解到关系表,那么关系查询结果必须被转换回 XML。为了实现此目的,可在 SQL 查询的 SELECT 从句中使用 SQL/XML 发布函数来构建结果集所需的 XML 标签。

图 9 中定义了关系模式的 5 个 SQL 查询,它们逻辑上等效于 XML 列的 5 个 XQueries。这些 SQL 查查询使用传统关系谓词,结合一些或全部表,并使用 SQL/XML 发布函数来返回和 XQueries 相同的 XML 结果。图 13 中显示了相关的性能结果。

Query Q2 (1Pred1Doc) 基于一个帐号查找仅返回一个文档。在两种情况下(pureXML 和发布)都具有帐号的索引来改进查询性能。虽然 SQL/XML 查询速度很快,但是仍然比 XML 列的 XQuery 慢 75 倍。这是因为 XQuery 仅需通过索引定位文档然后串行化文档,而 SQL/XML 发布必须结合全部 12 个关系表并构建 XML 文档。

Queries Q1 (Select*) 和 Q3 (5PredSome) 返回许多文档,因此增加了从关系数据构建 SQL/XML 文档的成本。Query Q4 (PartialAll) 从每个 XML 文档读取几个值,并根据这些值构建全新的文档。当使用 pureXML 存储上的 XQuery 时,值从 XML 列中读取,构建使用 XQuery 来完成。当使用分解式数据的 SQL/XML 发布时,值从关系列中读取,构建使用 SQL/XML 来完成。两种情况下的瓶颈都是构建操作。这就是两种版本的 Q4 执行结果类似的原因。

图 13:比较 pureXML XQuery 和分解式数据的 SQL/XML 发布

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

Q5 (PartialSome) 使用多个谓词来返回仅具有一个元素的少量 XML 文档。在这种情况下,使用 SQL/XML 的成本不太高,因为它仅针对每个结果行构建一个因素,仅结合 12 个表中的 3个。因为关系数据搜索从某种程度上比 XML 数据搜索速度快,所以其性能比分解式数据好(在我们的设置中比 XQuery 速度快 20 倍)。

结束语

虽然对于单用户工作负载来说,CLOB 插入的速度可能快于 pureXML 插入的速度,但是典型业务场景下的密集并发插入可使 CLOB 插入速度比插入到 XML 列的速度慢 2 或 2.5 倍。如果在每个文档后执行插入操作,那么 pureXML 插入速度约比 DB2 9 中的新分解解决方案快 60% 到 70%。 对于执行频率低的大量插入或导入来说,pureXML 获取 XML 数据的速度比分解甚至快了 4 到 5 倍。这些测试使用了 DB2 9 中的新分解解决方案,此解决方案的速度比 V8 中的 XML Extender 分解速度快了 7 到 8 倍。

XML 类型列中 XML 数据的 XQuery 速度比 CLOB 的对应查询(需要在查询时进行 XML 解析)速度快了 40 倍。“pureXML 查询”和“CLOB 查询”之间的绝对性能差异,随查询数据量的增加而(线性)增加。

分解式数据的 pureXML XQuery 和 SQL/XML Publishing 之间的相对性能差异主要取决于需要标记为 XML 的关系数据量,以及所需要的连接(JOIN)操作数。当必须检索复杂的数据时,XQuery 明显优于发布查询。在我们的一些测试中,从 DB2 pureXML 存储检索 XML 数据能够比从关系表中构建 XML 数据快 50 到 100 倍。然而,无需复杂结合的简单搜索查询(返回的结果带有少量或没有 XML 标签)在 SQL 中速度更快。应用程序仍然需要在查询性能和插入性能之间权衡,并评估两者的混合使用。图 14 中总结了 XML 插入的性能。

图 14:XML 插入性能总结 (commitcount =1)

DB2 9 pureXML 与 CLOB 或分解式 XML 存储之间的性能对比

请注意:本文中的全部性能结果都是在隔离的实验室环境(具有特定硬件、操作和数据库配置)下获得的。在不同的环境下进行的不同测试所获得的结果可能和本文获得的结果有或多或少的性能差异。

虽然我们的全部测量仅使用了 DB2,但是许多与 CLOB 和分解式 XML 存储有关的性能问题,是其各自的一般概念(将 XML 存储为文本或将其转换为关系数据模型)所固有的。因此,您可在支持这些概念的其他 DBMS 环境下发现类似的性能特征。对此类问题感兴趣的读者可以在自己的环境下探索此类问题,并可将本文中的材料用作开发自己的测试的基础。

Tags:DB pureXML CLOB

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接