【整理】informix statistics問題

Description:從生產環境導出的表更新到開發測試環境,導入表時要將測試環境的原數據清空,這裏是單表導入。當informix的數據更新時,若未能及時更新統計信息,當進行查詢時可能會使用不到預定的索引,導致查詢效率低下。更新統計信息:update statistics for table tablename;
給定查詢的不同執行策略可能會有不同的代價,構造具有最小查詢執行代價的查詢執行計劃是數據庫系統的職責。查詢優化是爲了查詢選擇最有效的查詢策略的過程。查詢優化是儘量找出與給定表達式等價的、但是執行效率更高的一個表達式,而且決定執行運算時所採用的具體算法以及將使用的特定索引等。
爲了在諸多查詢策略中作出選擇,數據庫系統的優化器必須估計每個查詢策略的代價,磁盤訪問次數常常是衡量代價的主要標準。在沒有按照某策略執行查詢前,準確計算出該策略的代價是不可能的,所以,優化器要利用數據庫系統中的統計信息,來估計查詢策略的代價。 Informix數據庫系統這些統計信息保存在SYSMASTER數據庫中,如果要維護準確的統計值,那麼每當表數據修改時,相應的統計值也必須更新,這種更新會帶來很大的代價,因此Informix系統不是在每次修改時對統計值更新。因此,用於選擇查詢策略的統計數據不一定完全正確,有時會遇到查詢用不到應該使用的索引,就是統計信息沒有更新的原因。 對Informix數據庫系統,這些統計信息保存在SYSMASTER數據庫中,可以使用UPDATE STATISTICS命令更新。
給定查詢的不同執行策略可能會有不同的代價,構造具有最小查詢執行代價的查詢執行計劃是數據庫系統的職責。查詢優化是爲了查詢選擇最有效的查詢策略的過程。查詢優化是儘量找出與給定表達式等價的、但是執行效率更高的一個表達式,而且決定執行運算時所採用的具體算法以及將使用的特定索引等。  爲了在諸多查詢策略中作出選擇,數據庫系統的優化器必須估計每個查詢策略的代價,磁盤訪問次數常常是衡量代價的主要標準。在沒有按照某策略執行查詢前,準確計算出該策略的代價是不可能的,所以,優化器要利用數據庫系統中的統計信息,來估計查詢策略的代價。Informix數據庫系統這些統計信息保存在 SYSMASTER數據庫中,如果要維護準確的統計值,那麼每當表數據修改時,相應的統計值也必須更新,這種更新會帶來很大的代價,因此Informix 系統不是在每次修改時對統計值更新。因此,用於選擇查詢策略的統計數據不一定完全正確,有時會遇到查詢用不到應該使用的索引,就是統計信息沒有更新的原因。 對Informix數據庫系統,這些統計信息保存在SYSMASTER數據庫中,可以使用UPDATE STATISTICS命令更新。

以下是用於估計代價的信息:

1. 記錄數
2. 表空間的頁數
3. 記錄長度
4. 字段不同值個數
5. 字段值的分佈
6. 索引的層數
7. 索引葉結點數目
8. 索引B+樹的深度
9. 索引是升序還是降序或聚類索引
10. 索引佔用的頁面數目

Informix 數據庫服務器中的優化器爲SQL語句的查詢提供最有效的策略,這就使得你在進行表的連接查詢時不必全面考慮究竟那個表首先搜索,以及究竟需要使用那個索引。
通過執行update statistics命令可以更新系統的統計信息,使得優化器得到當前最新的統計信息。當修改或刪除一個表的相關數據時,系統的統計信息並不自動更新。比如:如果使用delete命令刪除一個數據庫表內的一條記錄,刪除完成後查找systables內關於該表的記錄信息時,將會發現nrows(數據庫表的記錄行數目)並沒有改變。而通過執行update statistics命令,就可以使系統表systables、sysdistrib、syscolumns、sysindexes等表內的信息得到更新。在運行完update statistics後,這時就會發現systables內的nrows字段已得到更新。如果執行update statistics medium(high),在sysdistrib表內還可以得到更新的數據分佈信息。所以,當大量地修改數據庫表後最好執行一下update statistics操作。另外,update statistics將強迫存儲過程的優化(對sysprocpplan更新)。以下是與update statistics 相關的系統表:
1、syscolumns:
描述了數據庫內的每個字段,其中的colmin、colmax存儲了數據庫各表字段的次小及次大值,這些值只有在該字段是索引且運行了Update statistics之後才生效。如對於字段值1、2、3、4、5,則4爲次大值,2爲次小值。
2、sysdistrib:
存儲了數據分佈信息。該表內提供了詳細的表字段的信息用於提供給優化器優化SQL Select語句的執行。當執行update statistics medium(high)之後將往此表存入信息。
執行“dbschema -hd”可以得到指定表或字段的分佈信息

3、sysindexes:

描述了數據庫內的索引信息。對於數據庫內的每個索引對應一條記錄。修改索引之後只有執行Update statistics才能使其改變在該表內得到反映。同時也更新clust的數值,在該表的數據頁數目及數據庫記錄條數之間

4、systables:
通過執行Update statistics可以更新nrows數據

update statistics有以下三種級別:

1、LOW:

缺省爲LOW,此時蒐集了關於column的最少量信息。只有systables、syscolumns、sysindexes內的內容改變,不影響sysdistrib。爲了提高效率,一般對非索引字段執行LOW操作

2、HIGH:

此時構建的分佈信息是準確的,而不是統計意義上的。

因爲耗費時間和佔用CPU 資源,可以只對表或字段執行HIGH操作。對於非常大的表,數據庫服務器將掃描一次每個字段的所有數據。可以配置DBUPSPACE環境變量來決定可以利用的最大的系統磁盤空間

3、MEDIUM:抽樣選取數據分佈信息,故所需時間比HIGH要少什麼時候應該執行update ststistics ?

建議在以下情況,執行update statistics 操作:

對數據做了大量修改,大量是針對數據的分佈而言,若數據分佈沒有明顯的改變則可以不做改變的數據庫表有與之相關的存儲過程,避免在運行時存儲過程重新優化數據庫升級之後完成對索引的轉變4, update ststistics 的方法考慮到速度性能因素,執行update statistics的推薦方法:

對錶執行:update statistics medium for table #### distributions only

對每個索引的首字段執行:update statistics high

對複合索引執行:update statistics low

必要時對非索引字段但在條件中使用到的字段執行Update statistics high操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章