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 中列组统计信息 阅读

理解 DB2 中列组统计信息

 2007-08-09 16:23:07 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨奸柟鐧哥秮閺岋綁顢橀悙鎼闂侀潧妫欑敮鎺楋綖濠靛鏅查柛娑卞墮椤ユ艾鈹戞幊閸婃鎱ㄩ悜钘夌;婵炴垟鎳為崶顒佸仺缂佸瀵ч悗顒勬⒑閻熸澘鈷旂紒顕呭灦瀹曟垿骞囬悧鍫㈠幍缂傚倷鐒﹂敋缂佹う鍥ㄧ厓鐟滄粓宕滈敃鍌氱煑闁告劦鐓堝ḿ鏍煕濠靛棗鐝旂憸鏂跨暦閹偊妲炬繛瀵稿Т閵堢ǹ顫忛搹瑙勫珰闁肩⒈鍓涢澶愭⒑閻撳海绉虹紒鐘崇墵楠炲啯銈i崘鈺佲偓濠氭煢濡警妲奸柟鑺ユ礋濮婃椽妫冨☉杈€嗘繝纰樷偓铏枠鐎规洏鍨介幃浠嬪川婵炵偓瀚奸梺鑽ゅ枑閻熴儳鈧氨鍏樺畷顖濈疀濞戞瑧鍘遍梺缁樏壕顓熸櫠閻㈠憡鐓忛柛鈩冾殔閳ь剙婀辩紓鎾寸鐎n亜绐涙繝鐢靛Т鐎氼剟鐛崼銉︹拺缁绢厼鎳庨ˉ宥夋煙濞茶绨芥俊鍙夊姍瀵挳鎮㈤崫鍕ㄥ彏闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥囧弲闂侀潧鐗嗗ú鐘诲磻閹炬剚娼╂い鎰╁灩缁侇噣姊虹紒妯圭繁闁革綇缍侀悰顕€骞掗幊铏閸┾偓妞ゆ帒鍊绘稉宥夋煥濠靛棙顥犵紒鈾€鍋撻梻鍌氬€搁悧濠勭矙閹达箑姹叉繛鍡楃贩閻熸壋鍫柛顐犲灮閺嗩偊姊洪崫鍕効缂傚秳鐒﹂幈銊╁焵椤掑嫭鐓冮柟顖滃绾偓绻濋埀顒佹綇閵娧呭骄闂佸搫娲ㄩ崰鎾跺姬閳ь剙鈹戦鏂や緵闁告﹢绠栧畷銏ゆ偨閸涘ň鎷虹紓鍌欑劍閿氬┑顕嗙畵閺屾盯骞橀弶鎴濇懙闂佽鍠楄摫婵炵厧绻樻俊鎼佸Χ閸モ晝鏆伴梻鍌欑濠€杈╁垝椤栨粍鏆滈柣鎰摠濞呯姵绻涢幋鐐寸殤缁炬崘鍋愮槐鎾存媴鐠愵垳绱板┑鐐村絻椤曨參鍩€椤掑喚娼愭繛鍙夌墪閻g兘顢楅崘顏冪胺闂傚倷绀侀幉锟犲礉閺囥垹鐤柣妯款嚙缁€鍫熺節闂堟稓澧涚€规洖寮剁换娑㈠箣閻愩劎绱伴梺鍝勬濡鍩為幋锔藉亹閺夊牜鍋勯崢锟犳⒑鏉炴壆鍔嶉柣妤佺矌濡叉劙骞樼€涙ê顎撴繛瀵稿Т椤戝懘骞楅悽鍛娾拺闁革富鍘介崵鈧┑鐐茬湴閸婃繈骞冩ィ鍐╁€婚柦妯侯槺椤斿﹪姊虹憴鍕剹闁告ü绮欏畷鎾绘偨閸涘ň鎷洪梺鑽ゅ枑濠㈡﹢骞冩笟鈧弻锝夊箳閻愮數鏆ら梺璇″枟椤ㄥ﹪鐛弽銊﹀闁稿繐顦扮€氳棄鈹戦悙鑸靛涧缂佹彃娼″畷鏇㈠Χ婢跺﹤鎯為梺閫炲苯澧存慨濠冩そ楠炴牠鎮欏ù瀣壕闁哄稁鍘介崑瀣煟濡灝鍚圭€规挷绶氶悡顐﹀炊閵娧€濮囬梺鍝勬噺閹倿寮婚妸鈺傚亞闁稿本绋戦锟�濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁樺灴婵$敻宕熼姘鳖啋闂佸憡顨堥崑鐔哥閼测晝纾藉ù锝呮惈椤庡矂鏌涢妸銉у煟鐎殿喛顕ч埥澶愬閻樼數鏉搁梻鍌氬€搁悧濠勭矙閹烘鍊堕柛顐犲劜閸婄敻鏌i悢鍝勵暭闁哥喓鍋熺槐鎺旀嫚閹绘帗娈绘繝纰夌磿閺佽鐣烽悢纰辨晬婵﹢纭搁崯瀣⒑鐠囨煡鍙勬繛浣冲洤绠烘繝濠傜墛閸嬧晛鈹戦崒姘暈闁抽攱鍨归惀顏堫敇閻愭潙顎涘┑鐐插悑閸旀牜鎹㈠☉銏″殤妞ゆ巻鍋撻柡瀣閵囧嫰顢曢姀銏㈩唺缂備浇椴哥敮鎺曠亽闂佸吋绁撮弲婊堝吹瀹€鍕拻濞撴埃鍋撻柍褜鍓涢崑娑㈡嚐椤栨稒娅犳い鏃囧亹閺嗗棝鏌ㄥ┑鍡欏闁告柨鐏氶妵鍕晜閻e苯寮ㄩ梺璇″櫙缁绘繃淇婇懜闈涚窞閻庯綆鍓欑敮楣冩⒒娴gǹ顥忛柛瀣噽閹广垽宕橀鑲╋紱濡炪倕绻愰幊鎰不閸撗€鍋撻悷鏉款棌闁哥姵娲滈懞杈ㄧ節濮橆剛鐣鹃梺缁樻煥閸氬鍩涢幋锔藉€甸柛锔诲幖鏍¢梺闈涙閸熸挳寮婚妶澶婄闁肩⒈鍓欓悡鐔兼倵鐟欏嫭绀冪紒璇茬墦瀵偊宕橀鑲╁姦濡炪倖甯掔€氀囧焵椤掍焦顥堢€规洘锕㈤、娆撳床婢诡垰娲﹂悡鏇㈡煃閳轰礁鏋ゆ繛鍫燂耿閺岋綁鎮㈢粙鍨潚濠殿喖锕ュ浠嬪箖閳╁啯鍎熼柍鈺佸暞閻︼綁姊绘担铏瑰笡闁绘娲熸俊鍓佺矙鐠恒劍娈鹃梺缁樺灦宀h法寮ч埀顒勬⒑閹肩偛鍔€闁告劑鍔庨妶顕€姊婚崒娆戠獢婵炰匠鍕垫闊洦娲橀~鏇㈡煛閸ャ儱鐏╅柛灞诲妽閵囧嫯绠涢幘璺侯杸闂佹娊鏀遍崹鍧楀蓟閻斿吋鍤冮柍杞版缁爼姊洪崨濠冣拹妞ゃ劌锕濠氭晸閻樻彃绐涘銈嗘閺侇喗鎱ㄩ崶鈺冪=濞达絿枪閳ь剙婀遍弫顕€鎮㈡俊鎾虫川閳ь剟娼ч幗婊呭婵傜ǹ绾ч柛顐g☉婵¤偐绱掑Δ浣侯暡缂佺粯鐩幃鈩冩償閿濆浂鍟嬮梻浣虹《閺備線宕滃┑瀣闁告稑鐡ㄩ悡銉╂倵閿濆懐浠涚紓宥嗩殜濮婂宕掑顑藉亾瀹勬噴褰掑炊瑜滃ù鏍煏婵炵偓娅嗛柛濠傛健閺屻劑寮撮悙娴嬪亾閸濄儳涓嶉柡灞诲劜閻撴洟鏌曟径妯烘灈濠⒀屽櫍閺岋紕鈧絺鏅濈粣鏃堟煛瀹€鈧崰鏍х暦濠婂棭妲鹃柣銏╁灡閻╊垶寮婚敓鐘插窛妞ゆ棁妫勯埀顒佸姍閺岋紕浠︾拠鎻掝潎闂佽鍠撻崐婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚敐澶婄闁挎繂鎲涢幘缁樼厱闁靛牆鎳庨顓㈡煛鐏炶鈧繂鐣烽锕€唯闁挎棁濮ら惁搴♀攽閻愬樊鍤熷┑顕€娼ч~婵嬪Ω瑜庨~鏇㈡煙閹规劦鍤欑痪鎯у悑缁绘盯宕卞Ο铏圭懆闂佸憡锕槐鏇犳閹惧鐟归柛銉戝嫮褰梻浣规偠閸斿矂鎮ラ崗闂寸箚闁圭虎鍠栫粈鍐┿亜閺冨倸甯剁紒鎰洴濮婃椽宕崟鍨ч梺鎼炲妼缂嶅﹤鐣烽姀鐘嗘椽顢旈崨顓涘亾閸偒娈介柣鎰皺娴犮垽鏌涢弮鈧喊宥夊Φ閸曨垱鏅滈悹鍥皺娴犳悂鎮楃憴鍕┛缂佺粯绻堥悰顔芥償閵婏箑娈熼梺闈涳紡閸愩劌顩梻鍌氬€搁オ鎾磻閸曨個娲晝閳ь剛鍙呴梺鍝勭Р閸斿孩鏅堕敓鐘斥拻闁稿本鐟︾粊鐗堛亜閺囧棗鎳夐崑鎾诲垂椤愩垺璇為悗瑙勬礃缁捇骞冮姀锛勯檮濠㈣泛顑囩粙渚€姊绘担鐟板姢缂佺粯鍔曢敃銏℃綇閳轰緡妫滈梺绋跨箻濡法鎹㈤崱妯镐簻闁哄秲鍔庨。鏌ユ煙椤栨氨澧涢柕鍥у椤㈡洟濮€閳惰¥鍨洪妵鍕敂閸曨偅娈绘繝纰樷偓宕囧煟鐎规洖宕灃闁逞屽墴閿濈偞鎯旈妸锔规嫼闂佸憡绋戦オ鎾倿婵傚憡鐓曢柕澶嬪灥閹冲骸顕i妸銉㈡斀闁绘﹩鍠栭悘杈ㄧ箾婢跺顬奸柣褍鐭傚铏圭磼濡崵鍙嗛梺鍛婅壘椤戝骞冮敓鐘参ㄩ柍鍝勫€搁埀顒傛暬閺屻劌鈹戦崱娑扁偓妤呮煕濡粯灏﹂柡灞剧〒閳ь剨缍嗛崑鍛焊閹殿喚纾肩紓浣贯缚缁犳挻銇勯锝囩疄妞ゃ垺锚閳藉鈻庤箛锝勭椽闂傚倷娴囧畷鐢稿窗閹邦喖鍨濋幖娣灪濞呯姵淇婇妶鍛殲闁哄棙绮撻弻鐔兼倻濡鏆楀銈傛櫆瑜板啴婀侀梺缁樻尭濞寸兘骞楅悩缁樼厽闁规儳鐡ㄧ粈瀣煛瀹€鈧崰鏍嵁閸℃凹妾ㄩ梺鎼炲€楅崰鏍蓟瀹ュ瀵犲鑸瞪戦埢鍫ユ⒑閸濆嫯瀚扮紒澶婂濡叉劙骞掗幊宕囧枛閹筹繝濡堕崨顓熻緢婵犵绱曢崑鎴﹀磹閵堝纾婚柛娑卞灡瀹曟煡鏌涢鐘插姎缂佺姷濮电换婵囩節閸屾稑娅i梺鍝勵儏閻楀﹥绌辨繝鍥舵晬婵犲灚鍔曞▓顓烆渻閵堝懐绠扮紓宥咃工椤繑绻濆顒傦紲濠电偛妫欓崺鍫澪i鈧铏规兜閸滀礁娈濈紓浣介哺濞叉粓宕氶幒鎴旀瀻闁规儳纾娲⒑閹稿孩鐓ラ柟纰卞亝缁傚秵绺介崨濞炬嫼闂佸憡绻傜€氬嘲危瑜版帗鐓曢柕濞у啯鐏堥悗娈垮枟閹倸顕i鈧畷濂告偄閸濆嫬绠伴梻鍌欑閹诧繝宕濊瀵板﹪鎳為妷褜娲搁梺鍛婃寙閸涱垽绱冲┑鐐舵彧缂嶁偓婵炲拑绲块弫顔尖槈濮樿京锛滈柣搴秵閸嬪懐浜搁幍顔剧<闁稿本绋戝ù顕€鏌℃担绋挎殻鐎规洘甯掗~婵嬪箟鐎n剙绨ユ繝鐢靛У椤旀牠宕板Δ鍛櫇闁冲搫鎳庣粈鍫ユ煥閺囩偛鈧綊宕愰悽鍛婄厵闁诡垱婢樿闂佹娊鏀辩敮鎺楁箒闂佹寧绻傞幊蹇涘箟閹间焦鐓ユ繛鎴炨缚鑲栫紓浣介哺鐢繝銆佸璺哄窛妞ゆ挾濮冲鎾翠繆閵堝洤啸闁稿鍋ゅ畷褰掑垂椤旂偓娈鹃梺鍓插亝濞诧箓寮崱娑欑厱閻忕偟鍋撻惃鎴︽煏閸剛鐣垫慨濠呮閹风娀骞撻幒鎴炵槪缂傚倸鍊哥粔鏉懳涘▎鎴犵焿鐎广儱顦崘鈧銈嗘尵閸嬬喖宕Δ浣虹閻庣數枪瀛濆銈嗗灥濡繈骞冮垾鏂ユ瀻闁瑰墽琛ラ幏鍝勵渻閵堝棙灏柛鏂块叄閹箖宕¢悜鍡欏數閻熸粍绮撳畷褰掓焼瀹ュ憘锕傛煕閺囥劌鐏犳俊顐o耿閺屾盯鈥﹂幋婵囩亐闂佺ǹ顑嗛幐楣冨箟閹绢喖绀嬫い鎾寸⊕閺侀潧鈹戦悩鍨毄濠殿喗娼欑叅闁挎洖鍊哥壕褰掓⒑閸噮鍎嶅ù婊勭矒閻擃偊宕堕妸锕€纰嶅銈呯箞閸婃繈寮诲☉姘e亾閿濆骸浜濈€规洖鐬奸埀顒侇問閸犳牠鍩€椤掑倸娅忔俊淇卞妼閳规垿鎮欓幓鎺撳€梺缁橆殕濞茬喖宕洪悙鍝勭闁挎棁妫勬禍褰掓煟鎼粹剝璐″┑顔芥尦钘熸繝闈涱儐閳锋垹绱掔€n厼鍔垫い顐畵閺屾盯寮崸妤€寮板Δ鐘靛仜椤︻垶锝為姀鐘垫殕闁逞屽墴閹潡鍩€椤掆偓閳规垿鎮欓弶鎴犱桓鐎光偓閿濆懏鍋ラ柟顔兼健瀹曘劎鈧稒菤閹锋椽姊洪棃鈺佺槣闁告瑢鍋撳┑锛勫亾閹倿寮诲☉銏″亹闁归鐒﹂悿渚€鎮楀▓鍨灍闁绘搫绻濋悰顕€寮介妸锕€顎撻梺闈╁瘜閸樼厧顕i幎鑺モ拻濞达綀娅g敮娑欑箾閸欏澧电€规洘鍔欏畷鐑筋敇濞戞ü澹曞┑顔结缚閸嬫挾鈧熬鎷�
