DB2基礎知識四

 

<!--[if !supportLists]-->15.    <!--[endif]-->計算本開發環境中BUFFER的命中率

緩衝池是內存中的一塊存儲區域,用於臨時讀入和更改數據庫頁(包含錶行或索引項)。緩衝池的用途是爲了提高數據庫系統的性能。從內存訪問數據要比從磁盤訪問數據快得多。因此,數據庫管理器需要從磁盤讀取或寫入磁盤的次數越少,性能就越好。對一個或多個緩衝池進行配置之所以是調優的最重要方面,是因爲連接至數據庫的應用程序的大多數數據(不包括大對象和長字段數據)操作都在緩衝池中進行。 缺省情況下,應用程序使用緩衝池 IBMDEFAULTBP,它是在創建數據庫時創建的。當 SYSCAT.BUFFERPOOLS 目錄表中該緩衝池的 NPAGES 值爲 -1 ,DB2 數據庫配置參數 BUFFPAGE 控制着緩衝池的大小。否則會忽略 BUFFPAGE 參數,並且用 NPAGES 參數所指定的頁數創建緩衝池。 建議對於僅使用一個緩衝池的應用程序, NPAGES 更改成 -1,這樣 BUFFPAGE 就可以控制該緩衝池的大小。這使得更新和報告緩衝池大小以及其它 DB2 數據庫配置參數變得更加方便。

<!--[if !supportLists]-->n       <!--[endif]-->查看bufferpools

$ db2 get db cfg for coredb |grep BUFF

Buffer pool size (pages)                     (BUFFPAGE) = 1000

<!--[if !supportLists]-->n       <!--[endif]-->計算命中率:

db2 "update monitor switches using   lock ON sort ON bufferpool ON uow ON   table ON statement ON"

db2 "get snapshot for all bufferpools"
在數據庫快照或緩衝池快照的快照輸出中,查找下列"logical reads""physical reads",這樣就可以計算出緩衝池命中率,它可以幫助調優緩衝池:
緩衝池命中率表明數據庫管理器不需要從磁盤裝入頁(即該頁已經在緩衝池中)就能處理頁請求的時間百分比。緩衝池的命中率越高,使用磁盤 I/O 的頻率就越低。按如下計算緩衝池命中率:
(1 - ((buffer pool data physical reads + buffer pool index physical reads) /
(buffer pool data logical reads + pool index logical reads))
) * 100%
這個計算考慮了緩衝池高速緩存的所有頁(索引和數據)。理想情況下,該比率應當超過 95%,並儘可能接近 100%

$ db2 "get snapshot for all bufferpools"|grep logical

Buffer pool data logical reads             = 200

Buffer pool temporary data logical reads   = 0

Buffer pool index logical reads            = 0

Buffer pool temporary index logical reads = 0

$ db2 "get snapshot for all bufferpools"|grep physical

Buffer pool data physical reads            = 0

Buffer pool temporary data physical reads = 0

Buffer pool index physical reads           = 0

Buffer pool temporary index physical reads = 0

這個計算考慮了緩衝池高速緩存的所有頁(索引和數據)。理想情況下,該比率應當超過 95%,並儘可能接近 100%。要提高緩衝池命中率,請嘗試下面這些方法: 增加緩衝池大小。  
考慮分配多個緩衝池,如果可能的話,爲每個經常被訪問的大表所屬的表空間分配一個緩衝池,爲一組小表分配一個緩衝池,然後嘗試一下使用不同大小的緩衝池以查看哪種組合會提供最佳性能。  
如果已分配的內存不能幫助提高性能,那麼請避免給緩衝池分配過多的內存。應當根據取自測試環境的快照信息來決定緩衝池的大小。
太小的緩衝池會產生過多的、不必要的物理 I/O。太大的緩衝池使系統處在操作系統頁面調度的風險中並消耗不必要的 CPU 週期來管理過度分配的內存。正好合適的緩衝池大小就在"太小""太大"之間的某個平衡點上。適當的大小存在於回報將要開始減少的點上。

<!--[if !supportLists]-->n      <!--[endif]-->修改bufferpools

方法一:

Select npages from syscat.bufferpools

Alter bufferpool ibmdefaultbp immediate size 20000

方法二:

Create bufferpool hisdbbp1 immediate size 2500 pagesize 32k

Alter tablespace syscatspace bufferpool hisdbbp1

<!--[if !supportLists]-->16.    <!--[endif]-->存儲過程的建立及維護

項目組暫時沒有使用DB2存儲過程

<!--[if !supportLists]-->17.    <!--[endif]-->Group BYHAVING命令的使用

GROUP BYSELECT語句的從句,用來指定查詢分組條件,主要用來對查詢的結果進行分組,相同組合的分組條件在結果集中只顯示一行記錄。使用GROUP BY從句時候,通過添加聚合函數(主要有COUNT()SUMMAX()MIN()等)可以使數據聚合。GROUP BY插敘列中使用聚合函數是針對每個分組的。

GROUP BY用來指定分組條件,是一個數學集合的概念,比如針對一列進行分組,則組合分組條件的集合數爲1。如果有兩個分組條件,則組合分組條件的集合數爲2。因此帶有GROUP BY的查詢一般成爲分組查詢,也叫組合查詢。組合記錄的多少取決於組合集合(不包含重複元素)中元素的個數。例如,組合條件爲一列,則查詢結果集記錄條數應該等於這個列所有字段所組成(數學意義上的)集合的元素個數(NULL字段也算一個)。如果有兩個組合列,則記錄數等於實際中存在的兩個列所組合的數目。

      GROUP BY組合列必須出現查詢的SELECT關鍵字後面,相同組合條件的情況下僅僅保留一個。因此,通過SELECT...GROUP BY查詢出的各個列都應該是數目相同,要達到相同的目的,有兩種途徑:一種是將要查詢的字段放到組合條件中,一種是在非組合條件的字段上使用聚合函數,當然也可以在組合列上聚合函數。處子之外,別無它法!如果查詢的各個列結果數目不相等,則結果集會出現不能對齊的錯誤。 因此,將非組合條件的列在不使用聚合函數條件下放到要查詢的列中,這種做法是完全錯誤的。

GROUP BY在做組合查詢的時候,會對NULL的分組單獨形成一行,進行統計。參看上面的SQL

      GROUP BY對組合條件列來說,本身就會自動分組(剔除重複的列),因此在組合條件的列上應用DISTINCT關鍵字是多於的。但是用在非組合條件(都有聚合函數)的列上使用DISTINCT卻不是多餘的。GROUP BY不但可以對列組合,還可以對列的表達式進行組合。

可以在SELECT ... GROUP BY 分組後篩選數據。篩選的關鍵字是HAVINGHAVING的作用和WHERE類似。都是用來過濾查詢的中間記錄。但是,HAVING從句指定的每個列規範必須出現在一個聚合函數內,或者出現在GROUP BY從句命名的列中。與WHERE不同的是:WHERE是在分組前(查詢後)篩選數據;HAVING是在分組後篩選數據

SELECT SUBSTR(A.HYLB_DM,1,2),COUNT(*),SUM(A.ZCZB) FROM DJ_ZT A

GROUP BY SUBSTR(A.HYLB_DM,1,2)

HAVING MAX(YEAR(A.CJRQ))<>2007;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章