由淺入深講解updatestatistics的級(jí)別

字號(hào):

給定查詢的不同執(zhí)行策略可能會(huì)有不同的代價(jià),構(gòu)造具有最小查詢執(zhí)行代價(jià)的查詢執(zhí)行計(jì)劃是數(shù)據(jù)庫(kù)系統(tǒng)的職責(zé)。查詢優(yōu)化是為了查詢選擇的查詢策略的過(guò)程。查詢優(yōu)化是盡量找出與給定表達(dá)式等價(jià)的、但是執(zhí)行效率更高的一個(gè)表達(dá)式,而且決定執(zhí)行運(yùn)算時(shí)所采用的具體算法以及將使用的特定索引等。
    為了在諸多查詢策略中作出選擇,數(shù)據(jù)庫(kù)系統(tǒng)的優(yōu)化器必須估計(jì)每個(gè)查詢策略的代價(jià),磁盤(pán)訪問(wèn)次數(shù)常常是衡量代價(jià)的主要標(biāo)準(zhǔn)。在沒(méi)有按照某策略執(zhí)行查詢前,準(zhǔn)確計(jì)算出該策略的代價(jià)是不可能的,所以,優(yōu)化器要利用數(shù)據(jù)庫(kù)系統(tǒng)中的統(tǒng)計(jì)信息,來(lái)估計(jì)查詢策略的代價(jià)。Informix數(shù)據(jù)庫(kù)系統(tǒng)這些統(tǒng)計(jì)信息保存在SYSMASTER數(shù)據(jù)庫(kù)中, 如果要維護(hù)準(zhǔn)確的統(tǒng)計(jì)值,那么每當(dāng)表數(shù)據(jù)修改時(shí),相應(yīng)的統(tǒng)計(jì)值也必須更新,這種更新會(huì)帶來(lái)很大的代價(jià),因此Informix系統(tǒng)不是在每次修改時(shí)對(duì)統(tǒng)計(jì)值更新。因此,用于選擇查詢策略的統(tǒng)計(jì)數(shù)據(jù)不一定完全正確,有時(shí)會(huì)遇到查詢用不到應(yīng)該使用的索引,就是統(tǒng)計(jì)信息沒(méi)有更新的原因。 對(duì)Informix數(shù)據(jù)庫(kù)系統(tǒng),這些統(tǒng)計(jì)信息保存在SYSMASTER數(shù)據(jù)庫(kù)中,可以使用UPDATE STATISTICS命令更新。
    以下是用于估計(jì)代價(jià)的信息:
    記錄數(shù)
    表空間的頁(yè)數(shù)
    記錄長(zhǎng)度
    字段不同值個(gè)數(shù)
    字段值的分布
    索引的層數(shù)
    索引葉結(jié)點(diǎn)數(shù)目
    索引B+樹(shù)的深度
    索引是升序還是降序或聚類索引
    索引占用的頁(yè)面數(shù)目
    Informix 數(shù)據(jù)庫(kù)服務(wù)器中的優(yōu)化器為SQL語(yǔ)句的查詢提供的策略,這就使得你在進(jìn)行表的連接查詢時(shí)不必全面考慮究竟那個(gè)表首先搜索,以及究竟需要使用那個(gè)索引。
    通過(guò)執(zhí)行update statistics命令可以更新系統(tǒng)的統(tǒng)計(jì)信息,使得優(yōu)化器得到當(dāng)前最新的統(tǒng)計(jì)信息。
    當(dāng)修改或刪除一個(gè)表的相關(guān)數(shù)據(jù)時(shí),系統(tǒng)的統(tǒng)計(jì)信息并不自動(dòng)更新。比如:如果使用delete命令刪除一個(gè)數(shù)據(jù)庫(kù)表內(nèi)的一條記錄,刪除完成后查找systables內(nèi)關(guān)于該表的記錄信息時(shí),將會(huì)發(fā)現(xiàn)nrows(數(shù)據(jù)庫(kù)表的記錄行數(shù)目)并沒(méi)有改變。而通過(guò)執(zhí)行update statistics命令,就可以使系統(tǒng)表systables、sysditrib、syscolumns、sysindexes等表內(nèi)的信息得到更新。在運(yùn)行完update statistics后,這時(shí)就會(huì)發(fā)現(xiàn)systables內(nèi)的nrows字段已得到更新。如果執(zhí)行update statistics medium(high),在sysdistrib表內(nèi)還可以得到更新的數(shù)據(jù)分布信息。所以,當(dāng)大量地修改數(shù)據(jù)庫(kù)表后執(zhí)行一下update statistics操作。另外,update statistics將強(qiáng)迫存儲(chǔ)過(guò)程的優(yōu)化(對(duì)sysprocpplan更新)。以下是與update statistics 相關(guān)的系統(tǒng)表:
    1、syscolumns:
    描述了數(shù)據(jù)庫(kù)內(nèi)的每個(gè)字段,其中的colmin、colmax存儲(chǔ)了數(shù)據(jù)庫(kù)各表字段的次小及次大值,這些值只有在該字段是索引且運(yùn)行了Update statistics之后才生效。如對(duì)于字段值1、2、3、4、5,則4為次大值,2為次小值。
    2、sysdistrib:
    存儲(chǔ)了數(shù)據(jù)分布信息。該表內(nèi)提供了詳細(xì)的表字段的信息用于提供給優(yōu)化器優(yōu)化SQL Select語(yǔ)句的執(zhí)行。當(dāng)執(zhí)行update statistics medium(high)之后將往此表存入信息。
    執(zhí)行“dbschema -hd”可以得到指定表或字段的分布信息
    3、sysindexes:
    描述了數(shù)據(jù)庫(kù)內(nèi)的索引信息。對(duì)于數(shù)據(jù)庫(kù)內(nèi)的每個(gè)索引對(duì)應(yīng)一條記錄。修改索引之后只有執(zhí)行Update statistics才能使其改變?cè)谠摫韮?nèi)得到反映。同時(shí)也更新clust的數(shù)值,在該表的數(shù)據(jù)頁(yè)數(shù)目及數(shù)據(jù)庫(kù)記錄條數(shù)之間
    4、systables:
    通過(guò)執(zhí)行Update statistics可以更新nrows數(shù)據(jù)
    update statistics有以下三種級(jí)別:
    1、LOW:
    缺省為L(zhǎng)OW,此時(shí)搜集了關(guān)于column的最少量信息。只有systables、syscolumns、sysinexes內(nèi)的內(nèi)容改變,不影響sysdistrib。為了提高效率,一般對(duì)非索引字段執(zhí)行LOW操作
    2、HIGH:
    此時(shí)構(gòu)建的分布信息是準(zhǔn)確的,而不是統(tǒng)計(jì)意義上的。
    因?yàn)楹馁M(fèi)時(shí)間和占用CPU 資源,可以只對(duì)表或字段執(zhí)行HIGH操作。對(duì)于非常大的表,數(shù)據(jù)庫(kù)服務(wù)器將掃描一次每個(gè)字段的所有數(shù)據(jù)。可以配置DBUPSPACE環(huán)境變量來(lái)決定可以利用的的系統(tǒng)磁盤(pán)空間
    3、MEDIUM:
    抽樣選取數(shù)據(jù)分布信息,故所需時(shí)間比HIGH要少
    什么時(shí)候應(yīng)該執(zhí)行update ststistics ?
    建議在以下情況,執(zhí)行update statistics 操作:
    對(duì)數(shù)據(jù)做了大量修改,大量是針對(duì)數(shù)據(jù)的分布而言,若數(shù)據(jù)分布沒(méi)有明顯的改變則可以不做
    改變的數(shù)據(jù)庫(kù)表有與之相關(guān)的存儲(chǔ)過(guò)程,避免在運(yùn)行時(shí)存儲(chǔ)過(guò)程重新優(yōu)化
    數(shù)據(jù)庫(kù)升級(jí)之后完成對(duì)索引的轉(zhuǎn)變
    update ststistics 的方法
    考慮到速度性能因素,執(zhí)行update statistics的推薦方法:
    對(duì)表執(zhí)行:update statistics medium for table #### distributions only
    對(duì)每個(gè)索引的首字段執(zhí)行:update statistics high
    對(duì)復(fù)合索引執(zhí)行:update statistics low
    必要時(shí)對(duì)非索引字段但在條件中使用到的字段執(zhí)行Update statistics high操作