核心提示:简介DB2 SQL 优化器(后文简称为优化器)可以估计每个备选访问计划的执行成本,并根据其估计结果选择一个最佳访问计划,理解 DB2 中列组统计信息,一个访问计划可以指定用来解析一条 SQL 语句的操作次序, 为正确地确定每种访问计划的成本,而实际上数据是有偏差的,为避免高估本地等式谓词的组合选择性估计值,DB2 优化

简介

DB2 SQL 优化器(后文简称为优化器)可以估计每个备选访问计划的执行成本,并根据其估计结果选择一个最佳访问计划。一个访问计划可以指定用来解析一条 SQL 语句的操作次序。

为正确地确定每种访问计划的成本,DB2 优化器需要准确的基数估计值。基数估计是这样一种过程:在应用了谓词或执行了聚集之后,优化器使用统计信息确定部分查询结果的大小。对于访问计划的每个操作符,优化器将估计该操作符的基数输出。一个或更多谓词的应用可以减少输出流基数。

在计算谓词对于基数估计值的组合过滤效果时,通常会假设这些谓词彼此之间是独立的。然而,这些谓词可以在统计方面彼此关联。单独地处理它们通常会导致优化器低估基数值。而基数值的低估又会导致优化器选择一个次优的访问计划。

对于至少应用了至少两个本地等式谓词的 SQL 语句,优化器将考虑使用多列统计信息来检测统计关联,并更加准确地估计多个谓词组合的过滤效果。同样对于连接两个或更多表的 SQL 语句,以及在一对表间至少使用了两个等式连接谓词的连接,优化器也会使用多列统计信息。

一个本地等式谓词是一个应用于单个表的等式谓词,其描述如下所示:

理解 DB2 中列组统计信息
COLUMN = literal

其中 literal 可以是以下任一内容:

一个常量值;

一个参数标记或一个主变量;

一个专用寄存器(例如,CURRENT DATE)

一个等式连接谓词的描述如下所示,它用于表 1 和表 2 间的连接:

理解 DB2 中列组统计信息
T1.COLUMN = T2.COLUMN

DB2 V8.2 使用下面的多列统计信息:

索引 keycard 统计信息:FIRST2KEYCARD、FIRST3KEYCARD、FIRST4KEYCARD 和 FULLKEYCARD

列组统计信息:列组基数值

这些统计信息描述了包含两个或更多列的列集中不同分组的数量。

在 DB2 V8.2 出现之前,只能使用索引 keycard 统计信息,并且要受下列条件约束:

索引必须是完全限定的。如果键中的所有列都可以被等式谓词 引用(连接谓词或本地谓词,但不是两者的混合),那么这个索引就是完全限定的。

对于连接谓词,索引也必须是惟一的。

在 DB2 V8.2 中,通过考虑到所有索引 keycard 统计信息而不要求索引完全限定,DB2 SQL 优化器进一步扩展了多列统计信息的使用。它还考虑到了用户收集的任何列组统计信息。本文讨论了优化器如何利用这些统计信息,以及用户如何识别要收集的列组统计信息。

多个本地等式谓词的统计相关性

DB2 SQL 优化器试图检测多个本地等式谓词间的统计相关性。

示例 1:假设有一个表 SHOW_LISTINGS,它包含如下列:


表 1. SHOW_LISTINGS 表的描述

列名 描述
SHOW_ID表外键,包含关于各演出清单的信息
CHANNEL_ID表外键,包含关于播放演出的每个频道的信息
STATION_ID表外键,包含和频道相关的每个电视台的信息
CITY_ID表外键,包含关于上演该演出的每个城市的信息
DAY演出播放的日期
TIME演出播放的当天的时间
<other columns>描述了演出清单的其他属性

由于演出只在某个电视台的某个频道播出,在一天的特定时间内,这些列(SHOW_ID,CHANNEL_ID,STATION_ID 和 TIME)彼此之间不是互相独立的。DAY 列独立于 TIME 列,但是它不独立于所有演出清单的 SHOW_ID。

设想一条应用了以下谓词的 SQL 语句:

P1: SHOW_ID = ?
P2: CHANNEL_ID = ?
P3: STATION_ID = ?
P4: TIME = ?

如果存在这样一个索引,其中的键包含谓词 P1-P4 引用的所有列,或者键中的前四列包含所引用的列,优化器将使用 FIRST4KEYCARD 索引统计信息(如果收集了索引统计信息的话),来检测谓词 P1-P4 之间的统计相关性。在应用了这四个谓词之后,优化器将计算一个更准确的基数估计值。例如,下面的任何一个索引可以用来检测这四个谓词间的统计相关性:

IX1 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME)
IX2 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME, CITY_ID)
IX3 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME, DAY, CITY_ID)

优化器使用 IX1 的 FULLKEYCARD 和 FIRST4KEYCARD 统计信息来检测所有四个谓词的相关性。类似地,它也可以使用 IX2 和 IX3 的 FIRST4KEYCARD。

不能使用如下所示的索引:

IX4 ON SHOW_LISTINGS(CITY_ID, SHOW_ID, CHANNEL_ID, STATION_ID, TIME)

由于每个 keycard 统计信息都将包含 CITY_ID 列,因此该列上未定义本地等式谓词。

如果不存在具有所需键的索引,那么可以在 SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME 上收集列组统计信息。优化器使用这些列组统计信息,运用与处理索引的 FIRST4KEYCARD 统计信息相同的方式检测这四个谓词间的统计相关性。

DB2 优化器同样也会考虑具有谓词子集的索引或者列组统计信息。例如,看下面所示的索引:

IX5 ON SHOW_LISTINGS(SHOW_ID, STATION_ID, CITY_ID, CHANNEL_ID)

该索引不能使用 FIRST2KEYCARD 来检测谓词 P1 和 P3 的统计相关性。尽管只是部分纠正了谓词 P1-P4 间的统计相关性,但已足以允许优化器选择一个优秀的查询执行计划。此外,尽管索引 IX5 中的完整键包含 CHANNEL_ID 列,仍然不能使用 FULLKEYCARD 统计信息来检测与 P2 的相关性,因为它包含的 CITY_ID 列没有在谓词中引用。

多个等式连接谓词的统计相关性

DB2 SQL 优化器同样尝试检测两个表中的多个等式连接谓词间的统计相关性。

示例 2:考虑示例 1 中描述的 SHOW_LISTINGS 表,另外,RATINGS 表包含如下列:


表 2. RATINGS 表的描述

列名 描述
SHOW_ID表外键,包含关于各演出清单的信息
CHANNEL_ID表外键,包含关于播放演出的每个频道的信息
STATION_ID表外键,包含和频道相关的每个电视台的信息
CITY_ID表外键,包含关于上演该演出的每个城市的信息
DAY播放演出的日期
TIME播放演出的时间
RATING在一天的某个时间,在特定城市中,某个电视台频道的演出清单的收视率

RATINGS 表包含描述不同城市演出清单的收视率信息,用户可能需要查询 RATINGS 表和 SHOW_LISTINGS 表的连接以检索这两个表的属性。一个查询在该连接上应用的谓词集包含以下内容:

P1: SHOW_LISTINGS.SHOW_ID = RATINGS.SHOW_ID
P2: SHOW_LISTINGS.CHANNEL_ID = RATINGS.CHANNEL_ID
P3: SHOW_LISTINGS.STATION_ID = RATINGS.STATION_ID

P1-P3 这三个谓词可能不是互相独立的;优化器试图使用任何可用的多列统计信息来检测谓词之间的相关性。

优化器只能检测和说明每一对连接表上的多个连接谓词间的统计相关性。例如,如果一条 SQL 语句包含如下谓词:

P1: T1.A = T2.A
P2: T1.B = T2.B
P3: T1.C = T3.C

优化器只尝试检测 P1 和 P2 间的统计相关性,因为它们只应用于相同的两个表的连接,T1 和 T2。P3 应用于 T1 和 T2 的连接;那是一个不同的连接。如果添加了第四个谓词,例如:

P4: T1.D = T2.D

优化器将进一步尝试检测 P3 和 P4 间的统计相关性。

为了说明等式连接谓词间的统计相关性,优化器使用连接所涉及的两表之一的多列统计信息;这个表被视为连接的父表。因此只需要在连接的父表中收集列组统计信息。连接的另一个表被指定为子表。如果父表不能确定,那么优化器就不能使用多列统计信息来检测连接谓词间的统计相关性。

附录 B 提供了优化器如何确定两个连接表中的父表和子表的具体示例和描述。对连接中的父表进行标识,或者判断连接中是否有父表,这对于避免收集无用的列组统计信息是非常有用的。如果尚无合适的索引可用,那么在连接中的每个表上收集列组统计信息即可。

收集多列统计信息

优化器考虑使用所有可用的索引 keycard 统计信息。如果具有统计相关性的谓词所引用的列集中,索引 keycard 统计信息不可用,可以使用 RUNSTATS 命令收集列组统计信息。下面是从 DB2 V82 提取的语法。

注意:对于 DB2 9,请在 Info Center 的 DB2 9 文档中查看语法。.

      >>-RUNSTATS--ON TABLE--table name--+-USE PROFILE------------+--->
                  '-| Statistics Options |-'
      Statistics Options:
                       .-ALLOW WRITE ACCESS-.
      |--+--------------------------+--+--------------------+--------->
        '-| Table Object Options |-' '-ALLOW READ ACCESS--'
      Table Object Options:
      |--+-FOR--| Index Clause |----------------------------------+---|
          '-+-------------------------+--+-----------------------+-'
            '-| Column Stats Clause |-' '-AND--| Index Clause |-'
      Column Stats Clause:
      |--+-ON--| Cols Clause |------------------------------+---------|
          '-+---------------------+--| Distribution Clause |-'
            '-ON--| Cols Clause |-'
      On Cols Clause:
          .-ON ALL COLUMNS-------------------------------------------------.
          |                      .-,-------------.  |
          |                      V        |  |
        |--+-ON--+----------------------+--COLUMNS--(----Column Option-+--)-+--|
          |   '-+-ALL-+--COLUMNS AND-'                   |
          |    '-KEY-'                         |
          '-ON KEY COLUMNS-------------------------------------------------'
      

“ON COLUMNS” 子句允许您指定一个列的列表,为它们收集统计信息。如果您指定了一组列,则会收集该组中惟一值的数量。未列出的列的统计信息非常明确。您可以在 “on-cols-clause” 和 “on-dist-cols-clause” 中使用这个子句。

注意:目前还不支持为一组列收集分布统计信息。

注意:如果启用了 automatic runstats 并使用 RUNSTATS 命令收集了列组统计信息,automatic runstats 将覆盖这些统计信息,并丢弃列组统计信息。

AUTO_RUNSTATS 数据库配置设置表明是否启用了 automatic runstats:

Automatic runstats (AUTO_RUNSTATS)=ON

如果设置为 “ON”,则启用 automatic runstats。

AUTO_RUNSTATS 默认情况下使用 “具有所有分布和示例的详细索引” 的 RUNSTATS 选项。

您可以使用统计信息配置文件来覆盖默认的 RUNSTATS 选项。您可以将希望收集的任意列组统计信息添加到此配置文件中,以避免 automatic runstats 覆盖它们。

“统计信息配置文件” 提供了关于统计信息配置文件的详细资料。

对于数据库分区特性(database partitioning feature,DPF)环境,automatic runstats 总是在目录分区上收集统计信息。如果表不存在于这个目录节点上,将使用表驻留的节点组的第一个分区。

将使用 RUNSTATS 命令的 “ON COLUMNS” 选项收集列组统计信息。例如,使用 SHOW_LISTINGS 表收集 SHOW_LISTINGS.SHOW_ID、SHOW_LISTINGS.CHANNEL_ID 和 SHOW_LISTINGS.STATION_ID 中的列组统计信息,执行如下 RUNSTATS 命令:

        RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON COLUMNS ((SHOW_ID, CHANNEL_ID,
  STATION_ID))
      

如果只在 DAY 列收集列统计信息以及收集 SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME 列的列组统计信息,则执行以下的 RUNSTATS 命令:

        RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON COLUMNS ((SHOW_ID, CHANNEL_ID,
  STATION_ID, TIME), DAY)
      

注意:列统计信息是在列组中列出的所有列上收集的。在上面的命令中,列统计信息同样是在每一个列中收集的(SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME)。

为了收集所有列的统计信息以及在 SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME 中收集列组统计信息,执行下面的 RUNSTATS 命令:

        RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON ALL COLUMNS AND ON COLUMNS
  ((SHOW_ID, CHANNEL_ID, STATION_ID, TIME))
      

要收集多个多列统计信息,可以提供一个组集。下面的 RUNSTATS 命令在组(SHOW_ID、CHANNEL_ID 和 STATION_ID)和组(SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME)中收集多列统计信息,同样也在 DAY 列上收集了列统计信息:

        RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON COLUMNS ((SHOW_ID,
  CHANNEL_ID, STATION_ID), (SHOW_ID, CHANNEL_ID, STATION_ID, TIME), DAY)
      

注意:对于索引统计信息来说,将为索引键的前两个列、前三列和前四列收集多个多列统计信息,而一个列组基数统计信息是为指定的各列组收集的。

确定何时收集列组统计信息

确定何时收集列组统计信息以及要收集哪些列组统计信息是比较困难的。这一节将为您介绍一些方法,帮助您确定何时需要列组统计信息。

本节的示例使用了 SAMPLE 数据库,可以通过执行 “db2sampl” 创建,此数据库使用 db2level:

Informational tokens are "DB2 v8.1.1.120", "s060801", "U808888", and FixPak "13".

示例 3:本地等式谓词

创建了 SAMPLE 数据库后,并没有在表上收集统计信息。首先,需要在 EMPLOYEE 表中收集统计信息:

RUNSTATS ON TABLE SCHEMA_NAME.EMPLOYEE WITH DISTRIBUTION;

考虑 SAMPLE 数据库中 EMPLOYEE 表上的如下查询:

SELECT EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SEX, JOB, SALARY
FROM EMPLOYEE
WHERE JOB='ANALYST';

该查询从 EMPLOYEE 表返回两条记录:

EMPNO FIRSTNME   LASTNAME    WORKDEPT SEX JOB   SALARY  
------ ------------ --------------- -------- --- -------- -----------
000130 DOLORES   QUINTANA    C01   F  ANALYST   23800.00
000140 HEATHER   NICHOLLS    C01   F  ANALYST   28420.00
2 record(s) selected.

看一下为此查询选择的查询执行计划。

为此,使用 EXPLAIN 工具,它要求 EXPLAIN 表存在。

为了创建 EXPLAIN 表,执行以下代码:

db2 -tvf $DB2PATH/misc/EXPLAIN.DDL

创建了 EXPLAIN 表之后,像下面这样对查询进行 EXPLAIN 处理:

SET CURRENT EXPLAIN MODE EXPLAIN;
SELECT EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SEX, JOB, SALARY
FROM EMPLOYEE
WHERE JOB='ANALYST';
SET CURRENT EXPLAIN MODE NO;

使用 db2exfmt 工具查看查询执行计划:
db2exfmt -d <DBNAME> -1 -g -o <FILENAME>

使用您喜爱的文本编辑器,您应看到像下面这样的查询执行计划:

    2
   TBSCAN
   (  2)
   30.8464
    2
    |
    32
TABLE: SKAPOOR
  EMPLOYEE

基数估计值 2 符合实际结果。

为这个查询添加几个冗余的等式谓词 :

SELECT EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SEX, JOB, SALARY
FROM EMPLOYEE
WHERE JOB='ANALYST' AND SEX='F' AND WORKDEPT='C01';

此查询返回和上面相同的结果集。但是看一下 EXPLAIN 工具生成的查询执行计划,基数估计值并不符合实际结果:

  0.0761719
   TBSCAN
   (  2)
   31.4115
    2
    |
    32
TABLE: SKAPOOR
  EMPLOYEE

DB2 优化器假设这三个谓词是彼此独立的,因为不存在相关的索引或列组统计信息。

在 JOB、WORKDEPT 和 SEX 列中收集列组统计信息。

RUNSTATS ON TABLE <SCHEMA_NAME>.EMPLOYEE ON ALL COLUMNS AND COLUMNS
  ((JOB, WORKDEPT, SEX)) WITH DISTRIBUTION;

使用这三个列的列组统计信息,DB2 优化器计算出一个更准确的基数估计值:

   1.77778
   TBSCAN
   (  2)
   31.4214
    2
    |
    32
TABLE: SKAPOOR
  EMPLOYEE

与单一谓词查询计算出的结果不同,所计算出的基数估计值并不是 2,这是因为列组统计信息是一个一致分布统计信息。

示例 4:等式连接谓词

这个示例集中关注表 ORG 和 STAFF 的连接。首先,需要在这两个表上收集统计信息。现在,已经收集好了基本的统计信息。

RUNSTATS ON TABLE <SCHEMA_NAME>.ORG;
RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF;

下面的查询连接 ORG 和 STAFF 表:

SELECT STAFF.NAME, ORG.DEPTNUMB, ORG.DEPTNAME, STAFF.SALARY
FROM ORG, STAFF
WHERE ORG.MANAGER = STAFF.ID AND ORG.DEPTNUMB = STAFF.DEPT
ORDER BY ORG.DEPTNUMB;

这个查询返回 8 个记录:

NAME   DEPTNUMB DEPTNAME    SALARY 
--------- -------- -------------- ---------
Molinare    10 Head Office   22959.20
Hanes      15 New England   20659.80
Sanders     20 Mid Atlantic  18357.50
Marenghi    38 South Atlantic 17506.75
Plotz      42 Great Lakes   18352.80
Fraye      51 Plains     21150.00
Lea       66 Pacific     18555.50
Quill      84 Mountain    19818.00
 8 record(s) selected.

使用 EXPLAIN 工具查看查询执行计划:

        1
       TBSCAN
       (  2)
       33.2225
        2
        |
        1
       SORT 
       (  3)
       33.151
        2
        |
        1
       HSJOIN
       (  4)
       33.0248
        2
     /-----+-----
    35        8
   TBSCAN      TBSCAN
   (  5)      (  6)
   17.2334     15.3736
    1        1
    |        |
    35        8
TABLE: SKAPOOR TABLE: SKAPOOR
   STAFF       ORG

这个示例使用了收集列组统计信息的简单方法。附录 B 包含一些示例,对判定连接中的父表做了进一步的分析。

对 STAFF 表的 ID、DEPT 列和 ORG 表的 MANAGER、DEPTNUMB 列做了连接,所以要在这两组列中收集列组统计信息:

RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF ON ALL COLUMNS AND COLUMNS ((ID, DEPT));
RUNSTATS ON TABLE <SCHEMA_NAME>.ORG ON ALL COLUMNS AND COLUMNS ((MANAGER, DEPTNUMB));

DB2 优化器使用收集到的列组统计信息正确地估计了基数:

        8
       TBSCAN
       (  2)
       33.5658
        2
        |
        8
       SORT 
       (  3)
       33.4243
        2
        |
        8   
       HSJOIN
       (  4)
       33.0363
        2
     /-----+-----
    35        8
   TBSCAN      TBSCAN
   (  5)      (  6)
   17.2334     15.3736
    1        1
    |        |
    35        8
TABLE: SKAPOOR TABLE: SKAPOOR
   STAFF       ORG

示例 5:查看多列统计信息

优化器利用两种类型的多列统计信息:索引 keycard 统计信息和列组统计信息。这个示例提供了查看表中可用多列统计信息的步骤。

选项 1. 使用 db2look 工具

db2look 工具用来生成 DDL 语句,从而重新创建数据库中定义的对象。可以使用 -m 选项来显示为这些对象收集的统计信息。

在 ORG 表中收集列组统计信息和索引统计信息:

CREATE INDEX IX1 ON ORG (DEPTNUMB, DEPTNAME, MANAGER);
RUNSTATS ON TABLE <SCHEMA_NAME>.ORG ON ALL COLUMNS
     AND COLUMNS ((DEPTNUMB, DEPTNAME, MANAGER, DIVISION, LOCATION))
     WITH DISTRIBUTION AND INDEXES ALL;

使用 db2look 工具查看 ORG 表的统计信息:

db2look -d sample -e -a -m -t ORG -o org.ddl

注意:使用 -h 选项查看关于 DB2look 工具的信息。

在 org.ddl 文件中查看输出。它应该包含如下用于列组统计信息的 UPDATE 语句:

UPDATE SYSSTAT.COLGROUPS SET colgroupcard = 8
    WHERE colgroupid IN (SELECT colgroupid
    FROM SYSCAT.COLGROUPCOLS
    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
       AND colname = 'DEPTNUMB' AND oridnal = 1)
    AND colgroupid IN (SELECT colgroupid
    FROM SYSCAT.COLGROUPCOLS
    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
       AND colname = 'DEPTNAME' AND oridnal = 2)
    AND colgroupid IN (SELECT colgroupid
    FROM SYSCAT.COLGROUPCOLS
    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
       AND colname = 'MANAGER' AND oridnal = 3)
    AND colgroupid IN (SELECT colgroupid
    FROM SYSCAT.COLGROUPCOLS
    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
       AND colname = 'DIVISION' AND oridnal = 4)
    AND colgroupid IN (SELECT colgroupid
    FROM SYSCAT.COLGROUPCOLS
    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
       AND colname = 'LOCATION' AND oridnal = 5)
    AND colgroupid NOT IN (SELECT colgroupid
    FROM SYSCAT.COLGROUPCOLS
    WHERE tabschema = 'SKAPOOR '
       AND tabname = 'ORG' AND oridnal = 6) ;

注意:在 V8 FixPak 13 中,列组统计信息添加到了 db2look 工具中。

上面的 update 语句列出了 SYSCAT.COLGROUPCOLS 视图的所有列,以及来自 SYSSTAT.COLGROUPS 的相关多列统计信息,它表示列集中不同组的数量。在这个示例中,以上的语句描述了列集(DEPTNUMB、DEPTNAME、MANAGER、DIVISION 和 LOCATION)具有八个不同的组。

org.ddl 文件也包含如下用于索引统计信息的语句:

UPDATE SYSSTAT.INDEXES
SET NLEAF=1,
  NLEVELS=1,
  FIRSTKEYCARD=8,
  FIRST2KEYCARD=8,
  FIRST3KEYCARD=8,
  FIRST4KEYCARD=-1,
  FULLKEYCARD=8,
  CLUSTERFACTOR=-1.000000,
  CLUSTERRATIO=100,
  SEQUENTIAL_PAGES=0,
  DENSITY=0,
  AVERAGE_SEQUENCE_GAP=0.000000,
  AVERAGE_SEQUENCE_FETCH_GAP=0.000000,
  AVERAGE_SEQUENCE_PAGES=0.000000,
  AVERAGE_SEQUENCE_FETCH_PAGES=0.000000,
  AVERAGE_RANDOM_PAGES=1.000000,
  AVERAGE_RANDOM_FETCH_PAGES=0.000000,
  NUMRIDS=8,
  NUMRIDS_DELETED=0,
  NUM_EMPTY_LEAFS=0
WHERE INDNAME = 'IX1' AND INDSCHEMA = 'SKAPOOR'
   AND TABNAME = 'ORG' AND TABSCHEMA = 'SKAPOOR';

以上的 update 语句描述了下列多列统计信息。FIRST2KEYCARD 统计信息描述了列(DEPTNUMB,DEPTNAME)中不同组的数量,FIRST3KEYCARD 和 FULLKEYCARD 描述了完整列集(DEPTNUMB,DEPTNAME,MANAGER)中不同组的数量。FIRST4KEYCARD 的值为 -1,这是因为索引在该键中只有 3 列。

选项 2. 查询目录表

可以从 DB2 目录表中查询与 DB2look 工具输出中所描述的相同的信息。

如果尚未创建索引,请按选项 1 中的步骤 1 创建索引,在多个表中收集多个列组统计信息:

RUNSTATS ON TABLE <SCHEMA_NAME>.ORG ON ALL COLUMNS
     AND COLUMNS ((DEPTNUMB, DEPTNAME, MANAGER, DIVISION, LOCATION),
     (DEPTNUMB, DEPTNAME), (MANAGER, DIVISION)) WITH DISTRIBUTION AND INDEXES ALL;
RUNSTATS ON TABLE <SCHEMA_NAME>.EMPLOYEE ON ALL COLUMNS
     AND COLUMNS ((EMPNO, WORKDEPT), (EMPNO, WORKDEPT, JOB));

查询目录表来检索列组统计信息。注意下面的查询是一个递归 SQL 语句,它会导致一个可以忽略的 SQL0347W 警告。可以使用 “UPDATE COMMAND OPTIONS USING W OFF” 选项阻止该警告出现。

WITH TMP(ID, NUM) AS
(
  SELECT COLGROUPID, MAX(ORIDNAL)
   FROM SYSCAT.COLGROUPCOLS
  GROUP BY COLGROUPID
),
TMP2 (ID, NAME, NUM, TNAME, TSCHEMA) AS
(
  SELECT ID, CAST(RTRIM(COLNAME) AS CHAR(128)), NUM, TABNAME, TABSCHEMA
   FROM TMP Y, SYSCAT.COLGROUPCOLS X
  WHERE X.COLGROUPID = Y.ID
   AND Y.NUM = X.ORIDNAL
 UNION ALL
  SELECT Y.ID, CAST(RTRIM(X.COLNAME) || ',' || Y.NAME AS CHAR(128)), Y.NUM-1,
     TNAME, TSCHEMA
   FROM TMP2 Y, SYSCAT.COLGROUPCOLS X
  WHERE Y.ID=X.COLGROUPID
   AND X.ORIDNAL=Y.NUM-1
   AND Y.NUM > 1
   AND TNAME = TABNAME
   AND TSCHEMA = TABSCHEMA
)
SELECT SUBSTR(TSCHEMA,1,10) TABSCHEMA, SUBSTR(TNAME,1,10) TABNAME,
  NAME COLS, COLGROUPCARD
FROM TMP2, SYSSTAT.COLGROUPS
WHERE ID = COLGROUPID
AND NUM = 1
ORDER BY TABSCHEMA, TABNAME
;

上面的查询返回如下记录:

注意:TABSCHEMA 列中的值将是不同的。同样,COLS 结果列并强制转换为 CHAR(128),如果结果超过 128 个字符,它会将结果截断。在这个例子中,可能需要将 CAST 修改为一个更大的字符串。

TABSCHEMA TABNAME  COLS                  COLGROUPCARD    
---------- ---------- ------------------------------//------ -----------------
SKAPOOR  EMPLOYEE  EMPNO,WORKDEPT                    32
SKAPOOR  EMPLOYEE  EMPNO,WORKDEPT,JOB                  32
SKAPOOR  ORG    DEPTNUMB,DEPTNAME                   8
SKAPOOR  ORG    MANAGER,DIVISION                    8
SKAPOOR  ORG    DEPTNUMB,DEPTNAME,MANAGER,DIVISION,LOCATION      8
 5 record(s) selected with 1 warning messages suppressed.

这些记录描述了 EMPLOYEE 表的两列组统计信息和 ORG 表的三列组统计信息。

注意:在上面的查询中,注意 SYSCAT.SYSCOLGROUPCOLS 视图中的名为 “ORIDNAL” 的列。在 DB2 9 中,其拼写改为了 “ORDINAL”,所以,这个查询需要按照在 DB2 9 中使用的方法更新,如下所示:

WITH TMP(ID, NUM) AS
(
  SELECT COLGROUPID, MAX(ORDINAL)
   FROM SYSCAT.COLGROUPCOLS
  GROUP BY COLGROUPID
),
TMP2 (ID, NAME, NUM, TNAME, TSCHEMA) AS
(
  SELECT ID, CAST(RTRIM(COLNAME) AS CHAR(128)), NUM, TABNAME, TABSCHEMA
   FROM TMP Y, SYSCAT.COLGROUPCOLS X
  WHERE X.COLGROUPID = Y.ID
   AND Y.NUM = X.ORDINAL
 UNION ALL
  SELECT Y.ID, CAST(RTRIM(X.COLNAME) || ',' || Y.NAME AS CHAR(128)), Y.NUM-1,
     TNAME, TSCHEMA
   FROM TMP2 Y, SYSCAT.COLGROUPCOLS X
  WHERE Y.ID=X.COLGROUPID
   AND X.ORDINAL=Y.NUM-1
   AND Y.NUM > 1
   AND TNAME = TABNAME
   AND TSCHEMA = TABSCHEMA
)
SELECT SUBSTR(TSCHEMA,1,10) TABSCHEMA, SUBSTR(TNAME,1,10) TABNAME, NAME COLS,
   COLGROUPCARD
FROM TMP2, SYSSTAT.COLGROUPS
WHERE ID = COLGROUPID
AND NUM = 1
ORDER BY TABSCHEMA, TABNAME
;

查询目录表以检索索引统计信息。

注意:在 TABSCHEMA='SKAPOOR' 谓词中使用合适的模式名替换所提供的值。

SELECT SUBSTR(COLNAMES, 1, 30) AS COLS, FIRST2KEYCARD, FIRST3KEYCARD,
   FIRST4KEYCARD, FULLKEYCARD
FROM SYSSTAT.INDEXES
WHERE TABSCHEMA='SKAPOOR' AND TABNAME='ORG';

上述查询返回如下记录:

COLS            FIRST2KEYCARD FIRST3KEYCARD FIRST4KEYCARD FULLKEYCARD
-------------------------- ------------- ------------- ------------- -----------
+DEPTNUMB+DEPTNAME+MANAGER       8       8      -1      8
 1 record(s) selected.

FIRST2KEYCARD 统计信息描述了在列(DEPTNUMB 和 DEPTNAME)中不同组的数量,FIRST3KEYCARD 和 FULLKEYCARD 描述了完整列集(DEPTNUMB,DEPTNAME 和 MANAGER)中不同组的数量。FIRST4KEYCARD 值为 -1,这是因为索引在键中只包含三列。

练习

在示例 3 和 4 中,优化器使用了索引统计信息,而没有使用列组统计信息,通过说明统计信息相关性来修正基数估计值。

尝试以下步骤:

创建如下索引:

IXEMP_1 ON EMPLOYEE(JOB, WORKDEPT, SEX);
IXSTAFF_1 ON STAFF(ID, DEPT);
IXORG_1 ON ORG(MANAGER, DEPTNUMB);

对这些索引收集统计信息,但不收集任何列组统计信息:

RUNSTATS ON TABLE <SCHEMA_NAME>.EMPLOYEE AND INDEXES ALL;
RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF AND DETAILED INDEXES ALL;
RUNSTATS ON TABLE <SCHEMA_NAME>.ORG AND INDEXES ALL;

对示例 3 和 4 中的查询进行 EXPLAIN 处理。所得到的基数估计值符合上面的查询执行计划;然而,由于可用索引的不同,实际的计划会有所不同。注意收集的 DETAILED 统计信息并不影响基数估计值。

丢弃步骤 1 中创建的 IXEMP_1 和 IXSTAFF_1 索引,创建两个新的索引:

IXEMP_1 ON EMPLOYEE(JOB, WORKDEPT, SEX, EMPNO);
IXSTAFF_1 ON STAFF(ID, DEPT,NAME,JOB);

重复步骤 2 和步骤 3。其最后的基数估计值是相同的。

附录 A. 自动统计信息分析

RUNSTATS 实用程序提供了一个选项,用它可以注册和使用一个统计信息配置文件。DB2 的自动统计信息分析特性可以自动地生成统计信息配置文件。启用了这个特性后,将会收集有关数据库活动的信息并将其存储在查询反馈仓库中。在这些数据的基础之上,生成一个统计信息配置文件。该特性还会推荐对本地等式谓词使用两列组统计信息。这在测试环境中是一种游泳的工具,可标识有用的列组统计信息。

Info Center 中包含关于使用 自动统计信息分析 的更详细信息。.

注意:统计信息配置文件的自动生成只在 DB2 串行模式中是激活的,在联邦查询、DPF 环境之中以及使用分区内并行性时,该特性是被禁止的。

附录 B. 确定两个连接表中的父表

多个等式谓词的统计相关性 一节中讨论了一种简单方法,通过说明等式连接谓词间的统计相关性而收集多列统计信息,这一节将介绍优化器如何确定两个连接表中的父表(如果有的话)。鉴别优化器是否会检测一个父表,如果会的话,哪一个是父表,这对于了解何时进行列组统计信息的收集才是有效的以及在哪个表上收集是非常有用的。

优化器在一组连接两表的谓词中标识父表,这个表至少是一个连接谓词的父表,而且不是任何其他连接谓词的子表。一个连接谓词的父表被确定为在谓词列中具有较多不同值的表。例如,在 SHOW_LISTINGS.SHOW_ID = RATINGS.SHOW_ID 连接谓词中,如果 SHOW_LISTINGS.SHOW_ID 的 COLCARD 统计信息比 RATINGS.SHOW_ID 的 COLCARD 统计信息多,那么 SHOW_LISTINGS 就是这个连接谓词的父表,RATINGS 则是子表。

此外,优化器还尝试使用范围统计信息(HIGH2KEY 和 LOW2KEY)来验证父表,方法是确保子表中的值集是父表的子集。例如,在连接谓词 SHOW_LISTINGS.SHOW_ID = RATINGS.SHOW_ID 中,如果符合以下条件:

SHOW_LISTINGS.SHOW_ID 的 COLCARD 统计信息多于 RATINGS.SHOW_ID 的统计信息,并且

SHOW_LISTINGS.SHOW_ID 的 HIGH2KEY 多于或等于 RATINGS.SHOW_ID 的 HIGH2KEY,并且

RATINGS.SHOW_ID 的 LOW2KEY 少于或等于 RATINGS.SHOW_ID 的 LOW2KEY

那么 SHOW_LISTINGS 是这个连接谓词的父表,而 RATINGS 则是子表。

示例 B.1

假设以下一组谓词:

P1: SHOW_LISTINGS.SHOW_ID = RATINGS.SHOW_ID
P2: SHOW_LISTINGS.CHANNEL_ID = RATINGS.CHANNEL_ID
P3: SHOW_LISTINGS.STATION_ID = RATINGS.STATION_ID

在 P1 中,假设 COLCARD(SHOW_LISTINGS.SHOW_ID) > COLCARD(RATINGS.SHOW_ID)。

在 P2 中,假设 COLCARD(SHOW_LISTINGS.CHANNEL _ID) > COLCARD(RATINGS.CHANNEL_ID)。

在 P3 中,假设 COLCARD(SHOW_LISTINGS.STATION_ID) > COLCARD(RATINGS.STATION_ID)。

优化器将 SHOW_LISTINGS 表标识为所有三个谓词的父表,所以它同样将 SHOW_LISTINGS 标识为连接的父表。因此优化器使用 SHOW_LISTINGS 表中的列(SHOW_ID,CHANNEL_ID 和 STATION_ID)上可用的多列统计信息。

示例 B.2

使用示例 B.1 中的谓词:

在 P1 中,假设 COLCARD(SHOW_LISTINGS.SHOW_ID) > COLCARD(RATINGS.SHOW_ID)。

在 P2 中,假设 COLCARD(SHOW_LISTINGS.CHANNEL _ID) > COLCARD(RATINGS.CHANNEL_ID)。

在 P3 中,假设 COLCARD(SHOW_LISTINGS.STATION_ID) = COLCARD(RATINGS.STATION_ID)。

优化器在谓词 P1 和 P2 中将 SHOW_LISTINGS 表标识为父表,在谓词 P3 中既不是子表,也不是父表。所以优化器也将 SHOW_LISTINGS 标识为连接的父表。因此,优化器使用 SHOW_LISTINGS 表中的列(SHOW_ID,CHANNEL_ID 和 STATION_ID)上可用的多列统计信息。

示例 B.3

使用示例 B.1 中的谓词:

在 P1 中,假设 COLCARD(SHOW_LISTINGS.SHOW_ID) > COLCARD(RATINGS.SHOW_ID)。

在 P2 中,假设 COLCARD(SHOW_LISTINGS.CHANNEL _ID) < COLCARD(RATINGS.CHANNEL_ID)。

在 P3 中,假设 COLCARD(SHOW_LISTINGS.STATION_ID) = COLCARD(RATINGS.STATION_ID)。

优化器在谓词 P1 中将 SHOW_LISTINGS 表标识为父表,在谓词 P2 中将其标识为子表,在谓词 P3 中既不是子表也不是父表。所以,并不将 SHOW_LISTINGS 标识为连接中的父表(也不将 RATINGS 标识为连接的父表)。因此,优化器并不会检测这三个连接的谓词间的统计相关性。

数据库分区特性

在一个 DPF 环境中,如果表跨多个数据库分区而被分区,在下列条件满足的情况下,只能使用范围统计信息:

两个表在相同的列中被分区

表是并置的,就是说,它们处于同一节点组

连接谓词引用所有的分区键列

在相同的节点收集统计信息

如果不能够使用范围统计信息,那么优化器只能使用 COLCARD 统计信息来确定连接中的父表。在 DPF 环境中,在单个节点中收集统计信息将会导致在 COLCARD 统计信息出现错误。因此,确定父表时,优化器允许 COLCARD 统计信息中存在一些偏差(1%)。然而,这种偏差是以多列统计信息为基础的,因此如果该连接不是中立 的,并且连接中没有很明显的父表,那么在 DPF 中应该使用收集列组统计信息的简单方法。

示例 B.4

1. 确定两个表是否在相同列上被分区

除非两个表的数据分布相同,否则不能使用范围统计信息(HIGH2KEY 和 LOW2KEY)。因此,如果表不是在相同列被分区,优化器将无法推断出数据在两个表中的分布相同。

假设有两个表,T1 和 T2。T1 在多个数据库分区中被分区,在列(C1 和 C2)中具有分区键。同样,T2 也进行了分区,其分区键在列(C2 和 C3)中。

例 1.1 使用下列谓词连接 T1 和 T2:

P1: T1.C1=T2.C2
P2: T1.C2=T2.C3

这两个表被认为是在相同的列进行了分区,因为连接谓词按照与其各自的分区键相同的次序应用于列中。

例 1.2 使用下列谓词:

P1: T1.C1=T2.C3
P2: T1.C2=T2.C2

谓词没有按照与其各自的分区键相同的次序应用于列中,所以这两个表被认为不是在相同列上分区的。

例 1.3 使用下列谓词:

P1: T1.C1=T2.C1
P2: T1.C2=T2.C2
P3: T1.C3=T2.C3

这些表被认为不是在相同列分区的。

例 1.4 来看一下和示例 1.3 使用相同谓词的情形,但是假设 T2 是在列(C1,C2 和 C3)中分区的。

尽管表 T1 是在相同列分区的(T2 分区键的两个主要列),由于 T2 在 C3 中进一步分区,与只在(C1 和 C2)中分区相比,这将导致数据分布不同。因此,这两个表被认为是在不同列进行分区的。

2. 确定这两个表是否是并置的

假设有两个表,T1 和 T2,T1 属于节点组 N0 而 T2 属于节点组 N1,其中 N0 包含分区数 0 和 1 ,N1 包含分区数 1 和 2 。由于这两个表不在同一个节点组,将认为它们不是并置的。

3. 确定连接的谓词是否引用所有的分区键列

假设有两个表,T1 和 T2。T1 在多个数据库分区中被分区,分区键在列(C1 和 C2)。同样,T2 也被分区,分区键在列(C2 和 C3)。

3.1 使用这些谓词来连接 T1 和 T2:

P1: T1.C1=T2.C2
P2: T1.C2=T2.C3

这两个谓词都包含了所有的分区键列。

例 3.2 如果在示例 3.1 谓词中添加第三个谓词 P3,T1.C3=T2.C1,那么这三个谓词合起来仍然包含两个表中的所有分区键列。然而,如果仅使用 P1 和 P3,所有这三个谓词并不包含分区键列。

例 3.3如果在示例 3.1 谓词中添加第三个谓词 P3,T1.C3=T2.C3,那么这三个谓词合起来仍然包含两个表中的所有分区键列。然而,如果只使用P1 和 P3,那么只包含了 T2 的分区键列而没有包含 T1 的,所以条件并不符合。

完全限定的惟一索引

如果在上述条件的基础上,没有一个表被指定为连接的父表,优化器将进一步检查一个完全限定的惟一索引。如果连接谓词完全限定一个惟一索引,优化器使用惟一索引的 FULLKEYCARD 统计信息来检测和说明相等连接谓词之间的统计相关性。

中立连接

如果未在两个表间的任一等式连接谓词中标识出父表,优化器将把这个连接标识为中立(neutral)。如果两个列的 COLCARD 相同,并且它们包含的值的范围也是相同的(HIGH2KEY 和 LOW2KEY 统计信息是等同的),则不对这个等式连接谓词标识父表。

在 DB2 V8 的 FixPaks 13 及更早版本中,如果是一个中立的 NPK 连接,优化器就不会为两个表的连接说明一组等式连接谓词间的统计相关性。在 V8 FixPak 14 和 DB2 9 中,优化器的统计相关性检测得到了扩展,可以对中立的 NPK 连接进行统计相关性说明。

两个表引用相同的基表,这种自连接是中立连接的特例。在 V8.2 中,优化器开始为这种特例说明统计相关性。

示例 B.5:在父表中收集列组统计信息

这个例子主要关注表 ORG 和 STAFF 间的连接。首先,需要为表收集统计信息。现在,已经收集了基本的统计信息:

RUNSTATS ON TABLE <SCHEMA_NAME>.ORG;
RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF;

假设如下查询连接表 ORG 和 STAFF:

SELECT STAFF.NAME, ORG.DEPTNUMB, ORG.DEPTNAME, STAFF.SALARY
FROM ORG, STAFF
WHERE ORG.MANAGER = STAFF.ID AND ORG.DEPTNUMB = STAFF.DEPT
ORDER BY ORG.DEPTNUMB;

这个查询返回 8 个记录:

NAME   DEPTNUMB DEPTNAME    SALARY 
--------- -------- -------------- ---------
Molinare    10 Head Office   22959.20
Hanes      15 New England   20659.80
Sanders     20 Mid Atlantic  18357.50
Marenghi    38 South Atlantic 17506.75
Plotz      42 Great Lakes   18352.80
Fraye      51 Plains     21150.00
Lea       66 Pacific     18555.50
Quill      84 Mountain    19818.00
8 record(s) selected.

1. 使用 EXPLAIN 工具,查看查询执行计划:

        1
       TBSCAN
       (  2)
       33.2225
        2
        |
        1
       SORT 
       (  3)
       33.151
        2
        |
        1
       HSJOIN
       (  4)
       33.0248
        2
     /-----+-----
    35        8
   TBSCAN      TBSCAN
   (  5)      (  6)
   17.2334     15.3736
    1        1
    |        |
    35        8
TABLE: SKAPOOR TABLE: SKAPOOR
   STAFF       ORG
   

2. 查看连接谓词引用的列的列统计信息。如下查询为两个连接谓词中引用的表 ORG 和 STAFF 中的列从 DB2 目录表中检索有趣的列统计信息:

SELECT SUBSTR(COLNAME,1,20) AS COLNAME, COLCARD,
    SUBSTR(HIGH2KEY,1,10) AS HIGH2KEY,
    SUBSTR(LOW2KEY,1,10) AS LOW2KEY
FROM SYSSTAT.COLUMNS
WHERE TABNAME IN ('ORG', 'STAFF')
AND COLNAME IN ('MANAGER', 'DEPTNUMB', 'ID', 'DEPT')
ORDER BY TABNAME, COLNAME;

表 B.5 列统计信息

COLNAME COLCARD HIGH2KEY LOW2KEY
DEPTNUMB86615
MANAGER827030
DEPT86615
ID3534020

3. 计算基数估计值。

等式连接谓词的过滤因子的估计值计算如下:

1/max(colcard_LHS,colcard_RHS).

其中 LHS 在连接谓词的左边,RHS 在连接谓词的右边。本例中有以下两个连接谓词:

P1: org.manager=staff.id
P2: org.deptnumb=staff.dept

以及过滤因子(ff),P1 和 P2 计算如下:

ff(P1) = 1 / max (8,35) = 1/35 = 0.0285714
ff(P2) = 1/max(8,8) = 1/8 = 0.125

使用过滤因子以及两个表的基数估计值,连接基数计算如下:

JoinCard = Cardinality(ORG) * cardinality(STAFF) * ff(P1) * ff(P2)
     = 35 * 8 * 0.0285714 * 0.125
     = 1

4. 在连接中标识父表。

在表 B.5 中,列统计信息显示 STAFF 是连接的父表,因为符合以下条件:

对于谓词 org.manager=staff.id:

colcard(MANAGER) < colcard(ID)
high2key(MANAGER) < high2key(ID)
low2key(MANAGER) > low2key(ID)

因此,这个谓词的父表是 STAFF。

对于谓词 org.deptnumb=staff.dept,colcard、high2key 和 low2key 统计信息是等同的。因此,这个谓词不存在父表,它应被视为“中立”。

5. 在父表中收集列组统计信息。

在步骤 4 中,STAFF 被标识为连接的父表,ORG 被标识为连接的子表,所以应在 STAFF 表的列(ID,DEPT)中收集列组统计信息:

RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF ON ALL COLUMNS AND COLUMNS ((ID,DEPT));

使用这两个列的列组统计信息,DB2 优化器就可以准确地估计出基数:

        8 
       TBSCAN
       (  2)
       33.5658
        2
        |
        8
       SORT 
       (  3)
       33.4243
        2
        |
        8
       HSJOIN
       (  4)
       33.0363
        2
     /-----+-----
    35        8
   TBSCAN      TBSCAN
   (  5)      (  6)
   17.2334     15.3736
    1        1
    |        |
    35        8
TABLE: SKAPOOR TABLE: SKAPOOR
   STAFF       ORG

示例 B.6 中立连接

考虑 T1 和 T2 这两个表的连接,使用以下谓词:

  
P1: T1.C1 = T2.C1
P2: T1.C2 = T2.C2
P3: T1.C3 = T2.C3

假设这两个表具有以下的统计信息:


表 B.6 中立连接统计信息

TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY
T1C1100992T2C1100992
T1C21019991900T2C21019991900
T1C35'Y''B'T2C35'Y''B'

所有的谓词被看作是中立的,这是由于两个表的 stats 是相等的。因此,在 V8 FixPak 14 和 DB2 9 中,应该在任一个表(不要求两个表)的列(C1、C2 和 C3)中收集列组统计信息,这样,优化器就可以检测这些连接谓词的统计相关性。

示例 B.7

使用和示例 B.6 相同的谓词,假设表具有如下统计信息:


表 B.7 确定父表

TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY
T1C1100992T2C110992
T1C21019991900T2C21019991900
T1C35'Y''B'T2C35'Y''B'

在这个场景中,谓词 P2 和 P3 看作是中立的,这是由于两个表的列 C2 和 C3 的统计信息是等同的。然而,C1 的统计信息显示 T1 是 P1 的父表,这是因为 T1.C1 的 COLCARD 比 T2.C1 的 COLCARD 大,并且两个列具有等同的 HIGH2KEY 和 LOW2KEYare 统计信息。因此,应该在 T1 的列(C1、C2 和 C3)中收集列组统计信息,这样,优化器就可以检测连接谓词间的统计相关性。

示例 B.8

使用和示例 B.6 相同的谓词,假设表具有下列统计信息:


表 B.8 统计信息

TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY
T1C1100992T2C1109992
T1C21019991900T2C21019991900
T1C35'Y''B'T2C35'Y''B'

在这个场景中,谓词 P2 和 P3 被表示为中立的,这是由于两个表的 C2 和 C3 列的统计信息是等同的。然而,C1 的统计信息表明 T1 和 T2 都不是父表,它也不是中立的,因为 T1.C1 具有一个更高的 COLCARD 统计信息,而 T2.C1 具有一个更高的统计信息。因此,应该在 T1 或 T2 的列(C2 和 C3)中收集列组统计信息,这样优化器就可以检测连接谓词 P2 和 P3 之间的统计相关性。

示例 B.9 使用 DPF 和范围统计信息

考虑 T1 和 T2 这两个表的连接,它们在多个数据库分区上被分区,并且是并置的,统计信息是在相同的节点手机的,分区键在列(C1 和 C2)上,使用如下谓词进行连接:

  
P1: T1.C1 = T2.C1
P2: T1.C2 = T2.C2
P3: T1.C3 = T2.C3

假设这两个表具有如下统计信息:


表 B.9

TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY
T1C1100992T2C1109992
T1C21019991900T2C21019991900
T1C35'Y''B'T2C35'Y''B'

这个连接限定 DPF 条件,所以优化器可以使用范围统计信息来标识父表。在这个场景中,谓词 P2 和 P3 被表示为中立,这是由于两个表的 C2 和 C3 列的统计信息是等同的。然而,C1 的统计信息表明 T1 和 T2 都不是父表,也不把它看作是中立的,这是因为 T1.C1 具有一个更高的 COLCARD,而 T2.C1 具有一个更高的 HIGH2KEY 统计信息。因此,应该在 T1 或 T2 的列(C2 和 C3)上收集列组统计信息,这样优化器就可以检测连接谓词 P2 和 P3 间的统计相关性。

示例 B.10 无法使用 DPF 和范围统计信息

假设与 B.9 相同的场景,但是 T1 的分区键是在列(C1 和 C2)中,T2 的分区键在列(C2 和 C1)中。这个连接不满足第一个 DPF 条件,因为这两个表被认为不是在相同的列分区的;连接谓词 T1.C1=T2.C1 在 T1 的分区键中引用了第一个列,但在 T2 分区键中引用了第二个列。因此,优化器不能使用范围统计信息来标识父表,而只能使用 COLCARD 统计信息来确定父表。只在 COLCARD 的基础上,连接被认为是中立的。

示例 B.10.1 无法使用 DPF 和范围统计信息

假设与 B.10 相同的场景,但具有下列统计信息:


表 B.10

TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY TABLENAME COLNAME COLCARD HIGH2KEY LOW2KEY
T1C1100992T2C1989992
T1C21019991900T2C21119991900
T1C35'Y''B'T2C35'Y''B'

在 COLCARD 统计信息基础上,T1 是谓词 P1 的父表,而 T2 是谓词 P2 的父表。由于 COLCARD 统计信息被关闭,因此多列统计信息的偏差将降至 1% 以内,这是优化器在 DPF 环境中的容错值。在这里它可以使用简单方法,并且应在两个表的所有三个列中收集列组统计信息。之后,如果优化器没有计算出一个不同的基数估计值,那么说明并未达到 1% 的偏差。

附录 C. 有关本地谓词的更多详细资料

多列统计信息(索引和列组)只提供了一组列中不同组数量的信息。因此,说明统计相关性时,优化器假设数据是一致分布的。然而,本地等式谓词的选择性估计值则使用分布统计信息(如果可用)来计算,从而说明数据中的偏差。由于假设数据是一致的,而实际上数据是有偏差的,为避免高估本地等式谓词的组合选择性估计值,FixPak 10 中将对优化器的统计相关性检测做进一步改善。

Tags:理解 DB 统计

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